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 ,保存到程序。重新运行改后的程序,可以发现已经被破解。