-------------------------------------------------------------------------------------------------------------------------------
算法CALL代码:
10005420 6A FF push -0x1
10005422 68 E1610010 push KeyData.100061E1
10005427 64:A1 00000000 mov eax,dword ptr fs:[0]
1000542D 50 push eax
1000542E 64:8925 0000000>mov dword ptr fs:[0],esp
10005435 81EC F4030000 sub esp,0x3F4
1000543B 56 push esi
1000543C 8BF1 mov esi,ecx
1000543E 57 push edi
1000543F 8D8C24 14020000 lea ecx,dword ptr ss:[esp+0x214]
10005446 C74424 10 00000>mov dword ptr ss:[esp+0x10],0x0
1000544E E8 0DEAFFFF call KeyData.10003E60
10005453 8B8424 10040000 mov eax,dword ptr ss:[esp+0x410] ; (ASCII "GeekCat")
1000545A 8D8C24 14020000 lea ecx,dword ptr ss:[esp+0x214]
10005461 50 push eax
10005462 C78424 08040000>mov dword ptr ss:[esp+0x408],0x1
1000546D E8 9EEAFFFF call KeyData.10003F10 ; 把注册名进行MD5运算
10005472 8D8C24 14020000 lea ecx,dword ptr ss:[esp+0x214]
10005479 E8 42F6FFFF call KeyData.10004AC0 ; 用户名MD5
1000547E 33C9 xor ecx,ecx
10005480 8BF8 mov edi,eax ; (ASCII "c4a88422ee4b2eaf6a3426bd277dd9ff")
10005482 894C24 19 mov dword ptr ss:[esp+0x19],ecx
10005486 C64424 18 00 mov byte ptr ss:[esp+0x18],0x0
1000548B 894C24 1D mov dword ptr ss:[esp+0x1D],ecx
1000548F 894C24 21 mov dword ptr ss:[esp+0x21],ecx
10005493 894C24 25 mov dword ptr ss:[esp+0x25],ecx
10005497 8BD1 mov edx,ecx ; 下面这个循环就是取注册名MD5值奇数位 得到字符串 (ASCII "ca82e42a632b27df")
10005499 81E2 01000080 and edx,0x80000001 ; 结果的最高位为1,是负数—SF=1,结果非零——ZF=0
1000549F 79 05 jns short KeyData.100054A6 ; S标志位为零就跳转
100054A1 4A dec edx ; 自减1
100054A2 83CA FE or edx,0xFFFFFFFE ; 与1-做或运算
100054A5 42 inc edx ; 自加1
100054A6 75 0E jnz short KeyData.100054B6 ; Z标示位为零就跳转
100054A8 8BC1 mov eax,ecx
100054AA 99 cdq ; EDX清零
100054AB 2BC2 sub eax,edx ; 减法操作
100054AD 8A1439 mov dl,byte ptr ds:[ecx+edi] ; 依次取MD5值的每一们
100054B0 D1F8 sar eax,1 ; 算术右移一位相当于除2
100054B2 885404 18 mov byte ptr ss:[esp+eax+0x18],dl
100054B6 41 inc ecx ; ecx自加1
100054B7 83F9 20 cmp ecx,0x20 ; 与0x20即32比较,把整个MD5值取完
100054BA ^ 7C DB jl short KeyData.10005497 ; 小于就跳转
100054BC 8D4424 18 lea eax,dword ptr ss:[esp+0x18] ; 取注册名MD5值奇数位 (ASCII "ca82e42a632b27df")
100054C0 6A 10 push 0x10
100054C2 8D4C24 10 lea ecx,dword ptr ss:[esp+0x10]
100054C6 50 push eax
100054C7 51 push ecx
100054C8 8BCE mov ecx,esi
100054CA E8 E1FCFFFF call KeyData.100051B0 ; 另一部分算法;对得到的新字符串(ASCII "ca82e42a632b27df")CRC32计算,并把CRC32值中的小写字母转化为大写
100054CF 8D4C24 2C lea ecx,dword ptr ss:[esp+0x2C]
100054D3 C68424 04040000>mov byte ptr ss:[esp+0x404],0x2
100054DB E8 80E9FFFF call KeyData.10003E60
100054E0 8B5424 0C mov edx,dword ptr ss:[esp+0xC]
100054E4 8D4C24 2C lea ecx,dword ptr ss:[esp+0x2C]
100054E8 52 push edx ; (ASCII "592EC4E6")
100054E9 C68424 08040000>mov byte ptr ss:[esp+0x408],0x3
100054F1 E8 1AEAFFFF call KeyData.10003F10
100054F6 8D4C24 2C lea ecx,dword ptr ss:[esp+0x2C]
100054FA E8 C1F5FFFF call KeyData.10004AC0 ; 对字符串“592EC4E6”MD5运算:(ASCII "34627bd1176ffb2a02f4abbf32eda834")
100054FF 50 push eax
10005500 8D4C24 0C lea ecx,dword ptr ss:[esp+0xC]
10005504 E8 E7010000 call KeyData.100056F0 ; jmp 到 mfc42.#537
10005509 8D4424 14 lea eax,dword ptr ss:[esp+0x14]
1000550D 6A 08 push 0x8
1000550F 50 push eax
10005510 8D4C24 10 lea ecx,dword ptr ss:[esp+0x10]
10005514 C68424 0C040000>mov byte ptr ss:[esp+0x40C],0x4
1000551C E8 23020000 call KeyData.10005744 ; jmp 到 mfc42.#4129
10005521 50 push eax
10005522 8D4C24 0C lea ecx,dword ptr ss:[esp+0xC]
10005526 C68424 08040000>mov byte ptr ss:[esp+0x408],0x5
1000552E E8 93010000 call KeyData.100056C6 ; jmp 到 mfc42.#858
10005533 8D4C24 14 lea ecx,dword ptr ss:[esp+0x14]
10005537 C68424 04040000>mov byte ptr ss:[esp+0x404],0x4
1000553F E8 7C010000 call KeyData.100056C0 ; jmp 到 mfc42.#800
10005544 8D4C24 08 lea ecx,dword ptr ss:[esp+0x8]
10005548 E8 F1010000 call KeyData.1000573E ; (取MD5值 ASCII "34627bd1176ffb2a02f4abbf32eda834") 取前8位并转为大写作为注册码 ASCII "34627BD1"
1000554D 8BB424 0C040000 mov esi,dword ptr ss:[esp+0x40C]
10005554 8D4C24 08 lea ecx,dword ptr ss:[esp+0x8]
另一部分算法CRC32计算处 代码:
100051B0 6A FF push -0x1
100051B2 68 5F610010 push KeyData.1000615F
100051B7 64:A1 00000000 mov eax,dword ptr fs:[0]
100051BD 50 push eax
100051BE 64:8925 0000000>mov dword ptr fs:[0],esp
100051C5 83EC 14 sub esp,0x14
100051C8 55 push ebp
100051C9 56 push esi
100051CA 57 push edi ; 用户名MD5值
100051CB 8BF1 mov esi,ecx ; 注意ECX值
100051CD C74424 10 00000>mov dword ptr ss:[esp+0x10],0x0
100051D5 E8 A6FFFFFF call KeyData.10005180
100051DA 8B7C24 38 mov edi,dword ptr ss:[esp+0x38] ; 设置计数器循环次数
100051DE 8B4C24 34 mov ecx,dword ptr ss:[esp+0x34] ; 注册名MD5值奇数位 ASCII "ca82e42a632b27df")
100051E2 83C8 FF or eax,0xFFFFFFFF ; EAX初始化为8个F即 -1
100051E5 85FF test edi,edi
100051E7 7E 1B jle short KeyData.10005204
=========================《CRC32》=================================
100051E9 8BE8 mov ebp,eax
100051EB 33D2 xor edx,edx
100051ED 8A11 mov dl,byte ptr ds:[ecx] ; 依次取注册名MD5值奇数位的每一位
100051EF 81E5 FF000000 and ebp,0xFF ; 0xFF 为255即8个1
100051F5 33EA xor ebp,edx ; 异或运算
100051F7 C1E8 08 shr eax,0x8 ; eax右移8位相当于除8个2(EAX是32位的寄存器,前两个变为零)
100051FA 8B54AE 04 mov edx,dword ptr ds:[esi+ebp*4+0x4] ; 这里看不懂怎么来的,有可能是CRC32运算公式吧???懂这个的请指教
100051FE 33C2 xor eax,edx
10005200 41 inc ecx ; ecx自减1
10005201 4F dec edi ; 计数器,注册名MD5值奇数位 16个
10005202 ^ 75 E5 jnz short KeyData.100051E9
10005204 33C9 xor ecx,ecx
10005206 8D5424 14 lea edx,dword ptr ss:[esp+0x14] ; (ASCII "gK")
1000520A 894C24 15 mov dword ptr ss:[esp+0x15],ecx
1000520E 6A 10 push 0x10
10005210 F7D0 not eax ; 按位求反运算(即0变1,1变0)
=========================《CRC32》=================================
10005212 894C24 1D mov dword ptr ss:[esp+0x1D],ecx
10005216 52 push edx ; (UNICODE "g")
10005217 50 push eax
10005218 C64424 20 00 mov byte ptr ss:[esp+0x20],0x0
1000521D 884C24 29 mov byte ptr ss:[esp+0x29],cl
10005221 FF15 00720010 call dword ptr ds:[0x10007200] ; 把EAX中的值转化为字符串
10005227 8D7C24 20 lea edi,dword ptr ss:[esp+0x20] ; (ASCII "592ec4e6")
1000522B 83C9 FF or ecx,0xFFFFFFFF
1000522E 33C0 xor eax,eax
10005230 83C4 0C add esp,0xC
10005233 33F6 xor esi,esi
10005235 F2:AE repne scas byte ptr es:[edi] ; 扫描 ES:[EDI]字符串中的 AL值.值到找到AL值后停止
10005237 F7D1 not ecx ; 把exc取反
10005239 49 dec ecx ; 自减1
1000523A 74 28 je short KeyData.10005264
1000523C 8B2D C4710010 mov ebp,dword ptr ds:[0x100071C4] ; 依次取“592ec4e6”这个字符串的每一位
10005242 0FBE4434 14 movsx eax,byte ptr ss:[esp+esi+0x14]
10005247 50 push eax
10005248 FFD5 call ebp ; 字母小写转大写
1000524A 884434 18 mov byte ptr ss:[esp+esi+0x18],al
两组注册信息:
注册名:GeekCat ---> 注册码:34627BD1
注册名:GeekCat/P.Y.G ---> 注册码:04C3F43B