吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 4613|回复: 7
收起左侧

[原创] CrackMe160中第26题破解详细过程

[复制链接]
沉默的小光 发表于 2016-7-28 15:35
之前好长时间都没有发帖了,一直都在忙工作,最近稍微闲下来一点,研究了一下CrackMe160系列第26题好多稍微简单一点的我就略过了,只发了一些感觉相对有一点挑战性的
CrackMe160系列下载地址: http://pan.baidu.com/s/1xUWOY 密码: jbnq

1.PNG
可以看到第26题属于?难度类型的


下载,打开程序
2.PNG
Colormaster.zip (6.02 KB, 下载次数: 5)
几次尝试输入Name和Serial后点chEch iT !可以发现,会有两种情况,当name少于5位时,会弹出提示;而另一种情况则只是输入框内容一闪,没有提示框。
使用老方法,打开OD,Alt+F再Alt+A附加进程到这个程序上,再Alt+E找到程序模块
3.PNG
右键,跟随入口
进入之后先右键,先Ctrl+A分析代码再搜索字符串,很容易找到
4.PNG
找到之前提示框里的那句跟入,向上翻,打到一连串初始化的这个位置
5.PNG
这里通常是程序用于判断的入口,向下翻,能找到一个字符串比较的VB函数
6.PNG
打上断点之后可以看到,EAX变成一个字串的地址
7.PNG
运行程序,保持Name不变,把Serial输入为这个字串,发现匹配成功!
接下来我们要弄清楚的是这个字串的来源,并编写一个注册机
向上看,可以发现程序中使用过好几次连接函数(字符连接,变量连接)
[Asm] 纯文本查看 复制代码
00403688   .  50            push eax                                 ; /String
00403689   .  FFD7          call edi                                 ; \__vbaStrCat


可以看到,Serial是由好久个部分拼凑起来的
于是我们只能一段一段的找
找到第一个使用连接函数的地方,下断点查看内存可以发现用于拼凑是一个数字
8.PNG
往上翻可以发现有一个循环,不断地在计算同一个式子:
name的每一位ASCII码*432.4*17.79/0x15
取整得到一个数字
而使用的却是最后的那个字符,也就是只有最后一位是有效的
[Asm] 纯文本查看 复制代码
00402F33   .  C785 0CFFFFFF>mov dword ptr ss:[ebp-0xF4],0x5
00402F3D   .  C745 94 15000>mov dword ptr ss:[ebp-0x6C],0x15
00402F44   .  C745 8C 02000>mov dword ptr ss:[ebp-0x74],0x2
00402F4B   .  DD9D 6CFEFFFF fstp qword ptr ss:[ebp-0x194]
00402F51   .  DC8D 6CFEFFFF fmul qword ptr ss:[ebp-0x194]            ;  nameASCII码值
00402F57   .  DC0D 00114000 fmul qword ptr ds:[0x401100]             ;  17.79
00402F5D   .  DD9D 14FFFFFF fstp qword ptr ss:[ebp-0xEC]


得到的后来被转为字符串存在ebp-0x84里
[Asm] 纯文本查看 复制代码
004033AF   .  FF15 C0104000 call dword ptr ds:[<&MSVBVM60.#573>]     ;  MSVBVM60.rtcHexVarFromVar





这以十六进制形式转成字串后是Serial的第二部分,第一部分下断点后比较可以知道,它由第二部分+第一位name的ASCII码以十进制形式转成字串得到
第三部分比较后可以看到直接就是第一部分以十六进制形式转成字串的结果
第四部分来自于
[Asm] 纯文本查看 复制代码
00403492   .  50            push eax                                 ; /String
00403493   .  FF15 10104000 call dword ptr ds:[<&MSVBVM60.__vbaLenBs>; \__vbaLenBstr
00403499   .  0FAFD8        imul ebx,eax
0040349C   .  8B8D ACFEFFFF mov ecx,dword ptr ss:[ebp-0x154]
004034A2   .  C785 FCFEFFFF>mov dword ptr ss:[ebp-0x104],0x3
004034AC   .  0F80 CE030000 jo Colormas.00403880
004034B2   .  83EB 1B       sub ebx,0x1B



这是第一位name*name长度-0x1b以十进制形式转成字串
第五部分可以发现就是Name的长度以十进制形式转成字串
[Asm] 纯文本查看 复制代码
00403667   .  52            push edx                                 ; /String
00403668   .  FF15 10104000 call dword ptr ds:[<&MSVBVM60.__vbaLenBs>; \__vbaLenBstr
0040366E   .  50            push eax
0040366F   .  FF15 08104000 call dword ptr ds:[<&MSVBVM60.__vbaStrI4>;  MSVBVM60.__vbaStrI4
00403675   .  8B35 DC104000 mov esi,dword ptr ds:[<&MSVBVM60.__vbaSt>;  MSVBVM60.__vbaStrMove
0040367B   .  8BD0          mov edx,eax
0040367D   .  8D4D CC       lea ecx,dword ptr ss:[ebp-0x34]
00403680   .  FFD6          call esi                                 ;  <&MSVBVM60.__vbaStrMove>
00403682   .  8B3D 30104000 mov edi,dword ptr ds:[<&MSVBVM60.__vbaSt>;  MSVBVM60.__vbaStrCat
00403688   .  50            push eax                                 ; /String
00403689   .  FFD7          call edi                                 ; \__vbaStrCat



最后一部分是固定的-CM
编写C语言代码
[C] 纯文本查看 复制代码
void getCode(char key[],char name[])
{
	int nameLength = strlen(name);
	char key1[10],key2[10],key3[10],key4[10],key5[10];
	sprintf(key1,"%d",(int)(name[nameLength-1]*432.4*17.79/15+name[0]));
	sprintf(key2,"%X",(int)(name[nameLength-1]*432.4*17.79/15-name[0]*0x19));
	sprintf(key3,"%X",(int)(name[nameLength-1]*432.4*17.79/15));
	sprintf(key4,"%d",(int)(name[0]*nameLength-0x1b));
	sprintf(key5,"%d",nameLength); 
	memset(key,0,sizeof(key));
	strcat(key,key1);
	strcat(key,key2);
	strcat(key,key3);
	strcat(key,key4);
	strcat(key,key5);
	strcat(key,"-CM");
}


9.PNG
注册机 26.rar (30.71 KB, 下载次数: 1)


由于过程较复杂,解说的不算很细,如果有疑问请回复我,然后我将一一进行解答

点评

厉害!我才解到4题。。。。  发表于 2016-7-28 16:06

免费评分

参与人数 4威望 +1 热心值 +4 收起 理由
Hmily + 1 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!
KaQqi + 1 好羞愧,我才解到4题
xiaofengke + 1 已答复!
无痕软件 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!

查看全部评分

本帖被以下淘专辑推荐:

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

wangsheng66 发表于 2016-7-28 15:44
VB程序我打不开.
 楼主| 沉默的小光 发表于 2016-7-28 15:47

是不是少了一个dll?下个msvbvm50.dll和程序放在一起试试
xiaofengke 发表于 2016-7-28 15:49
KaQqi 发表于 2016-7-28 15:51
哦,不错。cm26题我还没到呢!
風走過的路 发表于 2016-8-11 14:43
我很赞同,我很赞同
luziye233 发表于 2018-5-12 15:30
请问是怎么确定每个部分的位置的呢,我在调试的时候看到注释里有好多个vbStrCat,不知道该怎么确定位置
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-12-22 16:05

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表