之前好长时间都没有发帖了,一直都在忙工作,最近稍微闲下来一点,研究了一下CrackMe160系列第26题好多稍微简单一点的我就略过了,只发了一些感觉相对有一点挑战性的
CrackMe160系列下载地址: http://pan.baidu.com/s/1xUWOY 密码: jbnq
可以看到第26题属于?难度类型的
下载,打开程序
Colormaster.zip
(6.02 KB, 下载次数: 5)
几次尝试输入Name和Serial后点chEch iT !可以发现,会有两种情况,当name少于5位时,会弹出提示;而另一种情况则只是输入框内容一闪,没有提示框。
使用老方法,打开OD,Alt+F再Alt+A附加进程到这个程序上,再Alt+E找到程序模块
右键,跟随入口
进入之后先右键,先Ctrl+A分析代码再搜索字符串,很容易找到
找到之前提示框里的那句跟入,向上翻,打到一连串初始化的这个位置
这里通常是程序用于判断的入口,向下翻,能找到一个字符串比较的VB函数
打上断点之后可以看到,EAX变成一个字串的地址
运行程序,保持Name不变,把Serial输入为这个字串,发现匹配成功!
接下来我们要弄清楚的是这个字串的来源,并编写一个注册机
向上看,可以发现程序中使用过好几次连接函数(字符连接,变量连接)
[Asm] 纯文本查看 复制代码 00403688 . 50 push eax ; /String
00403689 . FFD7 call edi ; \__vbaStrCat
可以看到,Serial是由好久个部分拼凑起来的
于是我们只能一段一段的找
找到第一个使用连接函数的地方,下断点查看内存可以发现用于拼凑是一个数字
往上翻可以发现有一个循环,不断地在计算同一个式子:
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");
}
注册机
26.rar
(30.71 KB, 下载次数: 1)
由于过程较复杂,解说的不算很细,如果有疑问请回复我,然后我将一一进行解答
|