009/160 CrackMe Andrénalin #2

Crack

先随便输入点什么试试
在这里插入图片描述
搜索字符串找到注册成功的位置
在这里插入图片描述
向上找到比较函数,跟随比较函数的2个地址
在这里插入图片描述
可以发现一个是输入的注册码,一个是算好的正确注册码
在这里插入图片描述
在这里插入图片描述
输入测试通过
在这里插入图片描述

算法分析

下面再来看看这个注册码是怎么算出来的
直接用 VB 反编译器基本上代码都出来了,也就没啥难度了
在这里插入图片描述
这个东西好像不支持加注释,那我就把代码粘出来吧。

Private Sub Command1_Click() '401FF0
  loc_00402092: var_58 = Text2.Text
  loc_004020CA: var_44 = var_58
  loc_00402126: For var_24 = 1 To Len(var_44) Step 1 //循环累加ASCII码
  loc_00402132: 
  loc_00402134: If var_108 = 0 Then GoTo loc_004021D6
  loc_00402169: var_58 = CStr(Mid(var_44, CLng(var_24), 1)) //取一个字符
  loc_00402176: var_B4 = Asc(var_58)
  loc_004021A0: var_34 = var_34 + Asc(var_58) //加上它的ASCII码
  loc_004021CB: Next var_24
  loc_004021D1: GoTo loc_00402132
  loc_004021D6: 'Referenced from: 00402134
  loc_00402204: var_34 = var_34 * 1234567890 //整体乘上1234567890
  loc_00402276: var_58 = Text1.Text
  loc_00402298: var_64 = var_58
  loc_004022CB: If (var_58 = var_34) = 0 Then GoTo loc_00402391
  loc_004022D1: Beep
  loc_00402308: var_B4 = "RiCHTiG !"
  loc_00402327: var_A4 = "  RiCHTiG !!!!   ....  weiter mit dem Nächsten !!!"
  loc_00402374: var_54 = MsgBox("  RiCHTiG !!!!   ....  weiter mit dem Nächsten !!!", 48, "RiCHTiG !", 10, 10)
  loc_0040238C: GoTo loc_00402446
  loc_00402391: 'Referenced from: 004022CB
  loc_004023C2: var_B4 = "LEiDER Falsch !  "
  loc_004023E1: var_A4 = "Leider Falsch!   Nochmal veruschen ! Wenn Du es nicht schaffen solltest, schreib mir !  [email protected]"
  loc_0040242E: var_54 = MsgBox("Leider Falsch!   Nochmal veruschen ! Wenn Du es nicht schaffen solltest, schreib mir !  [email protected]", 16, "LEiDER Falsch !  ", 10, 10)
  loc_00402446: 'Referenced from: 0040238C
  loc_00402459: GoTo loc_0040248F
  loc_0040248E: Exit Sub
  loc_0040248F: 'Referenced from: 00402459
  loc_004024C0: GoTo loc_00esi
End Sub

最后比较正确的注册码发现还需要把字符串中的第4、9位替换成 “-”

C语言注册机:

#include <stdio.h>
#include <string.h>

int main()
{
	unsigned char username[100];
	long long id=0;
	char ids[500];
	gets(username); //使用gets用户名中可以包含空格
	//scanf("%s",username);
	for(int i=0;i<strlen(username);i++)
	{
		id+=username[i];
	}
	id*=1234567890;
	sprintf(ids,"%lld",id);
	ids[3]=ids[8]='-';
	printf("%s",ids);
	return 0;
}

注册效果:
在这里插入图片描述
C语言中文注册机:
中文仍然是GBK编码,解决方案与之前相同。
序列号竟然是负的!

#include <stdio.h>
#include <string.h>

int main()
{
	unsigned char username[100];
	long long id=0;
	char ids[500];
	gets(username);
	//scanf("%s",username);
	for(int i=0;i<strlen(username);i+=2)
	{
		id+=(0xFFFF<<16)+(username[i]<<8)+username[i+1];
	}
	id*=1234567890;
	sprintf(ids,"%lld",id);
	ids[3]=ids[8]='-';
	printf("%s",ids);
	return 0;
}

注册效果:
在这里插入图片描述

发布了33 篇原创文章 · 获赞 104 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/csg999/article/details/104074683