h_one 发表于 2013-8-20 21:41

简单MFC CrackMe

好久没有CrackMe了,特别是拿到mfc的程序更是着急。这篇帖子是小菜对MFC程序逆向的总结,感觉挺有用的,希望对大家有用。若果有什么地方分析的不好请提出。在此感谢zenghw大牛写的这系列作品,我的做法跟他讲诉的有所不同。

文章作者:zxcfvasd
软件名称:CRECKME 2.exe
保护方式:serial
加壳方式:无
使用工具:ollyICE

1.拿到该软件运行,可以了解到是以name和serial的方式进程保护的,没有错误提示
2.用Ollyice打开运行,出入name = honecm, serial = 12345678,此时不忙点击确定按钮。接下来点查看菜单--窗口(点右键刷新一下)--单击

这一步目的:设下了这个消息断点,意思就是一松开check键后就中断。如图被断下了


3.点查看菜单--内存--点击如下图那一行--按F2设断。


操作这步原因:
我们刚刚断下的地方,不是程序的领空,是跑到user32的领空了,在最顶的标题上可以了解到,这个我们一定是不关心的,都是一些api函数,我们要了解的是我们的程序的代码。你进到内存窗口后,发现是CRECKME这个属主只有五行,CRECKME就是我们的程序名了,我们要的就是返回到这,区段这里显示四种,因为我们是要分析它的执行代码,所以我们就选.text那一行设断了。那这样我们再点运行程序后,它就是断在CRECKME程序领空了。

4.返回到CreckMe程序领空后,如图


5.在这个窗口任意点击右键,添加全部函数列程的项目。如图:

这一步又是干什么用的?
现在我主要是想分析它运行了哪些主要函数代码,用这个可以跟踪,如运行过了会有红色显示出来,只要是红色显示出来的,那算法的代码一定在这里面了。

6.点运行程序,接下来就可以开始分析了。首先还是找那个范围出来吧。
点查看菜单--run跟踪--选择一行CRECKME--点右键选“统计模块”,


统计结果的每一行的意思是指它运行过的模块,双击每一行,都会跑到返汇编窗口,在每一下块的块首按F2设断,统计窗口共有三行,就设三次。


有关算法就在三个快里了,每个快里实现了一些功能。接下来就可以只看算法了,不会再跑到系统领空了。

重新运行,输入name, serial 点解确定后程序被断在上面那个图那。
这个CRECKME算法很简单的,

00401586|.E8 CB030000   call <jmp.&MFC71.#6236>
0040158B|.8D4B 74       lea ecx,dword ptr ds:
0040158E|.FF15 9C314000 call dword ptr ds:[<&MFC71.#876>]      ;获取name
00401594|.8D5424 10   lea edx,dword ptr ss:

004015A2|.8A4424 16   mov al,byte ptr ss:                   ;name
004015A6|.84C0          test al,al
004015A8|.75 50         jnz short CRECKME_.004015FA
004015AA|.8A5424 15   mov dl,byte ptr ss:                  ;dl = name
004015AE|.84D2          test dl,dl
004015B0|.74 48         je short CRECKME_.004015FA
004015B2|.8B43 78       mov eax,dword ptr ds:            ;eax = 输入的serial对应16进制
004015B5|.3D A0860100   cmp eax,186A0
004015BA|.7C 3E         jl short CRECKME_.004015FA                   ;if(eax>=0x186A0)
004015BC|.0FBE7424 12   movsx esi,byte ptr ss:         ;2
004015C1|.0FBE4C24 11   movsx ecx,byte ptr ss:          ;1
004015C6|.0FBE7C24 14   movsx edi,byte ptr ss:         ;4
004015CB|.03CE          add ecx,esi                                                ;temp = name+name
004015CD|.0FBE7424 10   movsx esi,byte ptr ss:         ;esi = name
004015D2|.03CE          add ecx,esi                                                ;temp = name+name+name
004015D4|.0FBE7424 13   movsx esi,byte ptr ss:         ;3
004015D9|.0FBED2      movsx edx,dl                                          ;edx = name
004015DC|.03F7          add esi,edi                                                 ;temp1 = name+name;
004015DE|.03F2          add esi,edx                                             ;temp1 = temp1+name
004015E0|.99            cdq
004015E1|.BF E8030000   mov edi,3E8
004015E6|.F7FF          idiv edi                                 ;eax/0x3E8
004015E8|.3BC8          cmp ecx,eax                              ;前三位和 与 除数比较
004015EA|.75 0E         jnz short CRECKME_.004015FA
004015EC|.3BF2          cmp esi,edx                              ;余数 = 后三位和
004015EE|.75 0A         jnz short CRECKME_.004015FA
004015F0|.8B03          mov eax,dword ptr ds:
004015F2|.8BCB          mov ecx,ebx

这个算法就是输入的name长度6位,serial对应16进制大于等于0x186A0。serial/0x3E8,eax = 商,edx= 余数 如果商等于name前三位&&余数等于后3位和就成功。

int a = 0, b = 0;
if(name!=0x00 || name == 0x00)
    return;
if(serial < 0x186A0)
    return;
for(int i = 0; i < 3; i++)
{
       a += name;
}
for(i = 3; i < 6; i++)
{
      b += name;
}
if(a == serial/0x3E8 && b == (serial%0x3E8))
{
   success;
}
else
   error;

这么CRECKME算法没什么特点,主要是对MFC代码跟踪。


马斯维尔 发表于 2013-8-20 21:53

消息断点这种方式   自打我学习了之后就没用过了现在有看到了真是不错

你若安好 发表于 2013-8-20 22:06

新手刚来,学习学习怎么破解MFC

h_one 发表于 2013-8-20 22:15

马斯维尔 发表于 2013-8-20 21:53 static/image/common/back.gif
消息断点这种方式   自打我学习了之后就没用过了现在有看到了真是不错

{:1_928:}很多还是用mfc写,我们要熟悉

h_one 发表于 2013-8-20 22:16

你若安好 发表于 2013-8-20 22:06 static/image/common/back.gif
新手刚来,学习学习怎么破解MFC

恩恩,,这个很适合新手的,{:1_893:}

你若安好 发表于 2013-8-20 22:16

为什么我用ollyice和吾爱OD,到运行跟踪这步F9两个都崩溃了。。

h_one 发表于 2013-8-20 22:17

你若安好 发表于 2013-8-20 22:16 static/image/common/back.gif
为什么我用ollyice和吾爱OD,到运行跟踪这步F9两个都崩溃了。。

换下od试试,我也有这种情况

你若安好 发表于 2013-8-20 22:19

zxcfvasd 发表于 2013-8-20 22:17 static/image/common/back.gif
换下od试试,我也有这种情况

哦?估计我的是系统问题

a070458 发表于 2013-8-24 21:34

本帖最后由 a070458 于 2013-8-24 21:47 编辑

貌似需要把SOD的skip some exceptions 关掉才可以跟踪 不然会出错

海盗小K 发表于 2013-9-2 15:16

zxcfvasd 发表于 2013-8-20 22:16 static/image/common/back.gif
恩恩,,这个很适合新手的,

第一个图的确定按钮是OD里的什么窗口?求解。
页: [1] 2
查看完整版本: 简单MFC CrackMe