本帖最后由 LYQingYe 于 2015-8-27 21:58 編輯
我是LYQingYe,今天是算法分析的第二課,第一次課時,疏忽大意,寫糟了,這次課會很詳細的。希望大家能耐心的看下去,享受分析帶來的困境與成就。 不要問我 雪坡姐 是誰。其實是 "學(xué)破解" 的同音詞,我的輸入法有問題。 最后在聲明下,我愛雪坡姐。
軟件名稱: WinNc
編譯器: PEID查不出,貌似 VC++ 無關(guān)緊要 無殼
WinNc 簡體中文漢化版是一款極好的文件管理器,如同DOS時代的NC一樣相當?shù)暮糜?,極似Total Commander,除了提供一般的重命名、查看、編輯、復(fù)制、刪除、移動、新建等功能外,還提供了統(tǒng)計目錄大小和壓縮解壓縮的功能!
軟件下載地址 http://www./Soft/14586.html
愉快的開始吧!未注冊版本打開就會彈出一個NAG窗口 要你BUY ,他的驗證方式是 時時驗證 :所謂時時驗證就是 當你輸入注冊碼 或者 用戶名 或者更改 某個數(shù)值他都會觸發(fā) 驗證CALL 如果錯誤 他會有字符串提示 ,
驗證CALL可以通過 右鍵->中文搜索引擎->搜索錯誤提示字符串 在這我就不解釋了。很簡單的。是個重啟驗證。
此次調(diào)試所用到的用戶名 "WWW.XUEPOJIE.COM" 長度為 0x10 假碼為"888888888" 長度為0x9
那就愉快的開始吧。
- 00D1043C /. 55 push ebp ; CLOCK_PROC
- 00D1043D |. 8BEC mov ebp,esp
- 00D1043F |. 33C9 xor ecx,ecx
- 00D10441 |. 51 push ecx
- 00D10442 |. 51 push ecx
- 00D10443 |. 51 push ecx
- 00D10444 |. 51 push ecx
- 00D10445 |. 51 push ecx
- 00D10446 |. 53 push ebx
- 00D10447 |. 8BD8 mov ebx,eax
- 00D10449 |. 33C0 xor eax,eax
- 00D1044B |. 55 push ebp
- 00D1044C |. 68 4206D100 push WinNc.00D10642
- 00D10451 |. 64:FF30 push dword ptr fs:[eax]
- 00D10454 |. 64:8920 mov dword ptr fs:[eax],esp
- 00D10457 |. 8D55 F0 lea edx,[local.4]
- 00D1045A |. 8B83 AC030000 mov eax,dword ptr ds:[ebx+0x3AC]
- 00D10460 |. E8 877D7AFF call WinNc.004B81EC ; GetText(Void) 系統(tǒng)操作,無需理。
- 00D10465 |. 8B45 F0 mov eax,[local.4] ; EAX -> 用戶名 -> WWW.XUEPOJIE.COM -> 表示指針的意思
- 00D10468 |. 8D55 FC lea edx,[local.1] ; 一段空的內(nèi)存空間地址 -> 給 edx
- 00D1046B |. E8 F84971FF call WinNc.00424E68 ; eax -> *P -> 用戶名 二級指針
- 00D10470 |. 8D55 EC lea edx,[local.5] ; 一段空的內(nèi)存空間地址 -> 給 edx
- 00D10473 |. 8B83 B4030000 mov eax,dword ptr ds:[ebx+0x3B4]
- 00D10479 |. E8 6E7D7AFF call WinNc.004B81EC
- 00D1047E |. 8B45 EC mov eax,[local.5] ; EAX -> key '888888888' 這段假注冊碼 長度 = 9
- 00D10481 |. 8D55 F8 lea edx,[local.2]
- 00D10484 |. E8 DF4971FF call WinNc.00424E68
- 00D10489 |. 8B45 FC mov eax,[local.1] ; eax -> 用戶名 -> WWW.XUEPOJIE.COM
- 00D1048C |. 85C0 test eax,eax ; 判斷用戶名所在內(nèi)存地址 是否為0
- 00D1048E |. 74 05 je short WinNc.00D10495
- 00D10490 |. 83E8 04 sub eax,0x4 ; 指向字符串指針 - 0x4 向左移動 4個字節(jié)
- 00D10493 |. 8B00 mov eax,dword ptr ds:[eax] ; 獲得 移動后指針 指向的內(nèi)容 4個字節(jié) 如果沒錯 應(yīng)該是字符串長度
- 00D10495 |> 83F8 04 cmp eax,0x4 ; 就是用戶名的長度 和 0x4 對比 如果用戶名長度 小于4 則報錯
- 00D10498 |. 7D 3C jge short WinNc.00D104D6 ; 這里必須跳走
- 00D1049A |. BA 5C06D100 mov edx,WinNc.00D1065C ; Please enter a valid registration name
- 00D1049F |. 8B83 D4030000 mov eax,dword ptr ds:[ebx+0x3D4]
- 00D104A5 |. E8 9E7D7AFF call WinNc.004B8248
- 00D104AA |. 8B8B EC030000 mov ecx,dword ptr ds:[ebx+0x3EC]
- 00D104B0 |. 33D2 xor edx,edx
- 00D104B2 |. 8B83 9C030000 mov eax,dword ptr ds:[ebx+0x39C]
- 00D104B8 |. E8 1F6687FF call WinNc.00586ADC
- 00D104BD |. 8B83 D8030000 mov eax,dword ptr ds:[ebx+0x3D8]
- 00D104C3 |. 8B80 B8010000 mov eax,dword ptr ds:[eax+0x1B8]
- 00D104C9 |. 8B93 EC030000 mov edx,dword ptr ds:[ebx+0x3EC]
- 00D104CF |. E8 BC0278FF call WinNc.00490790
- 00D104D4 |. EB 3A jmp short WinNc.00D10510
- 00D104D6 |> 33D2 xor edx,edx ; edx 清零
- 00D104D8 |. 8B83 D4030000 mov eax,dword ptr ds:[ebx+0x3D4]
- 00D104DE |. E8 657D7AFF call WinNc.004B8248
- 00D104E3 |. 8B8B EC030000 mov ecx,dword ptr ds:[ebx+0x3EC]
- 00D104E9 |. BA 02000000 mov edx,0x2
- 00D104EE |. 8B83 9C030000 mov eax,dword ptr ds:[ebx+0x39C]
- 00D104F4 |. E8 E36587FF call WinNc.00586ADC
- 00D104F9 |. 8B83 D8030000 mov eax,dword ptr ds:[ebx+0x3D8]
- 00D104FF |. 8B80 B8010000 mov eax,dword ptr ds:[eax+0x1B8]
- 00D10505 |. 8B93 EC030000 mov edx,dword ptr ds:[ebx+0x3EC]
- 00D1050B |. E8 800278FF call WinNc.00490790
- 00D10510 |> E8 D33FC4FF call WinNc.009544E8
- 00D10515 |. 8B4D F8 mov ecx,[local.2] ; ecx -> 假碼
- 00D10518 |. 8B55 FC mov edx,[local.1] ; edx = 用戶名
- 00D1051B |. E8 204CC4FF call WinNc.00955140 ; 關(guān)鍵CALL 洛 跟進去
- 00D10520 |. 84C0 test al,al
- 00D10522 |. 75 14 jnz short WinNc.00D10538
- 00D10524 |. E8 BF3FC4FF call WinNc.009544E8
- 00D10529 |. 8B4D F8 mov ecx,[local.2]
- 00D1052C |. 8B55 F4 mov edx,[local.3]
- 00D1052F |. E8 0C4CC4FF call WinNc.00955140
- 00D10534 |. 84C0 test al,al
- 00D10536 |. 74 72 je short WinNc.00D105AA ; 如果不跳 走向死亡 所以就要跳 顧名思義 上面就是 關(guān)鍵 CALL
- 00D10538 |> 33D2 xor edx,edx
- 00D1053A |. 8B83 D0030000 mov eax,dword ptr ds:[ebx+0x3D0]
- 00D10540 |. E8 037D7AFF call WinNc.004B8248
- 00D10545 |. B2 01 mov dl,0x1
- 00D10547 |. 8B83 A4030000 mov eax,dword ptr ds:[ebx+0x3A4]
- 00D1054D |. 8B08 mov ecx,dword ptr ds:[eax]
- 00D1054F |. FF91 80000000 call dword ptr ds:[ecx+0x80]
- 00D10555 |. 8B83 A4030000 mov eax,dword ptr ds:[ebx+0x3A4]
- 00D1055B |. E8 4C3893FF call WinNc.00643DAC
- 00D10560 |. 33D2 xor edx,edx
- 00D10562 |. 8B83 C4030000 mov eax,dword ptr ds:[ebx+0x3C4]
- 00D10568 |. 8B08 mov ecx,dword ptr ds:[eax]
- 00D1056A |. FF91 80000000 call dword ptr ds:[ecx+0x80]
- 00D10570 |. 8B83 C4030000 mov eax,dword ptr ds:[ebx+0x3C4]
- 00D10576 |. E8 313893FF call WinNc.00643DAC
- 00D1057B |. 8B8B EC030000 mov ecx,dword ptr ds:[ebx+0x3EC]
- 00D10581 |. BA 02000000 mov edx,0x2
- 00D10586 |. 8B83 9C030000 mov eax,dword ptr ds:[ebx+0x39C]
- 00D1058C |. E8 4B6587FF call WinNc.00586ADC
- 00D10591 |. 8B83 B0030000 mov eax,dword ptr ds:[ebx+0x3B0]
- 00D10597 |. 8B80 B8010000 mov eax,dword ptr ds:[eax+0x1B8]
- 00D1059D |. 8B93 EC030000 mov edx,dword ptr ds:[ebx+0x3EC]
- 00D105A3 |. E8 E80178FF call WinNc.00490790
- 00D105A8 |. EB 70 jmp short WinNc.00D1061A
- 00D105AA |> BA B806D100 mov edx,WinNc.00D106B8 ; Please enter a valid key
- 00D105AF |. 8B83 D0030000 mov eax,dword ptr ds:[ebx+0x3D0]
- 00D105B5 |. E8 8E7C7AFF call WinNc.004B8248
復(fù)制代碼 算法一開始都是這樣的先判斷下KEY 或者 USERNAME的 長度。所以說沒啥大驚小怪的了,我們繼續(xù) 進入關(guān)鍵CALL
00955140 這段還是跟開始一樣對數(shù)據(jù)的簡單處理。核心的還在里面。
- 00955140 /[ DISCUZ_CODE_73 ]nbsp; 55 push ebp
- 00955141 |. 8BEC mov ebp,esp
- 00955143 |. 83C4 F4 add esp,-0xC
- 00955146 |. 53 push ebx
- 00955147 |. 56 push esi
- 00955148 |. 33DB xor ebx,ebx ; EDX 清零
- 0095514A |. 895D F4 mov [local.3],ebx ; 初始化變量
- 0095514D |. 894D F8 mov [local.2],ecx ; -> 假碼 賦值給變量 '888888888'
- 00955150 |. 8955 FC mov [local.1],edx ; -> 用戶名 賦值給變量 'WWW.XUEPOJIE.COM'
- 00955153 |. 8BF0 mov esi,eax
- 00955155 |. 8B45 FC mov eax,[local.1] ; EAX -> 用戶名 'WWW.XUEPOJIE.COM'
- 00955158 |. E8 9B3CABFF call WinNc.00408DF8 ; 簡單 判斷用戶名所在內(nèi)存地址 是否合法
- 0095515D |. 8B45 F8 mov eax,[local.2] ; EAX -> 假碼 '888888888'
- 00955160 |. E8 933CABFF call WinNc.00408DF8 ; 和上面那個CALL一樣 判斷 是否合法
- 00955165 |. 33C0 xor eax,eax ; EAX 清零
- 00955167 |. 55 push ebp
- 00955168 |. 68 BC519500 push WinNc.009551BC
- 0095516D |. 64:FF30 push dword ptr fs:[eax]
- 00955170 |. 64:8920 mov dword ptr fs:[eax],esp
- 00955173 |. 33DB xor ebx,ebx ; EBX 清零
- 00955175 |. 8B45 FC mov eax,[local.1] ; EAX -> 用戶名 'WWW.XUEPOJIE.COM'
- 00955178 |. 85C0 test eax,eax
- 0095517A |. 74 05 je short WinNc.00955181 ; 地址是否合法
- 0095517C |. 83E8 04 sub eax,0x4 ; 用戶名指針 前移 四個字節(jié)
- 0095517F |. 8B00 mov eax,dword ptr ds:[eax] ; 前四字節(jié)所指向的內(nèi)容 就是他的長度 某編譯器專用 哈哈
- 00955181 |> 85C0 test eax,eax ; 確定長度不為0
- 00955183 |. 74 1C je short WinNc.009551A1 ; 為0則跳
- 00955185 |. 8D4D F4 lea ecx,[local.3]
- 00955188 |. 8B55 FC mov edx,[local.1] ; EDX -> 用戶名 'WWW.XUEPOJIE.COM'
- 0095518B |. 8BC6 mov eax,esi
- 0095518D |. E8 1AFEFFFF call WinNc.00954FAC ; 或許這就是關(guān)鍵了,因為 下面沒啥東西了 我跟了
- 00955192 |. 8B45 F4 mov eax,[local.3]
- 00955195 |. 8B55 F8 mov edx,[local.2]
- 00955198 |. E8 5750ABFF call WinNc.0040A1F4
- 0095519D |. 75 02 jnz short WinNc.009551A1
- 0095519F |. B3 01 mov bl,0x1
- 009551A1 |> 33C0 xor eax,eax
- 009551A3 |. 5A pop edx
- 009551A4 |. 59 pop ecx
- 009551A5 |. 59 pop ecx
- 009551A6 |. 64:8910 mov dword ptr fs:[eax],edx
- 009551A9 |. 68 C3519500 push WinNc.009551C3
- 009551AE |> 8D45 F4 lea eax,[local.3]
- 009551B1 |. BA 03000000 mov edx,0x3
- 009551B6 |. E8 B93BABFF call WinNc.00408D74
- 009551BB \. C3 retn
復(fù)制代碼
00954FAC 這一段會獲取一個重要固定的字符串,具體往下看。
- 00954FAC /[ DISCUZ_CODE_74 ]nbsp; 55 push ebp
- 00954FAD |. 8BEC mov ebp,esp
- 00954FAF |. 51 push ecx
- 00954FB0 |. 53 push ebx
- 00954FB1 |. 56 push esi
- 00954FB2 |. 8BF1 mov esi,ecx
- 00954FB4 |. 8955 FC mov [local.1],edx ; 將用戶名放入變量
- 00954FB7 |. 8BD8 mov ebx,eax
- 00954FB9 |. 8B45 FC mov eax,[local.1]
- 00954FBC |. E8 373EABFF call WinNc.00408DF8 ; EAX -> 用戶名 'WWW.XUEPOJIE.COM'
- 00954FC1 |. 33C0 xor eax,eax ; 清零 EAX
- 00954FC3 |. 55 push ebp
- 00954FC4 |. 68 F34F9500 push WinNc.00954FF3
- 00954FC9 |. 64:FF30 push dword ptr fs:[eax]
- 00954FCC |. 64:8920 mov dword ptr fs:[eax],esp
- 00954FCF |. 56 push esi
- 00954FD0 |. 8D4B 60 lea ecx,dword ptr ds:[ebx+0x60] ; 在這里獲得一個 固定的字符 '7' 因為上面用到了FS寄存器,SO 敢說他是固定的
- 00954FD3 |. 8B55 FC mov edx,[local.1] ; EDX -> 用戶名 'WWW.XUEPOJIE.COM'
- 00954FD6 |. 8BC3 mov eax,ebx
- 00954FD8 |. E8 13FEFFFF call WinNc.00954DF0 ; 接下來的就是迎接死亡吧, 斷斷續(xù)續(xù)之間存在密切聯(lián)系。來探索吧
- 00954FDD |. 33C0 xor eax,eax
- 00954FDF |. 5A pop edx
- 00954FE0 |. 59 pop ecx
- 00954FE1 |. 59 pop ecx
- 00954FE2 |. 64:8910 mov dword ptr fs:[eax],edx
- 00954FE5 |. 68 FA4F9500 push WinNc.00954FFA
- 00954FEA |> 8D45 FC lea eax,[local.1]
- 00954FED |. E8 223DABFF call WinNc.00408D14
- 00954FF2 \. C3 retn
復(fù)制代碼 00954DF0 下面就是核心部分了,大家集中精神。我會詳解 他的兩層算法。
- 00954DF0 /[ DISCUZ_CODE_75 ]nbsp; 55 push ebp
- 00954DF1 |. 8BEC mov ebp,esp
- 00954DF3 |. 83C4 BC add esp,-0x44
- 00954DF6 |. 53 push ebx
- 00954DF7 |. 56 push esi
- 00954DF8 |. 57 push edi
- 00954DF9 |. 33DB xor ebx,ebx
- 00954DFB |. 895D BC mov [local.17],ebx
- 00954DFE |. 895D F8 mov [local.2],ebx
- 00954E01 |. 894D F4 mov [local.3],ecx ; 剛才獲取的 字符 '7' 放入變量 local.3
- 00954E04 |. 8955 FC mov [local.1],edx ; 用戶名 'WWW.XUEPOJIE.COM' 放入變量
- 00954E07 |. 8B45 FC mov eax,[local.1] ; EAX -> 用戶名
- 00954E0A |. E8 E93FABFF call WinNc.00408DF8
- 00954E0F |. 33C0 xor eax,eax
- 00954E11 |. 55 push ebp
- 00954E12 |. 68 704F9500 push WinNc.00954F70
- 00954E17 |. 64:FF30 push dword ptr fs:[eax]
- 00954E1A |. 64:8920 mov dword ptr fs:[eax],esp
- 00954E1D |. 8B55 FC mov edx,[local.1] ; EDX - >用戶名
- 00954E20 |. 8BC2 mov eax,edx
- 00954E22 |. 85C0 test eax,eax
- 00954E24 |. 74 05 je short WinNc.00954E2B
- 00954E26 |. 83E8 04 sub eax,0x4
- 00954E29 |. 8B00 mov eax,dword ptr ds:[eax]
- 00954E2B |> 83F8 03 cmp eax,0x3 ; 用戶名 長度 和 0X3 比較
- 00954E2E |. 7F 12 jg short WinNc.00954E42 ; 已經(jīng)要過去 否則 就 Invalid
- 00954E30 |. 8B45 08 mov eax,[arg.1]
- 00954E33 |. BA 8C4F9500 mov edx,WinNc.00954F8C ; Invalid
- 00954E38 |. E8 B742ABFF call WinNc.004090F4
- 00954E3D |. E9 0B010000 jmp WinNc.00954F4D
- 00954E42 |> C745 F0 03020>mov [local.4],0x203 ; 將一個常量 放入 變量 LOCAL.4 這里要注意
- 00954E49 |. 8BC2 mov eax,edx ; EAX - >用戶名
- 00954E4B |. 85C0 test eax,eax
- 00954E4D |. 74 05 je short WinNc.00954E54
- 00954E4F |. 83E8 04 sub eax,0x4
- 00954E52 |. 8B00 mov eax,dword ptr ds:[eax] ; eax = 長度
- 00954E54 |> 8BF0 mov esi,eax ; 長度給ESI
- 00954E56 |. 85F6 test esi,esi ; 和上面 一樣 確定 長度是否合法
- 00954E58 |. 7E 3F jle short WinNc.00954E99 ; 一級算法開始 :
復(fù)制代碼 第一層算法開始
- 00954E5A |. BB 01000000 mov ebx,0x1 ; 初始化 ebx 循環(huán)
- 00954E5F |> 55 /push ebp
- 00954E60 |. 8B45 FC |mov eax,[local.1] ; eax ->用戶名
- 00954E63 |. 4B |dec ebx ; ebx -1
- 00954E64 |. 85C0 |test eax,eax
- 00954E66 |. 74 05 |je short WinNc.00954E6D ; 測試 用戶名 是否為 空
- 00954E68 |. 3B58 FC |cmp ebx,dword ptr ds:[eax-0x4] ; 判斷 長度 是否為 0
- 00954E6B |. 72 05 |jb short WinNc.00954E72
- 00954E6D |> E8 561FABFF |call WinNc.00406DC8
- 00954E72 |> 43 |inc ebx ; ebx ++ 開始 循環(huán) 了
- 00954E73 |. 0FB74458 FE |movzx eax,word ptr ds:[eax+ebx*2-0x2>; 第一次循環(huán)-取用戶名前兩個字節(jié) ASCII值給 EAX = 0057
- 00954E78 |. E8 2BFFFFFF |call WinNc.00954DA8 ; 這個CALL要 進去,肯定是計算的
復(fù)制代碼
第一次循環(huán),取的是用戶名前兩個字節(jié) 的ASCII值 0057 放到EAX ECX初始化為 0XA
第一步 用EAX/ECX = 57 / 0XA 商放在EAX 余數(shù)在 EDX 此時 EAX = 8 EDX = 7 同時 ESI = EDX+ESI = 7 + 0 = 7
第二步 又想上面那樣,先回復(fù)下EAX原有的值,57 然后再計算,最后判斷商是否為0 如果為0 跳出循環(huán),顯然第一次循環(huán)EAX不等于0
第二次循環(huán) EAX = 8 ECX = 0XA EAX/ECX = 8 / 0XA EAX = 0 EDX = 8 ESI = EDX+ESI = 8 + 7 = 0XF 十六進制的 此時EAX = 0
跳出循環(huán) ESI和0X9 比較 不滿足 條件 EAX = ESI 繼續(xù)重復(fù)我們上面的 運算 最后得出 ESI = 6 將ESI的值給EAX RETU 返回。別忘記外面還有一層循環(huán),別著急。
我們返回到調(diào)用CALL的下一行代碼我們繼續(xù) 。
- 00954E7D |. 59 |pop ecx ; 0012F44C
- 00954E7E |. 0145 F0 |add [local.4],eax ; 還記得這個 LOCAL.4么 上面已經(jīng)給了 一個常量值 0x203
- 00954E81 |. 71 05 |jno short WinNc.00954E88
- 00954E83 |. E8 481FABFF |call WinNc.00406DD0
- 00954E88 |> 43 |inc ebx
- 00954E89 |. 4E |dec esi
- 00954E8A |.^ 75 D3 \jnz short WinNc.00954E5F ; 注意 local .4 的值
復(fù)制代碼
LOCAL.4 = LOCAL.4 + ESI 本身LOCAL.4的值是一個常量0X203 第一次循環(huán)取得是 用戶名前兩位字節(jié) 并運算 得到 一個數(shù)值 6 并且和 LOCAL.4的值 進行運算 同樣的 道理將 用戶名 所有 值運算 在 和 LOCAL.4的值運算 結(jié)果得到 一個數(shù)值 LOCAL.4 = 0X250 這個數(shù)值很有用。
下面進行第二層算法,就是要對 這個值 進行不一樣的處理。 我們繼續(xù)。
- 00954E8C |. /EB 0B jmp short WinNc.00954E99
- 00954E8E |> |8D45 FC /lea eax,[local.1]
- 00954E91 |. |8B55 FC |mov edx,[local.1]
- 00954E94 |. |E8 6B51ABFF |call WinNc.0040A004
- 00954E99 |> \8B45 FC mov eax,[local.1]
- 00954E9C |. E8 6B43ABFF |call WinNc.0040920C ; 得出 長度
- 00954EA1 |. 83F8 0C |cmp eax,0xC
- 00954EA4 |.^ 7C E8 \jl short WinNc.00954E8E
- 00954EA6 |. BB 01000000 mov ebx,0x1 ; 初始化 ebx
- 00954EAB |. 8B75 F4 mov esi,[local.3] ; esi = 字符 '7' 即住他ESI 指向他
- 00954EAE |. 8D7D C0 lea edi,[local.16] ; 估計 貓膩
- 00954EB1 |> 55 /push ebp
- 00954EB2 |. 8B45 FC |mov eax,[local.1]
- 00954EB5 |. 4B |dec ebx
- 00954EB6 |. 85C0 |test eax,eax
- 00954EB8 |. 74 05 |je short WinNc.00954EBF
- 00954EBA |. 3B58 FC |cmp ebx,dword ptr ds:[eax-0x4]
- 00954EBD |. 72 05 |jb short WinNc.00954EC4 ; 判斷是否為 0 罷了
- 00954EBF |> E8 041FABFF |call WinNc.00406DC8
- 00954EC4 |> 43 |inc ebx ; 計數(shù)開始
- 00954EC5 |. 0FB74458 FE |movzx eax,word ptr ds:[eax+ebx*2-0x2>; 用戶名前兩字節(jié)ASCII 值給EAX 0057
- 00954ECA |. 0306 |add eax,dword ptr ds:[esi] EAX = EAX + 37 37就是 那個字符‘7’的ASCII 直
- 00954ECC |. 71 05 |jno short WinNc.00954ED3
- 00954ECE |. E8 FD1EABFF |call WinNc.00406DD0
- 00954ED3 |> 0345 F0 |add eax,[local.4] ; 說了注意 local 4 = EAX + LOCAL .4
- 00954ED6 |. 71 05 |jno short WinNc.00954EDD
- 00954ED8 |. E8 F31EABFF |call WinNc.00406DD0
- 00954EDD |> 99 |cdq
- 00954EDE |. 33C2 |xor eax,edx
- 00954EE0 |. 2BC2 |sub eax,edx
- 00954EE2 |. 71 05 |jno short WinNc.00954EE9 ; 判斷是否為 0 罷了 另類
- 00954EE4 |. E8 E71EABFF |call WinNc.00406DD0
- 00954EE9 |> E8 BAFEFFFF |call WinNc.00954DA8 ; 是否 跟不跟 跟 感覺這個CALL太 熟悉 了 就是第一層算法用的CALL 下面解析
- 00954EEE |. 59 |pop ecx
- 00954EEF |. 8907 |mov dword ptr ds:[edi],eax
- 00954EF1 |. 43 |inc ebx
- 00954EF2 |. 83C7 04 |add edi,0x4
- 00954EF5 |. 83C6 04 |add esi,0x4
- 00954EF8 |. 83FB 0D |cmp ebx,0xD
- 00954EFB |.^ 75 B4 \jnz short WinNc.00954EB1
復(fù)制代碼
居然是第一層算法用的CALL 不著急 此時 EAX = LOCAL .4 + EAX = 250 + 57 + 37 = 0X 2DE
第一次循環(huán) EAX / ECX = 2DE / 0XA EAX = 49 EDX = 4 ESI = EDX + ESI = 4 EAX 不為0 繼續(xù)循環(huán)
繼續(xù)循環(huán) EAX = 49 EAX / ECX = 49/ 0XA EAX = 7 EDX = 3 ESI = EDX + ESI = 7 EAX 不為0繼續(xù)
EAX = 7 EAX / ECX = 7 / 0XA EAX = 0 EDX = 7 ESI = EDX + ESI = E EAX = 0 跳出循環(huán)
ESI 和 0X9 比較 不滿足 再次 執(zhí)行算法 最后得出 ESI= 5 EAX = ESI 返回CALL EAX = 5
用戶名 前兩個字節(jié)運算得出 一個數(shù) = 5 同理 我們在繼續(xù) 循環(huán) 看下 最后得出 一串 數(shù)字 572633475727
其實 這串數(shù)字 就是 注冊碼了 ,看下面的 - 就知道 他是要 組裝了,我就不分析了。。
- 00954EFD |. 8D45 F8 lea eax,[local.2]
- 00954F00 |. E8 0F3EABFF call WinNc.00408D14
- 00954F05 |. BB 01000000 mov ebx,0x1
- 00954F0A |. 8D75 C0 lea esi,[local.16]
- 00954F0D |> 8D55 BC /lea edx,[local.17]
- 00954F10 |. 8B06 |mov eax,dword ptr ds:[esi]
- 00954F12 |. E8 2509ADFF |call WinNc.0042583C
- 00954F17 |. 8B55 BC |mov edx,[local.17]
- 00954F1A |. 8D45 F8 |lea eax,[local.2]
- 00954F1D |. E8 E250ABFF |call WinNc.0040A004
- 00954F22 |. 83FB 04 |cmp ebx,0x4
- 00954F25 |. 74 05 |je short WinNc.00954F2C
- 00954F27 |. 83FB 08 |cmp ebx,0x8
- 00954F2A |. 75 0D |jnz short WinNc.00954F39
- 00954F2C |> 8D45 F8 |lea eax,[local.2]
- 00954F2F |. BA A84F9500 |mov edx,WinNc.00954FA8 ; -
- 00954F34 |. E8 CB50ABFF |call WinNc.0040A004
- 00954F39 |> 43 |inc ebx
- 00954F3A |. 83C6 04 |add esi,0x4
- 00954F3D |. 83FB 0D |cmp ebx,0xD
- 00954F40 |.^ 75 CB \jnz short WinNc.00954F0D
- 00954F42 |. 8B45 08 mov eax,[arg.1]
- 00954F45 |. 8B55 F8 mov edx,[local.2]
- 00954F48 |. E8 A741ABFF call WinNc.004090F4
- 00954F4D |> 33C0 xor eax,eax
- 00954F4F |. 5A pop edx
- 00954F50 |. 59 pop ecx
- 00954F51 |. 59 pop ecx
- 00954F52 |. 64:8910 mov dword ptr fs:[eax],edx
- 00954F55 |. 68 774F9500 push WinNc.00954F77
- 00954F5A |> 8D45 BC lea eax,[local.17]
- 00954F5D |. E8 B23DABFF call WinNc.00408D14
- 00954F62 |. 8D45 F8 lea eax,[local.2]
- 00954F65 |. BA 02000000 mov edx,0x2
- 00954F6A |. E8 053EABFF call WinNc.00408D74
- 00954F6F \. C3 retn
復(fù)制代碼
組裝后的注冊碼是這樣的 5726-3347-5727 我們輸入測試下 。
本次算法教程到此結(jié)束。 感謝大家支持。我是 LYQingYe 我愛雪坡姐 。
|