本帖最后由 无瑕黑心肠 于 2016-5-31 00:44 编辑
前言:
闲来没事的翻翻以前破解的软件, 无意中看到了eXeScope, 心里回想初学破解的时候, 找爆破点找了很久, 而且还有重启验证机制的, 找了一下午才搞定注册的, 而且软件重启又得注册一次, 现在想想都觉得好笑.
进入正题:
载入软件搜索字符串能够发现"两"处关键字:
PICTRUE
双击进去"已注册"的地方能找到关键的跳转:
PICTRUE
je 改 jnz 或 nop 都能实现"已注册"的效果, 但是软件存在重启验证机制, 这样做, 每次打开软件都得注册一次(除非你不觉得麻烦)
如果双击"无效的 ID 或名字"进去会发现一个上面跳下来的跳转:
PICTRUE
PICTRUE
je 改 jnz 或 nop 就能实现输入"任何字符"都被成功注册, 如果心细的朋友肯定会发现第二张图比较的部分有这么两句指令:
mov eax,dword ptr ds:[0x4CFC5C]
cmp byte ptr ds:[eax],0x0
其中的[0x4CFC5C]就是软件的"已注册"标志, 如果再心细一点就会发现"无效的 ID 或名字"上面几行会有这个两句代码:
PICTRUE
没错, 就是"已注册"的赋值点, 但是这个点在"注册窗口"里面是点击了"确定"并且 je 改成 jnz 它才会走到这一步的, 重点来了:
如何找到程序启动时的第一个赋值点?
我的思路是这样的:
1.右键该"mov eax,dword ptr ds:[0x4CFC5C]"代码, 查找参考 -> 地址常量, 然而结果是找不到的, 如果朋友再心细一点会发现这两句指令有问题, 请看:
mov eax,dword ptr ds:[0x4CFC5C] // 将地址"[0x4CFC5C]"里面的值(注意是里面, 而不是这个地址)赋值给eax
cmp byte ptr ds:[eax],0x0 // 将"[eax]"里面的值(注意是里面, 而不是这个地址)取出来于0进行比较
有没有发现这样做很多余? 地址里面的值取出来再取出这个里面的值去比较(好绕...), 明显多余(其实这个是我调试蛮久查来的), 里面值储存的地址是固定的, 所谓"[0x4CFC5C]"的值也就是"4CFB08".
知道这些"有力"条件后直接右键 -> 查找 -> 所有常量, 我们就能看到程序启动的赋值点:
PICTRUE
mov byte ptr ds:[0x4CFB08],al // 将EAX的低四位赋值给"[0x4CFB08]"
双击进去我们可以看到上面是一个关键CALL, 没错, 这个就是算法CALL, 想追注册码的可以到这里面:
PICTRUE
进入里面经过我的仔细琢磨发现只要将下面这一句:
PICTRUE
代码 004CBF9A 33DB xor ebx,ebx
改成 004CBF9A 03DB add ebx,ebx
程序就被完美爆破了(真的只要"半"字节哟). 想知道具体原因的朋友可以在这里下断, 然后跟下去, 就能发现最后 ebx 赋值给 eax , eax 的 al 赋值给"[0x4CFB08]", 爆破到此 OVER.
总结:
这期教会我们多留点心眼就能发现程序深藏的细节, 注重细节成就自我. 哪怕是破解复杂的软件也如此, 寄存器、堆栈、数据、调用堆栈等等..., 每天都在进步, 每天都在努力向前, 吾友你们呢?
好了, 帖子到此就告一段落了, 感谢吾友耐心观看到此, 也感谢你们的的热心. 也祝你(妳)们在破解的道路上不断向前, 突破自我!
|