- UID
- 69674
注册时间2010-7-30
阅读权限8
最后登录1970-1-1
初入江湖
该用户从未签到
|
发表于 2010-12-27 08:45:17
|
显示全部楼层
回复 1# yangdashi
004013C8 push ebp
004013C9 mov ebp, esp
004013CB sub esp, 50
004013CE push esi
004013CF push ebx
004013D0 mov dword ptr [ebp-10], 1 ; 初始值j
004013D7 add esp, -0C
004013DA mov eax, dword ptr [ebp+C]
004013DD push eax ; /s
004013DE call <jmp.&msvcrt.strlen> ; \strlen
004013E3 add esp, 10
004013E6 mov dword ptr [ebp-8], eax
004013E9 add esp, -0C
004013EC mov eax, dword ptr [ebp+10]
004013EF push eax ; /s
004013F0 call <jmp.&msvcrt.strlen> ; \strlen
004013F5 add esp, 10
004013F8 mov dword ptr [ebp-4], eax
004013FB mov dword ptr [ebp-24], 1
00401402 cmp dword ptr [ebp-8], 5 ; 用户名必须5位
00401406 jnz 00401520
0040140C mov eax, dword ptr [ebp-8] ; 5
0040140F mov edx, eax
00401411 lea eax, dword ptr [edx+edx] ; 5 + 5 这里就是注册码的程度 10位
00401414 cmp dword ptr [ebp-4], eax
00401417 jnz 00401520
0040141D mov eax, dword ptr [ebp-8]
00401420 add eax, -3
00401423 mov dword ptr [ebp-4], eax
00401426 mov dword ptr [ebp-C], 0 ; 赋值0
0040142D lea esi, dword ptr [esi]
00401430 cmp dword ptr [ebp-C], 6 ; i=0 while(i <= 6)
00401434 jle short 00401440
00401436 jmp 00401500
0040143B nop
0040143C lea esi, dword ptr [esi]
00401440 mov eax, dword ptr [ebp+C] ; 载入用户名
00401443 mov edx, dword ptr [ebp-C]
00401446 add eax, edx
00401448 cmp byte ptr [eax], 7A ; z
0040144B jg 004014F0
00401451 mov eax, dword ptr [ebp+C]
00401454 mov edx, dword ptr [ebp-C]
00401457 add eax, edx
00401459 cmp byte ptr [eax], 60
0040145C jle 004014F0
00401462 mov eax, dword ptr [ebp+10] ; 载入注册码
00401465 mov edx, dword ptr [ebp-C]
00401468 add eax, edx
0040146A cmp byte ptr [eax], 5A ; Z
0040146D jg 004014F0
00401473 mov eax, dword ptr [ebp+10]
00401476 mov edx, dword ptr [ebp-C]
00401479 add eax, edx
0040147B cmp byte ptr [eax], 40 ; 上面一截都是对输入做限制~ 用户名:5位小写字符/注册码10位大写字符~~ 所以可以推断并不是所有用户名都能注册成功的!
0040147E jle short 004014F0
00401480 mov eax, dword ptr [ebp+10]
00401483 mov ecx, dword ptr [ebp-10] ; j
00401486 lea edx, dword ptr [ecx+eax] ; 修正注册码位置
00401489 movsx eax, byte ptr [edx] ; Sn[j]
0040148C mov edx, dword ptr [ebp-10] ; j
0040148F mov ecx, dword ptr [ebp+10]
00401492 add edx, ecx
00401494 lea ecx, dword ptr [edx-1] ; 修正注册码位置
00401497 movsx edx, byte ptr [ecx] ; Sn[j-1]
0040149A sub eax, edx ; Sn[j] - Sn[j-1]
0040149C cmp eax, dword ptr [ebp-C] ; if Sn[j] - Sn[j-1] = i
0040149F jnz short 004014F0
004014A1 mov eax, dword ptr [ebp+C] ; name
004014A4 mov ecx, dword ptr [ebp-C] ; i
004014A7 lea edx, dword ptr [ecx+eax] ; 修正用户名位置
004014AA movsx eax, byte ptr [edx] ; name
004014AD mov edx, dword ptr [ebp-10] ; j
004014B0 mov ecx, dword ptr [ebp+10]
004014B3 add edx, ecx
004014B5 lea ecx, dword ptr [edx-1]
004014B8 movsx edx, byte ptr [ecx] ; Sn[j-1]
004014BB mov ecx, eax
004014BD sub ecx, edx ; name - Sn[j-1]
004014BF mov dword ptr [ebp-34], ecx ; 计算结果A
004014C2 mov edx, dword ptr [ebp-10] ; j
004014C5 add edx, 2 ; k = j + 2
004014C8 mov ebx, 1D ; 0x1D(29)
004014CD mov eax, ebx
004014CF mov esi, edx
004014D1 cdq
004014D2 idiv esi ; N = 0x1D(29)/k
004014D4 mov ecx, eax
004014D6 lea ebx, dword ptr [ecx+1E] ; N + 0x1E(30)
004014D9 cmp dword ptr [ebp-34], ebx ; if A = N
004014DC jnz short 004014ED
004014DE add dword ptr [ebp-10], 2 ; j = j + 2
004014E2 mov eax, dword ptr [ebp-4]
004014E5 mov edx, eax
004014E7 lea eax, dword ptr [edx+edx]
004014EA mov dword ptr [ebp-4], eax
004014ED jmp short 004014F4
004014EF nop
004014F0 add dword ptr [ebp-4], -19
004014F4 inc dword ptr [ebp-C] ; i = i + 1
004014F7 jmp 00401430
004014FC lea esi, dword ptr [esi] ; 到这就够了,下面我们整理公式
00401500 add esp, -8
00401503 mov eax, dword ptr [ebp-4]
00401506 add eax, -9
00401509 lea edx, dword ptr [eax+eax]
0040150C push edx
0040150D mov eax, dword ptr [ebp+8]
00401510 push eax
00401511 call 00401548
00401516 add esp, 10
00401519 jmp short 0040153A
0040151B nop
0040151C lea esi, dword ptr [esi]
00401520 add esp, -0C
00401523 push 4 ; /LanguageID = 4 (LANG_CHINESE)
00401525 push 10 ; |Style = MB_OK|MB_ICONHAND|MB_APPLMODAL
00401527 push 0 ; |Title = NULL
00401529 push 00401308 ; |Text = ""
0040152E mov eax, dword ptr [ebp+8] ; |
00401531 push eax ; |hOwner
00401532 call <jmp.&USER32.MessageBoxExA> ; \MessageBoxExA
00401537 add esp, 0C
0040153A jmp short 00401540
0040153C jmp short 00401540
0040153E mov esi, esi
00401540 lea esp, dword ptr [ebp-58]
00401543 pop ebx
00401544 pop esi
00401545 leave
00401546 retn
【算法总结】
整理一下:
最初:
j = 1
i = 0
公式:
1.name - sn[j-1] = 29/(j+2) + 30
2.sn[j] - sn[j-1] = i
解个方程啊~~ 我们是要求出sn
那么公式变成如下了:
1.sn[j-1] = name - (29/(j+2) + 30)
2.sn[j] = i + sn[j-1]
;=================================================
;用户名:5位小写字母
;注册码:10位大写字母
;所以可以推断并不是所有用户名都能注册成功的!
;================================================= |
|