参考
书:《加密与解密》
视频:小甲鱼 解密系列 视频
RegisterMe程序下载地址:http://pan.baidu.com/s/1gd3l4XH
这个RegisterMe程序,运行前和运行后都会有neg窗口。破解目标,去除这个两个窗口。
用OD直接打开这个程序,我们会发现出错。也可能OD会卡死。
因为这个程序的PE文件被故意修改了。
我们先到 选项---> 调试设置 --> 事件 --> 选择系统断点。
图片1
这样用OD打开就不会卡死。
按 alt + M 来到 memory界面,你可以看到“PE文件头”。注意是地址00开头的,如果是7xx看到的,那些PE文件头是dll的。
图片2
但这个PE文件头 大小是5000,一般情况是1000。所以肯定有问题,双击它,查看PE文件头。
来到PE文件头,我们可以看到有很多地方数字被故意设置的很大,所以我们会调试出错。
图片3
SizeOfCode = 40000400 太大了,选中右键点击修改整数,改成400。
SizeOfInitializedData = 40000A00 也太大了,改成A00
BaseOfCode = 40001000 也太大了,一般都是1000,改成1000 。
BaseOfData = 40002000 也太大了,改成2000
NumberOfRvaAndSizes = 40000004 也太大了,这个值一般都是10
这个程序没有输出,没有输出表,所以
Export Table address = 500000 改成 0
Export Table size = 50000 改成 0
改好后,在这个页面我们是保存不了的,记住我们修改的地方是从 00400DC 开始到0040013C。
按Ctrl+C 切换到CPU窗口,在数据面板按Ctrl+G 输入00400DC,选中我们修改的地方 右键 复制到可执行文件,在弹出的窗口中右键选择 备份-->保存数据到文件即可。
在调试选项中把设置第一次暂停 改回 WinMAin。再用OD打开修改后的程序,运行就正常了。
要去掉这个程序的两个neg窗口方法有好多种:
第一种:
直接把弹出窗口的全代码改成nop。方法是选中代码,右键-->二进制-->用nop填充,即可
第二种:
看MessageBox的函数说明,第一个参数hWnd,表示MessageBox的父窗口。
-
int MessageBox(
-
-
HWND hWnd, // handle of owner window
-
LPCTSTR lpText, // address of text in message box
-
LPCTSTR lpCaption, // address of title of message box
-
UINT uType // style of message box
-
);
我们可以把这个参数改成一个非法的句柄,让MessageBox运行出错。例如
我们可以把下面代码中的push 0 改成 push 1,MessageBox就不会显示了
00401039 |. 6A 00 push 0 ; /Style = MB_OK|MB_APPLMODAL
0040103B |. 68 7D304000 push 0040307D ; |Title = "Register Me"
00401040 |. 68 89304000 push 00403089 ; |Text = "Oops! I am not registered !!"
00401045 |. 6A 00 push 0 ; |hOwner = NULL
00401047 |. E8 9E010000 call <jmp.&USER32.MessageBoxA> ; \MessageBoxA