对于载入OD后一调试就跑飞的程序,可以尝试一下单步法。
今天所用到的示例程序仍然是《Shark恒零基础百集VIP破解教程》中的示例程序:
发现每次打开软件都会弹出提示安装软件的消息框:
载入OD前先查壳:
Delphi的程序,无壳,下面载入OD:
发现只要开始单步调试,程序就弹出前面的安装软件的提示框:
关闭提示框后程序结束运行,这里就是程序跑飞的现象。
发现载入OD后,程序入口点是一个call:
F7进入这个call,然后单步调试(调试的时候对运行后会弹出消息框的call(关键call)语句下断,同时观察是否有跳转跳过该关键call):
遇到向上跳转的语句,可以选中该语句下面最近的非跳转和非CALL的语句(如果是跳转或者call可能会漏掉重要信息),F4运行到指定位置:
经过N次单步调试后找到第一个关键call:
下断后重新载入程序,运行程序,来到下断的call处,向上溯源并未发现可以跳过的跳转,那么删除该断点(防止下一次运行时又在此处断下)F7步入这个call:
接着继续单步调试,重复上面的步骤,找到第二个关键call:
重新载入OD,运行至该call,发现没有跳转跳过,删除断点,F7单步进入该call:
接着继续单步运行,寻找三个关键call:
没有跳转跳过,继续重复上述步骤,直至找到有跳转跳过的关键call:
接下来是更改跳转,达到破解目的:
先在跳转处下断,删除call处的跳转,重新载入,测试一下:
果不其然,运行后程序在此处断下,但跳转并未实现,修改标志位Z,让跳转实现,运行程序,发现提示框不再弹出,目的达到,接着就是将jnz跳转修改为无条件跳转jmp:
打开保存后的文件,发现目的达到: