//处理 Serial 00401194 |. 53 push ebx 00401195 |. 56 push esi 00401196 |. 8B7424 0C mov esi, dword ptr [esp+C] ', / /处理Name 0040119A |. 57 push edi 0040119B |. 33FF xor edi, edi 0040119D |. 2BF1 sub esi, ecx 0040119F |> 0FBE040E /movsx eax, byte ptr [esi+ecx] I //取输入Name的首字符 004011A3 | • 0FAFC0 imul eax, eax ;//eax=eax*eax 004011A6 |. 99 |cdq ;//扩 展,方便做除法 004011A7 |. BB 19000000 |mov ebx, 19 004011AC |. F7FB | idiv ebx I //eax/ebx. 0 商在 eax中余数在edx中 004011AE |. 0FBE01 |movsx eax, byte ptr [ecx] I //取第一个3打1&1字符 004011B1 |. 83C2 41 | add edx, 41 I //eax%0xl9+0x41 004011B4 |. 3BD0 | cmp edx, eax ii S&Name[i]*Name[i]%0xl9+0x41 =■■ =8虹1&1[1]?相等则继续循环比较,有一个不等则注册失败。 004011B6 I. 75 0C |jnz short 004011C4 004011B8 I. 47 | inc edi 004011B9 I. 41 | inc ecx 004011BA I. 83FF 05 | cmp edi, 5 ; //全部6个字符 004011BD I. ^ 7E E0 \jle short 0040119F 004011BF I. E8 9CFFFFFF call 00401160 ; //再次处理。 004011C4 I> 5F pop edi 004011C5 I. 5E pop esi 004011C6 I. 5B pop ebx 004011C7 V C3 retn 因为在这次算法处理后又做了一次处理,跟进去后发现是成功的提示.由上面算法我们可以得出类似如下处理:Serial[i] = Name[i]*Name[i]%0x[9+0x4].由此我们将这个Crackme的注册流程以及算法部分彻底弄清楚了。 写出注册码,由上段落分析出的算法:Serial[i] = Name[i]*Name[i]%0x[9+0x4]推算出一组注册码,Name: AAAAAA; Serial: AAAAAA 写出注册机,货为算法分析出来了,所以就比较容易写出注册机了,贴下代码: #include <string. h> #include <stdio. h> #define MAX 100 void pass(char *Name, char *Serial) / i int a,b, sum; int i=0; //for循环内是逆向算法的核心 for(i=0;i<6;i++) / \ sum = Name[i]*Name[i]; a = sum/25; b = sum%25; Serial[i] = b+0x41; } printf(^Serial %s\n〃, Serial);
|