简单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代码跟踪。
消息断点这种方式 自打我学习了之后就没用过了现在有看到了真是不错 新手刚来,学习学习怎么破解MFC 马斯维尔 发表于 2013-8-20 21:53 static/image/common/back.gif
消息断点这种方式 自打我学习了之后就没用过了现在有看到了真是不错
{:1_928:}很多还是用mfc写,我们要熟悉 你若安好 发表于 2013-8-20 22:06 static/image/common/back.gif
新手刚来,学习学习怎么破解MFC
恩恩,,这个很适合新手的,{:1_893:}
为什么我用ollyice和吾爱OD,到运行跟踪这步F9两个都崩溃了。。 你若安好 发表于 2013-8-20 22:16 static/image/common/back.gif
为什么我用ollyice和吾爱OD,到运行跟踪这步F9两个都崩溃了。。
换下od试试,我也有这种情况
zxcfvasd 发表于 2013-8-20 22:17 static/image/common/back.gif
换下od试试,我也有这种情况
哦?估计我的是系统问题
本帖最后由 a070458 于 2013-8-24 21:47 编辑
貌似需要把SOD的skip some exceptions 关掉才可以跟踪 不然会出错
zxcfvasd 发表于 2013-8-20 22:16 static/image/common/back.gif
恩恩,,这个很适合新手的,
第一个图的确定按钮是OD里的什么窗口?求解。
页:
[1]
2