160CM-027
首先,拖入PE看一下,是个VC程序。OD打开,搜索一下字符串,能找到关键字符串,可以很容易的定位到关键程序段位置。对于这种按钮按下后有弹窗的,如果搜索不到关键字符串,还可以用暂停法,即弹窗后,按F12暂停程序运行,然后ALT+K,查看调用堆栈区最后一项,双击到函数调用处即可。本例会跳转到401682处,然后搜索call 401682 就能到达4013AC这行。
00401682 $- FF25 40214000 jmp dword ptr ds:[<&MFC42.#CWnd::MessageBoxA_4224>] ; mfc42.#CWnd::MessageBoxA_4224
分析这部分程序代码可以看出程序流程如下:从C盘开始依次查找磁盘,判断磁盘类型,不为3则进行文件打开操作,打开根目录下的CD_CHECK.DAT 文件,成功则跳转到成功提示分支,失败则查找下一个盘符,一直到计数器累加到7。
因此,破解的话,只需要将40138C行的je改成jmp即可。
这里一般认为,只有光驱盘符里有个CD_CHECK.DAT 文件程序就会提示成功,但实际上我在虚拟机中加载了一个含CD_CHECK.DAT 文件的光盘后,程序还是提示失败。
在MSDN中找了一下CreateFileA的函数说明,发现其第5,6个参数是没有0 这个选项的,因为这两个参数错误,所以即使光驱有文件也会提示失败。将参数5修改成0x3,参数6修改成0x80,再执行,就能提示成功了。
HANDLE CreateFileA(
[in] LPCSTR lpFileName, //文件名
[in] DWORD dwDesiredAccess, //
[in] DWORD dwShareMode, //0x1 FILE_SHARE_READ
[in, optional] LPSECURITY_ATTRIBUTES lpSecurityAttributes, //null
[in] DWORD dwCreationDisposition, //0x3 OPEN_EXISTING,没有0x0参数项
[in] DWORD dwFlagsAndAttributes, //0x80 FILE_ATTRIBUTE_NORMAL,没有0x0参数项
[in, optional] HANDLE hTemplateFile //0x0 null
);
|