练习笔记之160Crackme-027
# 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,再执行,就能提示成功了。
```c
HANDLE CreateFileA(
LPCSTR lpFileName, //文件名
DWORD dwDesiredAccess, //
DWORD dwShareMode, //0x1 FILE_SHARE_READ
LPSECURITY_ATTRIBUTES lpSecurityAttributes, //null
DWORD dwCreationDisposition, //0x3 OPEN_EXISTING,没有0x0参数项
DWORD dwFlagsAndAttributes, //0x80 FILE_ATTRIBUTE_NORMAL,没有0x0参数项
HANDLE hTemplateFile //0x0 null
);
``` 哇塞好文章给了新手莫大的鼓舞!!谢谢分享! 步骤详细,小白能看懂 大神啊,厉害 好文章 !谢谢分享! 我照这个步骤我也试试看! 好文章,感谢分享,希望能越来越好。 谢谢楼主分享,多学习{:1_893:} 感谢楼主分享 先顶一下,收藏好,留个脚印,下次好找
页:
[1]
2