能力值:
( LV13,RANK:1370 )
|
-
-
8 楼
00408A84 8B45 FC mov eax,dword ptr ss:[ebp-4]
00408A87 8B40 58 mov eax,dword ptr ds:[eax+58]
00408A8A E8 B9D9FFFF call 第二期作.00406448 ; 取用户名
00408A8F 83BD E0FDFFFF 0>cmp dword ptr ss:[ebp-220],0 ; 用户名是否为0
00408A96 0F84 EE010000 je 第二期作.00408C8A ; 是就跳到出错提示
00408A9C 83FE 08 cmp esi,8 ; 与8对比
00408A9F 0F82 E5010000 jb 第二期作.00408C8A ; 小于8就跳到出错地方
00408AA5 83FE 0F cmp esi,0F ; 与15做对比
00408AA8 0F87 DC010000 ja 第二期作.00408C8A ; 大于15就跳到出错地方
00408AAE 8D95 DCFDFFFF lea edx,dword ptr ss:[ebp-224]
00408AB4 8B45 FC mov eax,dword ptr ss:[ebp-4]
00408AB7 8B40 38 mov eax,dword ptr ds:[eax+38]
00408ABA E8 89D9FFFF call 第二期作.00406448 ; 取注册码
00408ABF 83BD DCFDFFFF 0>cmp dword ptr ss:[ebp-224],0 ; 是否为空
00408AC6 0F84 BE010000 je 第二期作.00408C8A ; 为空就跳到出错位置
00408ACC 8D55 F8 lea edx,dword ptr ss:[ebp-8]
00408ACF 8B45 FC mov eax,dword ptr ss:[ebp-4]
00408AD2 8B40 58 mov eax,dword ptr ds:[eax+58]
00408AD5 E8 6ED9FFFF call 第二期作.00406448
00408ADA 8D45 F4 lea eax,dword ptr ss:[ebp-C]
00408ADD E8 BEA4FFFF call 第二期作.00402FA0
00408AE2 8B45 F8 mov eax,dword ptr ss:[ebp-8] ; 用户名放入EAX
00408AE5 E8 12A6FFFF call 第二期作.004030FC ; 这个CALL是取用户名长度
00408AEA 8BF8 mov edi,eax ; 用户名位数放入EDX
00408AEC 85FF test edi,edi ; 对比EDI的值
00408AEE 76 7C jbe short 第二期作.00408B6C ; 小于等于就跳到408B6C处
00408AF0 BB 01000000 mov ebx,1 ; EBX赋值1
00408AF5 8B45 F8 mov eax,dword ptr ss:[ebp-8] ; 用户名ASCII码放入EAX,循环开始
00408AF8 0FB67418 FF movzx esi,byte ptr ds:[eax+ebx->; 逐个取用户名的ASCII十六进制码放入ESI
00408AFD 69C3 369C0300 imul eax,ebx,39C36 ; EAX=EBX*39C36
00408B03 0FAFF0 imul esi,eax ; ESI=ESI*EAX
00408B06 8BC6 mov eax,esi ; ESI的值放入EAX
00408B08 25 FF000000 and eax,0FF ; EAX的值与0FF做AND运算,放入EAX
00408B0D 8BD6 mov edx,esi ; ESI的值放入EDX
00408B0F C1EA 08 shr edx,8 ; 逻辑右移8位
00408B12 81E2 FF000000 and edx,0FF ; 与0FF做AND运算
00408B18 03C2 add eax,edx ; EAX=EAX+EDX
00408B1A 8BD6 mov edx,esi ; ESI的值放入EDX
00408B1C C1EA 10 shr edx,10 ; 右移16位
00408B1F 81E2 FF000000 and edx,0FF ; 与0FF做AND运算
00408B25 03C2 add eax,edx ; EAX=EAX+EDX
00408B27 8BD6 mov edx,esi ; ESI的值送入EDX
00408B29 C1EA 18 shr edx,18 ; 右移24位
00408B2C 81E2 FF000000 and edx,0FF ; 与0FF做AND运算
00408B32 03C2 add eax,edx ; EAX=EAX+EDX
00408B34 8BD6 mov edx,esi ; ESI的值送入EDX
00408B36 C1EA 20 shr edx,20 ; 右移32位
00408B39 81E2 FF000000 and edx,0FF ; 与0FF做AND运算
00408B3F 03C2 add eax,edx ; EAX=EAX+EDX
00408B41 8BF0 mov esi,eax ; EAX的值送入ESI
00408B43 8BC6 mov eax,esi ; ESI的值送入EAX,晕。。。
00408B45 25 FF000000 and eax,0FF ; 与0FF做AND运算
00408B4A 8D8D D8FDFFFF lea ecx,dword ptr ss:[ebp-228] ; 结果放在EBP-228中
00408B50 BA 02000000 mov edx,2 ; EDX赋值为2
00408B55 E8 66BBFFFF call 第二期作.004046C0
00408B5A 8B95 D8FDFFFF mov edx,dword ptr ss:[ebp-228] ; 计算结果放入EDX中
00408B60 8D45 F4 lea eax,dword ptr ss:[ebp-C]
00408B63 E8 9CA5FFFF call 第二期作.00403104
00408B68 43 inc ebx ; EBX=EBX+1,第一位开始逐个取用户名位数
00408B69 4F dec edi ; 用户名位数减1,逐个取
00408B6A ^ 75 89 jnz short 第二期作.00408AF5 ; 没有取完继续循环
00408B6C 8D55 F0 lea edx,dword ptr ss:[ebp-10] ; 计算结果放入EDX中
00408B6F 8B45 FC mov eax,dword ptr ss:[ebp-4]
00408B72 8B40 38 mov eax,dword ptr ds:[eax+38]
00408B75 E8 CED8FFFF call 第二期作.00406448 ; 取注册码位数
00408B7A 8D45 F0 lea eax,dword ptr ss:[ebp-10]
00408B7D FF15 78924000 call dword ptr ds:[409278] ; 第二期作.00408390
00408B83 83F8 04 cmp eax,4 ; 注册码位数是否大于4
00408B86 0F8C FE000000 jl 第二期作.00408C8A ; 小于跳到出错地方
00408B8C 8D45 EC lea eax,dword ptr ss:[ebp-14]
00408B8F E8 0CA4FFFF call 第二期作.00402FA0
00408B94 BE 01000000 mov esi,1 ; ESI赋值1
00408B99 8B45 F0 mov eax,dword ptr ss:[ebp-10] ; 注册码ASCII码放入EAX
00408B9C E8 5BA5FFFF call 第二期作.004030FC ; 这个CALL是计算注册码长度
00408BA1 8BF8 mov edi,eax ; 注册码位数放入EDI
00408BA3 D1FF sar edi,1 ; EDI的值算术右移1位
00408BA5 79 03 jns short 第二期作.00408BAA
00408BA7 83D7 00 adc edi,0 ; 带进位加0
00408BAA 85FF test edi,edi ; 对比EDI
00408BAC 0F86 B0000000 jbe 第二期作.00408C62 ; 小于等于就跳到4086C2处
00408BB2 8D9D E8FDFFFF lea ebx,dword ptr ss:[ebp-218]
00408BB8 8D85 E8FEFFFF lea eax,dword ptr ss:[ebp-118]
00408BBE 8945 E8 mov dword ptr ss:[ebp-18],eax
00408BC1 8D85 D0FDFFFF lea eax,dword ptr ss:[ebp-230] ; 循环开始
00408BC7 8B55 F0 mov edx,dword ptr ss:[ebp-10] ; EBP-10中放假注册码ASCII码
00408BCA 8A5432 FF mov dl,byte ptr ds:[edx+esi-1] ; 逐个取注册码16进制码放入EDX低位DL
00408BCE 8850 01 mov byte ptr ds:[eax+1],dl ; 再放入EAX+1地址
00408BD1 C600 01 mov byte ptr ds:[eax],1
00408BD4 8D95 D0FDFFFF lea edx,dword ptr ss:[ebp-230]
00408BDA 8D85 CCFDFFFF lea eax,dword ptr ss:[ebp-234] ; EBP-234中放前两位注册码
00408BE0 E8 FB99FFFF call 第二期作.004025E0
00408BE5 8D85 C8FDFFFF lea eax,dword ptr ss:[ebp-238]
00408BEB 8B55 F0 mov edx,dword ptr ss:[ebp-10] ; EBP-10中是假注册码
00408BEE 8A1432 mov dl,byte ptr ds:[edx+esi] ; 逐个取注册码下一位放入DL
00408BF1 8850 01 mov byte ptr ds:[eax+1],dl ; 第二位注册码放入EAX+1地址
00408BF4 C600 01 mov byte ptr ds:[eax],1
00408BF7 8D95 C8FDFFFF lea edx,dword ptr ss:[ebp-238]
00408BFD 8D85 CCFDFFFF lea eax,dword ptr ss:[ebp-234]
00408C03 B1 02 mov cl,2
00408C05 E8 A699FFFF call 第二期作.004025B0
00408C0A 8D95 CCFDFFFF lea edx,dword ptr ss:[ebp-234] ; 连续2位注册码放入EDX
00408C10 8D85 D4FDFFFF lea eax,dword ptr ss:[ebp-22C]
00408C16 E8 D5A4FFFF call 第二期作.004030F0
00408C1B 8B95 D4FDFFFF mov edx,dword ptr ss:[ebp-22C] ; 两位注册码放入EDX
00408C21 8B45 FC mov eax,dword ptr ss:[ebp-4]
00408C24 E8 9BFCFFFF call 第二期作.004088C4
00408C29 8803 mov byte ptr ds:[ebx],al ; AL中放着连续的两位注册码,放EBX地址中
00408C2B 8B45 E8 mov eax,dword ptr ss:[ebp-18]
00408C2E 8A00 mov al,byte ptr ds:[eax] ; 此处的内存地址的堆栈值
00408C30 3003 xor byte ptr ds:[ebx],al ; 每取两位注册码与堆栈值做异或运算
00408C32 8D8D C4FDFFFF lea ecx,dword ptr ss:[ebp-23C]
00408C38 33C0 xor eax,eax ; EAX清零
00408C3A 8A03 mov al,byte ptr ds:[ebx] ; 结果放入EAX
00408C3C BA 01000000 mov edx,1 ; 赋值EDX为1
00408C41 E8 7ABAFFFF call 第二期作.004046C0
00408C46 8B95 C4FDFFFF mov edx,dword ptr ss:[ebp-23C] ; 结果放入EDX
00408C4C 8D45 EC lea eax,dword ptr ss:[ebp-14]
00408C4F E8 B0A4FFFF call 第二期作.00403104
00408C54 83C6 02 add esi,2 ; ESI=DSI+2,两位两位的取
00408C57 FF45 E8 inc dword ptr ss:[ebp-18]
00408C5A 43 inc ebx ; EBX=EBX+1
00408C5B 4F dec edi ; EDI=EDI-1,逐个取注册码
00408C5C ^ 0F85 5FFFFFFF jnz 第二期作.00408BC1 ; 没有取完就继续循环
00408C62 8B45 F4 mov eax,dword ptr ss:[ebp-C] ; 用户名计算结果放入EAX
00408C65 8B55 EC mov edx,dword ptr ss:[ebp-14] ; 注册码计算结果放入EDX
00408C68 E8 4FA5FFFF call 第二期作.004031BC ; 关键算法2
00408C6D 75 08 jnz short 第二期作.00408C77 ; 不等就跳出错
00408C6F FF15 74924000 call dword ptr ds:[409274] ; 第二期作.00408564
00408C75 EB 13 jmp short 第二期作.00408C8A
00408C77 6A 00 push 0
00408C79 68 D08C4000 push 第二期作.00408CD0 ; 很抱歉
00408C7E 68 DC8C4000 push 第二期作.00408CDC ; 注册码出错
00408C83 6A 00 push 0
00408C85 E8 1EACFFFF call <jmp.&user32.MessageBoxA> ; 出错提示
00408C8A 33C0 xor eax,eax
00408C8C 5A pop edx
===============================================
004031BF 89C6 mov esi,eax ; EAX的值放入ESI(用户名计算结果)
004031C1 89D7 mov edi,edx ; EDX的值放入EDI(注册码计算结果)
004031C3 39D0 cmp eax,edx ; 对比EAX和EDX的值
004031C5 0F84 8F000000 je 第二期作.0040325A ; 相等跳
004031CB 85F6 test esi,esi ; ESI是否为0
004031CD 74 68 je short 第二期作.00403237 ; 是0就错
004031CF 85FF test edi,edi ; EDI是否为0
004031D1 74 6B je short 第二期作.0040323E ; 为0错
004031D3 8B46 FC mov eax,dword ptr ds:[esi-4] ; 用户名计算后的长度值放入EAX
004031D6 8B57 FC mov edx,dword ptr ds:[edi-4] ; 注册码计算后的长度值的值放入EDX
004031D9 29D0 sub eax,edx ; EAX=EAX-EDX
004031DB 77 02 ja short 第二期作.004031DF ; 大于就跳
004031DD 01C2 add edx,eax
004031DF 52 push edx
004031E0 C1EA 02 shr edx,2 ; EDX右移2
004031E3 74 26 je short 第二期作.0040320B ; 相等就跳
004031E5 8B0E mov ecx,dword ptr ds:[esi]
004031E7 8B1F mov ebx,dword ptr ds:[edi]
004031E9 39D9 cmp ecx,ebx
004031EB 75 58 jnz short 第二期作.00403245
004031ED 4A dec edx
004031EE 74 15 je short 第二期作.00403205
004031F0 8B4E 04 mov ecx,dword ptr ds:[esi+4]
004031F3 8B5F 04 mov ebx,dword ptr ds:[edi+4]
004031F6 39D9 cmp ecx,ebx
004031F8 75 4B jnz short 第二期作.00403245
004031FA 83C6 08 add esi,8 ; 用户名计算结果加8放入ESI
004031FD 83C7 08 add edi,8 ; 注册码计算结果加8放入EDI
00403200 4A dec edx ; EDX=EDX+1
00403201 ^ 75 E2 jnz short 第二期作.004031E5 ; 不等就循环
00403203 EB 06 jmp short 第二期作.0040320B
00403205 83C6 04 add esi,4 ; ESI=ESI+4
00403208 83C7 04 add edi,4 ; EDI=EDI+4
0040320B 5A pop edx
0040320C 83E2 03 and edx,3 ; EDX与3做AND运算
0040320F 74 22 je short 第二期作.00403233
00403211 8B0E mov ecx,dword ptr ds:[esi]
00403213 8B1F mov ebx,dword ptr ds:[edi]
00403215 38D9 cmp cl,bl ; 注册码结果第一位与0比较
00403217 75 41 jnz short 第二期作.0040325A ; 不是0就出错
00403219 4A dec edx
0040321A 74 17 je short 第二期作.00403233
0040321C 38FD cmp ch,bh ; 第二位与0比较
0040321E 75 3A jnz short 第二期作.0040325A
00403220 4A dec edx
00403221 74 10 je short 第二期作.00403233
00403223 81E3 0000FF00 and ebx,0FF0000 ; 0FF000与EBX做AND运算
00403229 81E1 0000FF00 and ecx,0FF0000 ; 0FF000与ECX做AND运算
0040322F 39D9 cmp ecx,ebx ; 对比两者
00403231 75 27 jnz short 第二期作.0040325A ; 不等就跳
00403233 01C0 add eax,eax
00403235 EB 23 jmp short 第二期作.0040325A
00403237 8B57 FC mov edx,dword ptr ds:[edi-4] ; 36放入EDX
0040323A 29D0 sub eax,edx
0040323C EB 1C jmp short 第二期作.0040325A
0040323E 8B46 FC mov eax,dword ptr ds:[esi-4]
00403241 29D0 sub eax,edx
00403243 EB 15 jmp short 第二期作.0040325A
00403245 5A pop edx
00403246 38D9 cmp cl,bl ; 对比两者计算后的第一个字符串
00403248 75 10 jnz short 第二期作.0040325A ; 不等就跳错
0040324A 38FD cmp ch,bh ; 对比第二个
0040324C 75 0C jnz short 第二期作.0040325A ; 不等就错
0040324E C1E9 10 shr ecx,10 ; ECX右移16位
00403251 C1EB 10 shr ebx,10 ; EDX右移16位
00403254 38D9 cmp cl,bl ; 对比第三个字符串
00403256 75 02 jnz short 第二期作.0040325A ; 不等就错
00403258 38FD cmp ch,bh ; 对比第四个字符串
0040325A 5F pop edi ; EDI的值出堆栈(注册码计算最终结果)
0040325B 5E pop esi ; ESI出栈(用户名计算最终结果)
0040325C 5B pop ebx
0040325D C3 retn
0040325E 8BC0 mov eax,eax
总结一下:
用户名ACCII的十六进制码*相应的位置数*39C36=A
[(A AND 0FF)+(A SHR 8 AND 0FF)+(A SHR 10 AND 0FF)+(A SHR 18 AND 0FF)+(A SHR 20 AND 0FF)] AND 0FF=B
逐次取两位注册码与8E 1C AA 38 C6 54 E2 70(004082CE处的内存地址中16进制值,我不知道这个在别的机器会不会变) 做异或运算=C
B和C的前4位要相等,我不知道还有没有其它的限制,因为单单用户名的算法就让人搞的头晕晕的.....
|