解密系列之OD使用教程4
程序1:RegisterMe.exe
把程序跑一遍之后我们发现程序有两个NAG,一个是在程序界面启动前出现,另一个是在程序关闭后出现的。
去掉第一个Nag方法如下:
①jmp跳过
②全部nop掉
③令hOwner参数为1,push 1,使其父句柄无意义
④更改入口地址为401024
双击这一行
将下面一行中AddressOfEntryPoint
的值改为1024
,如下图
具体在数据窗口中定位到4000E8
,按下空格键进行修改
同理,可去掉第二个NAG窗口。
解密系列之OD使用教程5
程序2:RegisterMe.Ops.exe
用OD加载,提示
打开内存页,看到PE头的大小为0x5000
,双击进行查看;找到以下几个地方,发现数值大得离谱,修改正确即可
解密系列之OD使用教程6
安装程序:pixtopianbook107.exe
安装后,打开软件,标题栏显示UNREGISTERED VERSION
,About对话框显示Unregistered version v1.07
发现只能建立3个组,每个组只能添加4个联系人。
点击Add后,弹出对话框,返回OD按下暂停,按Alt+F9
执行到用户代码,此时左上角提示“返回到用户”,回到软件按下确定,程序断下。
直接jmp掉,保存文件,即可突破联系人数只能为4的限制。
同理,跳过增加组的限制,如下
在内存窗口,按下Ctrl+B
查找字符串,在Unicode字符查找框中输入UNREGISTERED VERSION
点击查找,即可在4D4830地址处找到该字符串,进行修改;继续搜索,在4D570E、4E4BE8
处找到,修改并保存;在ASCII字符查找框中输入this is an…
,在48F974
处找到,修改成This is an registered version
,然后按同样的方法保存文件。
数据窗口中转到48F974
,在第一个字节右键=>查看参考,找到引用所在,双击来到反汇编窗口
使得该处直接跳转,并保存,至此破解结束。
解密系列之OD使用教程7
程序:VisualSit. Design...exe
调试寄存器:Dr0~Dr3
四个寄存器用来存放中断地址,Dr4、Dr5
保留不使用,Dr6、Dr7
用来记录Dr0~Dr3
的属性。
运行程序,发现有NAG窗口,且有次数限制,退出时有广告窗口。
去NAG窗口
调试技巧:一路按F8,遇到产生NAG的call时,在该call下断点;重新载入,运行,然后在刚才断点断下,F7进去,删除断点;继续F8找下一个使NAG出现的call,依次操作,直到找到最终call出NAG 地方,需要注意的是,如果call在动态链接库即系统领空时,只能下硬件断点,方法是:右键=>断点=>硬件执行。最终找到如下地方
将该call直接反汇编为mov eax,1即可去掉NAG窗口。
去广告窗口。
广告窗口弹出后,在OD中按下暂停,然后点击K(堆栈)窗口,如下
在图示的480C24处
是唯一该软件所在领空,双击回到反汇编窗口,下断点重新运行并关闭软件,断下
按下F8,弹出广告,说明nop掉该call即可。
破解万能钥匙
根据代码试用期和到期后走向不同,找到关键所在。在关键跳转出标出Y或者N,然后用完使用次数,重新找出是哪个跳转有所变化,把变化了的跳转进行如下修改即可
test eax,eax
jle 00489998 => mov eax,1
解密系列之OD使用教程8
程序:pcsurg*on.exe
方法一
运行程序,同样有NAG窗口,关闭后进入主窗口,显示为未注册版本且5 days remaining,关于窗口中也显示未注册版本,且要求输入注册码等。
用OD载入,以标题栏的<unregistered
为切入点,右键=>查找=>所有参考文本字串,来到文本子串窗口(R窗口),拉到最上面右键=>查找文本,输入<unregistered
,结果如下
双击上面高亮行,来到反汇编窗口
在该行上面的跳转处和子程序的开头处下断点,重新载入程序并运行,发现断在该跳转处,跳转未实现,修改ZF标志位使跳转实现,按F9发现NAG窗口不再弹出且标题栏未注册的信息消失,但是关于窗口仍有未注册信息,尚未完全破解。根据About窗口
继续找这个字符串<Unregistered Version>
,发现并不能找到,重新查找<Unregister
,找到如下位置
在这个跳转处和程序入口点下断,F9运行程序,继续在5CC83C处修改ZF标志位使得跳过,然后按下Help=>About触发刚才下的断点,单步走到下图处
同理修改ZF标志位使得跳转实现,按F9运行起来
弹出关于对话框为已注册版本,且注册按钮消失了!根据以上调试结果,接下来把两处的jnz跳转改为jmp,并保存到文件,运行验证可知已完成破解。
方法二
继续深入思考,载入原程序,观察原来的断点处
[60EB8C]=610C4A
[60F1DC]=610C5E
为什么需要2个判断?可能是是否注册信息和试用天数。对可疑地址60EB8C
进行跟踪,右键=>查找参考=>地址常量,找到如下
可能对改地址值初始化的地方就是设置注册信息的地方,如上图对每个指令设置断点,重新运行程序,断下
观察这段代码,发现这是在程序开始运行不久就将al的值赋值给[60EB8C]
,然后和0进行比较,如果不为0则跳转实现,猜测al
中可能存放的是程序是否注册的标志,因此直接将1赋值给它,查看是否能够直接破解,如图
保存到可执行文件,运行查看,完美破解。另一种方法是作如下修改
显然方法二更加高效,但是需要仔细分析程序代码的逻辑关系,难度较大,值得深入思考学习该种方法。