OllyDbg 使用教程 (十四)


 

参考

书:《加密与解密》

视频:小甲鱼 解密系列 视频

 

示例程序下载地址:http://pan.baidu.com/s/1hqqYZ6c

 

此程序运行前会有一个nag窗口,运行结束后也有一个nag窗口。破解目的要去除这两个nag窗口。

 

用OD加载这个程序,按F9运行,当第一个nag窗口出现时,按下暂停。查看 堆栈调用

图片1

 

观察这些调用,查找产生这个nag窗口的调用,此程序是用VC6.0++写的,使用MFC,可以发现此次dialog非常关键

图片2

 

点击它的“调用来自”  可以看到下面代码:

图片3

 

在0042039A处下断点,重新运行程序。可以发现程序运行前的nag窗口,程序窗口,和程序运行后的nag窗口都是由0042039A处的

call    <jmp.&MFC42.#2514_CDialog::DoMod>产生,所以只要第一次跟第三次让程序跳过0042039A处的call    <jmp.&MFC42.#2514_CDialog::DoMod>,让第二次运行0042039A处的call    <jmp.&MFC42.#2514_CDialog::DoMod>。再仔细观察它前后的代码,可以发现je      short 004203BA 很关键,它可以跳过call    <jmp.&MFC42.#2514_CDialog::DoMod>。 我们可以把它改成一个程序对一个变量计数,当变量为1或3时跳过call    <jmp.&MFC42.#2514_CDialog::DoMod>,为2使执行call    <jmp.&MFC42.#2514_CDialog::DoMod>。

 

我们可以用内嵌补丁,可以在程序代码最后面找到一片空白的区域,例如这里就用00437D70。

先把je      short 004203BA 改成    jmp     00437D70 ,由于原来的代码只占2个字节,改后的代码占用5个字节,lea ecx, dword ptr [esp+4C] 会被覆盖。 在00437D70敲入代码,因为敲 的代码表多,一行一行的改没有效率,可以用NonaWrite这个插件来写代码(下载地址:http://tools.pediy.com/Debuggers/ollydbg/ollydbg1/plugin/NonaWrite/NonaWrite1.2.rar,下载后,直接解压到od目录下的plugin文件夹中),打开插件,敲入

 

0x00437D70:
lea ecx, dword ptr [esp+4C]
inc byte ptr  [445EE0] 
cmp byte ptr [445EE0],2
je 0042037F
jmp 004203BA

 

 

图片4

 

点击Assemble再点击Done(不要忘记点Done,否则运行会有问题),保存修改,即可完成破解。代码中[445EE0]被当做一个变量,相当于 i ,445EE0 这个地址是随便选的,只要是程序的数据区中空白的切不会再运行中用到的地方即可。按alt+M从内存映射表中点击 .data 即可查看数据区,在数据区后面的地方,就可以看到大片空白的地方。如果不缺定空白的地方是否会在程序运行时被使用,只要在想要用的地方下硬件写入断点,运行程序观察是否被断下即可。