xiaoyu2032 发表于 2022-7-17 09:30

练习笔记之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
);
```

935 发表于 2022-7-17 09:46

哇塞好文章给了新手莫大的鼓舞!!谢谢分享!

假笑 发表于 2022-7-17 11:07

步骤详细,小白能看懂

raincord 发表于 2022-7-17 15:22

大神啊,厉害

戰龍在野 发表于 2022-7-17 21:37

好文章 !谢谢分享!

tencentma 发表于 2022-7-18 15:33

我照这个步骤我也试试看!

hongchne 发表于 2022-7-18 19:49

好文章,感谢分享,希望能越来越好。

SuperZDK 发表于 2022-7-19 06:03

谢谢楼主分享,多学习{:1_893:}

SuperZDK 发表于 2022-7-19 17:22

感谢楼主分享

aspllh 发表于 2022-9-2 23:30

先顶一下,收藏好,留个脚印,下次好找
页: [1] 2
查看完整版本: 练习笔记之160Crackme-027