1 Acid burn.exe
打开程序,先看一下有哪些部分。左边的Serial/Name部分和右边的Serial部分
随便输几个数,其中左边的报错信息是
Try Again!
Sorry, The serial is incorect!

右边的则是
Failed
Try Again!!

知道了这些内容,就可以尝试通过字符串定位关键比较代码
左边:Serial/Name
方法1 爆破
搜索字符串如下

转到第一个字符串对应的反汇编

找到关键跳并设置断点
另一个也是同理,给jne指令设置断点

F9运行起来,输入错误的Serial/Name
程序到达第一个断点,这里eax返回值是1,导致下面jge无法跳转,这里直接把jge改成jmp

然后执行到下面的断点,我们希望这里不发生跳转,所以,直接把地址改成下一条指令

按下F9,弹出good job,证明这部分修改成功了

ctrl+p打开补丁,然后修改文件,保存为a.exe,这样无论怎么输入都会提示good job

方法2 分析算法
jge上边那个call设置断点,这个函数决定了jge是否跳转。
输入8888作为name,9999作为serial,引发断点
406930 Strlen()

eax是这个函数的参数,它保存了8888字符串的指针

第一行保存了一下edi的值,第二行传入字符串指针,然后分别把ecx设为-1,al置0。repne scasb是逐步扫描字符串的每个字节,直到字符串结尾。可以看到ecx在这条指令执行的过程中每次减1。后面FFFFFFFE与ecx作差得到字符串长度。可以得出,这是一个strlen函数,最后比较结果小于4就会弹错误提示框。
Name[0] * 0x29 * 2
返回后继续往下跟

可以看到中间call下面三条指令,取出字符串第一个字符,然后把它乘以0x29,保存到了431750这个地址,后面add指令又给这个值乘以2。
这一部分逻辑是 Name[0] * 0x29 * 2。
下一部分则把这个值从16进制转换为十进制形式

字符串拼接
紧接着,执行完4039AC这个函数后就得到了一个关键字符串,其规律是 CW-(Name[0] * 0x29 * 2)-CRACKED

后边就是比对的过程了。
右边:Serial
方法1 爆破
xdbg加载上边的a.exe
这个需要关注Failed字符串,因为它只在右边出现,便于查找
找到后进入反汇编视图

找到上方关键跳,同理,把地址改成下边push指令并设置断点
输入错误的Serial,使程序断在断点处

然后F9提示Good Job

同样的方法,保存一下,这样无论那边都会提示Good Job。以上,爆破部分就结束了
方法2 分析算法
给jne跳转上边的call下断点,然后输入错误的序列号触发断点

可以看到函数参数中出现了硬编码序列号,猜测Hello Dude!为真正的序列号,重新启动程序试一下

与猜想一致
注册机编写
print("请选择(1/2):\n1 Serial/Name\n2 Serial")
c = int(input())
if c==1:
print("请输入Name(len >= 4)")
name = str(input())
if len(name) < 4:
print("请重新输入")
else:
Serial = 'CW-' + str(ord(name[0]) * int(0x29) * 2) + '-CRACKED'
print(f"Your Serial: {Serial}")
elif c==2:
print("Your Serial: Hello Dude!")
else:
print("请重新输入")
浙公网安备 33010602011771号