OllyDbg 使用教程 (十五)


 

参考

书:《加密与解密》

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

 

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

exescope下载地址:http://pan.baidu.com/s/1eQqxha6

 

 

通过对话框的hinstance 破解

 

win32中对话框分模态对话框与非模态对话框,

模态对话框用

int DialogBoxParam(HINSTANCE hInstance,LPCTSTR IpTemplateName,HWND hWndParent, DLGPROC IPDialogFunc,LPARAM dwlnitParam);来创建。

非模态对话框用

HWND CreateDialogParam(HINSTANCE hlnstancem,LPCTSTR IpTemplateName,HWND hWndParent,DLGPROCIpDialogFunc, LPARAM dwlniParam);来创建

 

我们可以通过搜索创建对话框函数要传入的hInstance参数来破解,即搜索 push hInstance。

 

此程序,运行结束后会差生nag窗口,既然nag窗口是对话框肯定有他的hinstance,通过exescope查看nag窗口的hinstance

 

图片1:

nag窗口

 

图片2

exescope查找到nag窗口的hinstance

 

可以知道nag窗口的hinstance是103(10进制),16进制就是0x67

 

用OD加载程序,右键-->查找-->所有命令 搜索push 0x67,

可以搜索到一处push 0x67,可以发现此处的代码正是调用nag窗口的代码

 

图片2

 

但是观察前后代码没有发现 有关跳转的代码。我们需要查看调用此处的代码。

查找调用此处的代码的方法有多种

方法一:

因为call xxx 肯定会保存当前的代码的地址,所以,只需运行到断点处,观察堆栈窗口即可。

按F9运行,再关闭程序的窗口,即可到此处。

查看堆栈窗口:

图片3

可以发现绿色框框中即是

绿色方框内即是 调用此处代码的call的后一个命令的地址。

选中它,选中 右键-->反汇编窗口中跟随,即可来到调用此处代码的call。

 

方法二:

观察push 0x67 前面的代码,找到这个函数函数头(关键找nop 和 push ebp)

图片4

 

 

选中函开始的代码 push ebp,右键--> 查找参考-->选中命令,即可看到调用这个函数的call。

 

找到的call

图片5

 

观察前后代码,可以发现 jnz     short 004023F6 很关键,它可以跳过  call    00401220。在看看jnz     short 004023F6前面的代码

call    00403E18也非常大关键,00403E18函数有能就是判断是否注册的代码,进入00403E18,查看代码

图片6

 

把mov     eax, dword ptr [ebp-4]  跟 mov     eax, dword ptr [eax+2C] 改成mov eax,1 ,保存到程序。重新运行改后的程序,可以发现已经被破解。