OllyDbg 使用教程 (十八)


 

参考

书:《加密与解密》

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

 

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

 

这次这个程序跟原来的程序不一样,它会对自身的代码进行加密解密。

 

程序运行前有一个nag窗口,破解目标去除这个nag窗口。

图片1

OD加载这个程序,搜索nag窗口的文字。可以找到:

图片2

但是在此处下断点后,重新运行程序,发现程序没有在下断点的地方停下来。分析可以知道,这个程序有些狡诈,我们搜到的那个貌似产生nag窗口的代码可能是用来骗我们的。真正的代码可能被加密了,我们直接搜索搜不到。

 

重新加载程序,可以发现程序的代码有些跟平常不太一样的地方:

 

图片3

 

图片4

 

这是因为OD分析错误了。可以右键-->分析-->从模块中删除分析。就可以看到正确的指令

图片5

 

去除分析后我们可以看到下面代码:

图片6

 

F8单步调试程序,F7进入call 0040130F

我们可以看到下面代码:

图片7

 

可以发现,0040130F这个函数是一个对程序自生代码进行修改的函数,即对函数自己代码进行解密的函数,

它解密的位置在00401000到00401218=<jmp.&USER32.BeginPaint>,解密方式是 xor byte ptr[eax],5A。

 

可以发现call 0040130F正是用来解密call 00401011的代码。

 

F8运行程序,可以发现call 00401011会产生nag窗口和程序主窗口。

 

程序运行程序,F7进入call 00401011,窗口代码。

 

可以发现00401011函数中,先是对自己函数的代码进行(edi为00401011),进行解密。

图片8

 

call edi就产生nag窗口的代码。

 

程序运行程序,进入call edi。

 

图片9

 

可以发现call edi 代码,中有一段是产生窗口的代码,但窗口的标题跟内容都是乱码。再看看代码,这段代码前是一段对对00403000到00403128进行解密的代码,正好产生窗口的标题跟内容都在解密的范围内。然程序运行到00401011,即可发现窗口标题跟内容所指向的区域变成的nag窗口的信息。F8运行,可以发现这正是产生nag窗口的地方。接着运行程序,我们可以发发现是对程序主窗口产生代码的解密,跟对前面解密后的代码在加密。

 

破解思路,想让messagebox不出现可以把MessageBox中的hWnd参数改成一个不可能的值,例如1。

即把push 0 改成 push 1

 

产生nag窗口函数的push 0 在0040101D ,这个地方的代码被加密的,程序解密的地方在00401035

它mov word ptr [0040101D], 6A (6A 即6A 00 即 push 0),要把它改成mov word ptr [0040101D], 6A01即把401039由00改成01

但是mov word ptr [0040101D], 6A在 00401035 ,这个地方又被call 0040130F加密,加密的方法是xor  xxx, 5A,所以要把401039由5A改成5B(xor中3个数是可以知道其中2个推出另外一个,例如01 xor 5A = 5B ,5B xor 01 = 5A)即可完成破解。