解密系列之OD使用教程17——inline patch
程序:ReverseMe. NAGs.exe
新内容:硬件断点
用PEID打开,看到程序是用VC6.0写的,用OD载入,按F9运行后,出现NAG窗口,在OD中按下暂停,再打开堆栈窗口
如上图高亮行正是调用NAG窗口的call,双击来到反汇编窗口并下断
重新运行程序,发现程序的3个窗口都是对话框,且都来自这个call,因此不能直接将该指令NOP掉。继续往上浏览,发现有je跳转语句,只要让第1次和第3次跳转实现,第2次跳转不实现即可。
在数据段00445E80
的位置定义个变量作为计数器,在这个字节下硬件写入断点进行测试,看程序在运行过程中有没有改动该地址处的内容,发现程序并不会修改,可行。在该跳转指令下断,在00437D70
地址处添加个书签,方便来回查看。但此处直接用NonaWrite 1.2
插件进行修改,打开插件,输入
0x437D70:
inc byte ptr [445E80]
cmp byte ptr [445E80],2
jnz 004203BA
lea ecx,dword ptr [esp+4C]
jmp 42037F
然后点击“汇编”按钮即可修改完成。
再讲该条指令修改如下
进行保存到文件即可。
解密系列之OD使用教程18
程序:Urlegal.exe
新工具:FishcOD、eXeScope.exe
(可进行资源的修改)
首先安装程序,再用eXeScope
载入程序
得到退出时弹出的NAG窗口的模板名是103(0x07)
,由以下2个函数可知
HWND DialogBoxParam (HINSTANCE hlnstance, LPCTSTR IpTemplateName, HWND hWndParent, DLGPROC IPDialogFunc, LPARAM dwlnitParam);
HWND CreateDialogParam (HINSTANCE hlnstancem, LPCTSTR IpTemplateName, HWND hWndParent, DLGPROCIpDialogFunc, LPARAM dwlniParam);
在OD里查找push 0x67
往上查看,这个过程并不是破解的关键,因为没有关键跳转,因此回溯到调用该过程的位置,由提示窗口
转到调用处,查看
如上图注释所示,在关键call下断并重新运行程序,跟进发现该过程非常短,猜测可能是程序验证是否注册的过程,在开始处下断,重新运行程序;如果是的话,程序运行开始就会执行该过程以检测是否注册。
如猜测,程序运行后在此断下,现在只需要将eax的值修改为1即可,但仅修改
00403E22 |. 8B40 2C mov eax,dword ptr ds:[eax+0x2C]
这条指令的话,将覆盖掉后面的一条指令,因此可以直接同时修改2条指令
00403E1F |. 8B45 FC mov eax,[local.1]
00403E22 |. 8B40 2C mov eax,dword ptr ds:[eax+0x2C]
修改后保存到可执行文件,运行测试,发现注册按钮已经变成灰色,点击关闭按钮也不会弹出NAG窗口。
解密系列之OD使用教程19
程序:movgear.exe
运行程序,点关闭按钮后,弹出NAG窗口,出现试用还剩30天等信息。同上一节课所讲,用eXeScope载入程序,找到该NAG窗口的模板名为100(0x64)
,用OD载入,查找push 0x64
指令。
在每个命令下断,如上,运行程序并关闭后断下的地方才是我们关注的地方,地址为00406725
,删掉其他断点;往上浏览程序,发现有关键跳转和call。
在该call和跳转处下断,重新运行程序并关闭,断下,跟进
RegOpenKeyEx
:打开注册表的键值。
0043168A |. 8D5424 14 lea edx,dword ptr ss:[esp+0x14]
LONG RegQueryValueEx(HKEY hKey, // handle of key to query LPTSTR lpszValueName, // address of name of value to query LPDWORD lpdwReserved, // reserved LPDWORD lpdwType, // address of buffer for value type LPBYTE lpbData, // address of data buffer LPDWORD lpcbData // address of data buffer size );
edx
为倒数第2个参数,指向数据缓冲区。继续往下浏览程序,发现在获取了注册表信息后,可能将用户名和密码压栈,然后调用关键call进行检测
最后,如果验证失败的话,会跳到过程的结尾
观察程序,eax
的值最终来源于ebx
,因此可将该指令
mov eax,ebx
修改为mov eax,1
但是经测试,这样修改会覆盖后面的指令,因此可修改为
mov al, 1
即可爆破。
解密系列之OD使用教程20
程序:KeygenMe.exe
DialogBoxes类型常用APIs(通常在注册界面获取)
DialogBoxParamA
GetDlgItem
GetDlgItemInt
GetDlgItemTextA
GetWindowTextA
GetWindowLong
该程序是一个注册机程序,用的是GetDlgItemTextA
来获取输入的文本,用OD载入,键入命令 bp GetDlgItemTextA
下断,输入用户名、密码:Ontrd、1234567
,点击Check,在动态链接库中断下,再按下Alt+F9回到用户领空。