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