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)即可完成破解。
原文地址:http://blog.csdn.net/billvsme/article/details/39135481