电竞比分网-中国电竞赛事及体育赛事平台

分享

算法分析第二課 WinNC的算法分析

 時來運轉(zhuǎn)小概率 2016-02-13
 本帖最后由 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
那就愉快的開始吧。
  1. 00D1043C  /.  55            push ebp                              ;  CLOCK_PROC
  2. 00D1043D  |.  8BEC          mov ebp,esp
  3. 00D1043F  |.  33C9          xor ecx,ecx
  4. 00D10441  |.  51            push ecx
  5. 00D10442  |.  51            push ecx
  6. 00D10443  |.  51            push ecx
  7. 00D10444  |.  51            push ecx
  8. 00D10445  |.  51            push ecx
  9. 00D10446  |.  53            push ebx
  10. 00D10447  |.  8BD8          mov ebx,eax
  11. 00D10449  |.  33C0          xor eax,eax
  12. 00D1044B  |.  55            push ebp
  13. 00D1044C  |.  68 4206D100   push WinNc.00D10642
  14. 00D10451  |.  64:FF30       push dword ptr fs:[eax]
  15. 00D10454  |.  64:8920       mov dword ptr fs:[eax],esp
  16. 00D10457  |.  8D55 F0       lea edx,[local.4]
  17. 00D1045A  |.  8B83 AC030000 mov eax,dword ptr ds:[ebx+0x3AC]
  18. 00D10460  |.  E8 877D7AFF   call WinNc.004B81EC                   ;  GetText(Void) 系統(tǒng)操作,無需理。
  19. 00D10465  |.  8B45 F0       mov eax,[local.4]                     ;  EAX -> 用戶名 -> WWW.XUEPOJIE.COM  -> 表示指針的意思
  20. 00D10468  |.  8D55 FC       lea edx,[local.1]                     ;  一段空的內(nèi)存空間地址 -> 給 edx
  21. 00D1046B  |.  E8 F84971FF   call WinNc.00424E68                   ;  eax -> *P -> 用戶名   二級指針
  22. 00D10470  |.  8D55 EC       lea edx,[local.5]                     ;  一段空的內(nèi)存空間地址 -> 給 edx
  23. 00D10473  |.  8B83 B4030000 mov eax,dword ptr ds:[ebx+0x3B4]
  24. 00D10479  |.  E8 6E7D7AFF   call WinNc.004B81EC
  25. 00D1047E  |.  8B45 EC       mov eax,[local.5]                     ;  EAX -> key  '888888888'  這段假注冊碼 長度 = 9
  26. 00D10481  |.  8D55 F8       lea edx,[local.2]
  27. 00D10484  |.  E8 DF4971FF   call WinNc.00424E68
  28. 00D10489  |.  8B45 FC       mov eax,[local.1]                     ;  eax -> 用戶名 -> WWW.XUEPOJIE.COM
  29. 00D1048C  |.  85C0          test eax,eax                          ;  判斷用戶名所在內(nèi)存地址 是否為0
  30. 00D1048E  |.  74 05         je short WinNc.00D10495
  31. 00D10490  |.  83E8 04       sub eax,0x4                           ;  指向字符串指針 - 0x4 向左移動 4個字節(jié)
  32. 00D10493  |.  8B00          mov eax,dword ptr ds:[eax]            ;  獲得 移動后指針 指向的內(nèi)容 4個字節(jié) 如果沒錯 應(yīng)該是字符串長度
  33. 00D10495  |>  83F8 04       cmp eax,0x4                           ;  就是用戶名的長度 和 0x4 對比 如果用戶名長度 小于4 則報錯
  34. 00D10498  |.  7D 3C         jge short WinNc.00D104D6              ;  這里必須跳走
  35. 00D1049A  |.  BA 5C06D100   mov edx,WinNc.00D1065C                ;  Please enter a valid registration name
  36. 00D1049F  |.  8B83 D4030000 mov eax,dword ptr ds:[ebx+0x3D4]
  37. 00D104A5  |.  E8 9E7D7AFF   call WinNc.004B8248
  38. 00D104AA  |.  8B8B EC030000 mov ecx,dword ptr ds:[ebx+0x3EC]
  39. 00D104B0  |.  33D2          xor edx,edx
  40. 00D104B2  |.  8B83 9C030000 mov eax,dword ptr ds:[ebx+0x39C]
  41. 00D104B8  |.  E8 1F6687FF   call WinNc.00586ADC
  42. 00D104BD  |.  8B83 D8030000 mov eax,dword ptr ds:[ebx+0x3D8]
  43. 00D104C3  |.  8B80 B8010000 mov eax,dword ptr ds:[eax+0x1B8]
  44. 00D104C9  |.  8B93 EC030000 mov edx,dword ptr ds:[ebx+0x3EC]
  45. 00D104CF  |.  E8 BC0278FF   call WinNc.00490790
  46. 00D104D4  |.  EB 3A         jmp short WinNc.00D10510
  47. 00D104D6  |>  33D2          xor edx,edx                           ;  edx 清零
  48. 00D104D8  |.  8B83 D4030000 mov eax,dword ptr ds:[ebx+0x3D4]
  49. 00D104DE  |.  E8 657D7AFF   call WinNc.004B8248
  50. 00D104E3  |.  8B8B EC030000 mov ecx,dword ptr ds:[ebx+0x3EC]
  51. 00D104E9  |.  BA 02000000   mov edx,0x2
  52. 00D104EE  |.  8B83 9C030000 mov eax,dword ptr ds:[ebx+0x39C]
  53. 00D104F4  |.  E8 E36587FF   call WinNc.00586ADC
  54. 00D104F9  |.  8B83 D8030000 mov eax,dword ptr ds:[ebx+0x3D8]
  55. 00D104FF  |.  8B80 B8010000 mov eax,dword ptr ds:[eax+0x1B8]
  56. 00D10505  |.  8B93 EC030000 mov edx,dword ptr ds:[ebx+0x3EC]
  57. 00D1050B  |.  E8 800278FF   call WinNc.00490790
  58. 00D10510  |>  E8 D33FC4FF   call WinNc.009544E8
  59. 00D10515  |.  8B4D F8       mov ecx,[local.2]                     ;  ecx -> 假碼
  60. 00D10518  |.  8B55 FC       mov edx,[local.1]                     ;  edx = 用戶名
  61. 00D1051B  |.  E8 204CC4FF   call WinNc.00955140                   ;  關(guān)鍵CALL 洛  跟進去
  62. 00D10520  |.  84C0          test al,al
  63. 00D10522  |.  75 14         jnz short WinNc.00D10538
  64. 00D10524  |.  E8 BF3FC4FF   call WinNc.009544E8
  65. 00D10529  |.  8B4D F8       mov ecx,[local.2]
  66. 00D1052C  |.  8B55 F4       mov edx,[local.3]
  67. 00D1052F  |.  E8 0C4CC4FF   call WinNc.00955140
  68. 00D10534  |.  84C0          test al,al
  69. 00D10536  |.  74 72         je short WinNc.00D105AA               ;  如果不跳 走向死亡 所以就要跳 顧名思義 上面就是 關(guān)鍵 CALL
  70. 00D10538  |>  33D2          xor edx,edx
  71. 00D1053A  |.  8B83 D0030000 mov eax,dword ptr ds:[ebx+0x3D0]
  72. 00D10540  |.  E8 037D7AFF   call WinNc.004B8248
  73. 00D10545  |.  B2 01         mov dl,0x1
  74. 00D10547  |.  8B83 A4030000 mov eax,dword ptr ds:[ebx+0x3A4]
  75. 00D1054D  |.  8B08          mov ecx,dword ptr ds:[eax]
  76. 00D1054F  |.  FF91 80000000 call dword ptr ds:[ecx+0x80]
  77. 00D10555  |.  8B83 A4030000 mov eax,dword ptr ds:[ebx+0x3A4]
  78. 00D1055B  |.  E8 4C3893FF   call WinNc.00643DAC
  79. 00D10560  |.  33D2          xor edx,edx
  80. 00D10562  |.  8B83 C4030000 mov eax,dword ptr ds:[ebx+0x3C4]
  81. 00D10568  |.  8B08          mov ecx,dword ptr ds:[eax]
  82. 00D1056A  |.  FF91 80000000 call dword ptr ds:[ecx+0x80]
  83. 00D10570  |.  8B83 C4030000 mov eax,dword ptr ds:[ebx+0x3C4]
  84. 00D10576  |.  E8 313893FF   call WinNc.00643DAC
  85. 00D1057B  |.  8B8B EC030000 mov ecx,dword ptr ds:[ebx+0x3EC]
  86. 00D10581  |.  BA 02000000   mov edx,0x2
  87. 00D10586  |.  8B83 9C030000 mov eax,dword ptr ds:[ebx+0x39C]
  88. 00D1058C  |.  E8 4B6587FF   call WinNc.00586ADC
  89. 00D10591  |.  8B83 B0030000 mov eax,dword ptr ds:[ebx+0x3B0]
  90. 00D10597  |.  8B80 B8010000 mov eax,dword ptr ds:[eax+0x1B8]
  91. 00D1059D  |.  8B93 EC030000 mov edx,dword ptr ds:[ebx+0x3EC]
  92. 00D105A3  |.  E8 E80178FF   call WinNc.00490790
  93. 00D105A8  |.  EB 70         jmp short WinNc.00D1061A
  94. 00D105AA  |>  BA B806D100   mov edx,WinNc.00D106B8                ;  Please enter a valid key
  95. 00D105AF  |.  8B83 D0030000 mov eax,dword ptr ds:[ebx+0x3D0]
  96. 00D105B5  |.  E8 8E7C7AFF   call WinNc.004B8248
復(fù)制代碼
算法一開始都是這樣的先判斷下KEY 或者 USERNAME的 長度。所以說沒啥大驚小怪的了,我們繼續(xù) 進入關(guān)鍵CALL
00955140  這段還是跟開始一樣對數(shù)據(jù)的簡單處理。核心的還在里面。
  1. 00955140  /[        DISCUZ_CODE_73        ]nbsp; 55            push ebp
  2. 00955141  |.  8BEC          mov ebp,esp
  3. 00955143  |.  83C4 F4       add esp,-0xC
  4. 00955146  |.  53            push ebx
  5. 00955147  |.  56            push esi
  6. 00955148  |.  33DB          xor ebx,ebx                           ;  EDX 清零
  7. 0095514A  |.  895D F4       mov [local.3],ebx                     ;  初始化變量
  8. 0095514D  |.  894D F8       mov [local.2],ecx                     ;  -> 假碼 賦值給變量 '888888888'
  9. 00955150  |.  8955 FC       mov [local.1],edx                     ;  -> 用戶名 賦值給變量 'WWW.XUEPOJIE.COM'
  10. 00955153  |.  8BF0          mov esi,eax
  11. 00955155  |.  8B45 FC       mov eax,[local.1]                     ;  EAX -> 用戶名 'WWW.XUEPOJIE.COM'
  12. 00955158  |.  E8 9B3CABFF   call WinNc.00408DF8                   ;  簡單 判斷用戶名所在內(nèi)存地址 是否合法
  13. 0095515D  |.  8B45 F8       mov eax,[local.2]                     ;  EAX -> 假碼 '888888888'
  14. 00955160  |.  E8 933CABFF   call WinNc.00408DF8                   ;  和上面那個CALL一樣 判斷 是否合法
  15. 00955165  |.  33C0          xor eax,eax                           ;  EAX 清零
  16. 00955167  |.  55            push ebp
  17. 00955168  |.  68 BC519500   push WinNc.009551BC
  18. 0095516D  |.  64:FF30       push dword ptr fs:[eax]
  19. 00955170  |.  64:8920       mov dword ptr fs:[eax],esp
  20. 00955173  |.  33DB          xor ebx,ebx                           ;  EBX 清零
  21. 00955175  |.  8B45 FC       mov eax,[local.1]                     ;  EAX -> 用戶名 'WWW.XUEPOJIE.COM'
  22. 00955178  |.  85C0          test eax,eax
  23. 0095517A  |.  74 05         je short WinNc.00955181               ;  地址是否合法
  24. 0095517C  |.  83E8 04       sub eax,0x4                           ;  用戶名指針 前移 四個字節(jié)
  25. 0095517F  |.  8B00          mov eax,dword ptr ds:[eax]            ;  前四字節(jié)所指向的內(nèi)容 就是他的長度 某編譯器專用 哈哈
  26. 00955181  |>  85C0          test eax,eax                          ;  確定長度不為0
  27. 00955183  |.  74 1C         je short WinNc.009551A1               ;  為0則跳
  28. 00955185  |.  8D4D F4       lea ecx,[local.3]
  29. 00955188  |.  8B55 FC       mov edx,[local.1]                     ;  EDX -> 用戶名 'WWW.XUEPOJIE.COM'
  30. 0095518B  |.  8BC6          mov eax,esi
  31. 0095518D  |.  E8 1AFEFFFF   call WinNc.00954FAC                   ;  或許這就是關(guān)鍵了,因為 下面沒啥東西了  我跟了
  32. 00955192  |.  8B45 F4       mov eax,[local.3]
  33. 00955195  |.  8B55 F8       mov edx,[local.2]
  34. 00955198  |.  E8 5750ABFF   call WinNc.0040A1F4
  35. 0095519D  |.  75 02         jnz short WinNc.009551A1
  36. 0095519F  |.  B3 01         mov bl,0x1
  37. 009551A1  |>  33C0          xor eax,eax
  38. 009551A3  |.  5A            pop edx
  39. 009551A4  |.  59            pop ecx
  40. 009551A5  |.  59            pop ecx
  41. 009551A6  |.  64:8910       mov dword ptr fs:[eax],edx
  42. 009551A9  |.  68 C3519500   push WinNc.009551C3
  43. 009551AE  |>  8D45 F4       lea eax,[local.3]
  44. 009551B1  |.  BA 03000000   mov edx,0x3
  45. 009551B6  |.  E8 B93BABFF   call WinNc.00408D74
  46. 009551BB  \.  C3            retn
復(fù)制代碼


00954FAC 這一段會獲取一個重要固定的字符串,具體往下看。
  1. 00954FAC  /[        DISCUZ_CODE_74        ]nbsp; 55            push ebp
  2. 00954FAD  |.  8BEC          mov ebp,esp
  3. 00954FAF  |.  51            push ecx
  4. 00954FB0  |.  53            push ebx
  5. 00954FB1  |.  56            push esi
  6. 00954FB2  |.  8BF1          mov esi,ecx
  7. 00954FB4  |.  8955 FC       mov [local.1],edx                     ;  將用戶名放入變量
  8. 00954FB7  |.  8BD8          mov ebx,eax
  9. 00954FB9  |.  8B45 FC       mov eax,[local.1]
  10. 00954FBC  |.  E8 373EABFF   call WinNc.00408DF8                   ;  EAX -> 用戶名 'WWW.XUEPOJIE.COM'
  11. 00954FC1  |.  33C0          xor eax,eax                           ;  清零 EAX
  12. 00954FC3  |.  55            push ebp
  13. 00954FC4  |.  68 F34F9500   push WinNc.00954FF3
  14. 00954FC9  |.  64:FF30       push dword ptr fs:[eax]
  15. 00954FCC  |.  64:8920       mov dword ptr fs:[eax],esp
  16. 00954FCF  |.  56            push esi
  17. 00954FD0  |.  8D4B 60       lea ecx,dword ptr ds:[ebx+0x60]       ;  在這里獲得一個 固定的字符 '7' 因為上面用到了FS寄存器,SO 敢說他是固定的
  18. 00954FD3  |.  8B55 FC       mov edx,[local.1]                     ;  EDX -> 用戶名 'WWW.XUEPOJIE.COM'
  19. 00954FD6  |.  8BC3          mov eax,ebx
  20. 00954FD8  |.  E8 13FEFFFF   call WinNc.00954DF0                   ;  接下來的就是迎接死亡吧, 斷斷續(xù)續(xù)之間存在密切聯(lián)系。來探索吧
  21. 00954FDD  |.  33C0          xor eax,eax
  22. 00954FDF  |.  5A            pop edx
  23. 00954FE0  |.  59            pop ecx
  24. 00954FE1  |.  59            pop ecx
  25. 00954FE2  |.  64:8910       mov dword ptr fs:[eax],edx
  26. 00954FE5  |.  68 FA4F9500   push WinNc.00954FFA
  27. 00954FEA  |>  8D45 FC       lea eax,[local.1]
  28. 00954FED  |.  E8 223DABFF   call WinNc.00408D14
  29. 00954FF2  \.  C3            retn
復(fù)制代碼
00954DF0 下面就是核心部分了,大家集中精神。我會詳解 他的兩層算法。
  1. 00954DF0  /[        DISCUZ_CODE_75        ]nbsp; 55            push ebp
  2. 00954DF1  |.  8BEC          mov ebp,esp
  3. 00954DF3  |.  83C4 BC       add esp,-0x44
  4. 00954DF6  |.  53            push ebx
  5. 00954DF7  |.  56            push esi
  6. 00954DF8  |.  57            push edi
  7. 00954DF9  |.  33DB          xor ebx,ebx
  8. 00954DFB  |.  895D BC       mov [local.17],ebx
  9. 00954DFE  |.  895D F8       mov [local.2],ebx
  10. 00954E01  |.  894D F4       mov [local.3],ecx                     ;  剛才獲取的 字符 '7' 放入變量 local.3
  11. 00954E04  |.  8955 FC       mov [local.1],edx                     ;  用戶名 'WWW.XUEPOJIE.COM' 放入變量
  12. 00954E07  |.  8B45 FC       mov eax,[local.1]                     ;  EAX -> 用戶名
  13. 00954E0A  |.  E8 E93FABFF   call WinNc.00408DF8
  14. 00954E0F  |.  33C0          xor eax,eax
  15. 00954E11  |.  55            push ebp
  16. 00954E12  |.  68 704F9500   push WinNc.00954F70
  17. 00954E17  |.  64:FF30       push dword ptr fs:[eax]
  18. 00954E1A  |.  64:8920       mov dword ptr fs:[eax],esp
  19. 00954E1D  |.  8B55 FC       mov edx,[local.1]                     ;  EDX - >用戶名
  20. 00954E20  |.  8BC2          mov eax,edx
  21. 00954E22  |.  85C0          test eax,eax
  22. 00954E24  |.  74 05         je short WinNc.00954E2B
  23. 00954E26  |.  83E8 04       sub eax,0x4
  24. 00954E29  |.  8B00          mov eax,dword ptr ds:[eax]
  25. 00954E2B  |>  83F8 03       cmp eax,0x3                           ;  用戶名 長度 和 0X3 比較
  26. 00954E2E  |.  7F 12         jg short WinNc.00954E42               ;  已經(jīng)要過去 否則 就 Invalid
  27. 00954E30  |.  8B45 08       mov eax,[arg.1]
  28. 00954E33  |.  BA 8C4F9500   mov edx,WinNc.00954F8C                ;  Invalid
  29. 00954E38  |.  E8 B742ABFF   call WinNc.004090F4
  30. 00954E3D  |.  E9 0B010000   jmp WinNc.00954F4D
  31. 00954E42  |>  C745 F0 03020>mov [local.4],0x203                   ;  將一個常量 放入 變量 LOCAL.4 這里要注意
  32. 00954E49  |.  8BC2          mov eax,edx                           ;  EAX - >用戶名
  33. 00954E4B  |.  85C0          test eax,eax
  34. 00954E4D  |.  74 05         je short WinNc.00954E54
  35. 00954E4F  |.  83E8 04       sub eax,0x4
  36. 00954E52  |.  8B00          mov eax,dword ptr ds:[eax]            ;  eax = 長度
  37. 00954E54  |>  8BF0          mov esi,eax                           ;  長度給ESI
  38. 00954E56  |.  85F6          test esi,esi                          ;  和上面 一樣 確定 長度是否合法
  39. 00954E58  |.  7E 3F         jle short WinNc.00954E99              ;  一級算法開始 :
復(fù)制代碼
第一層算法開始
  1. 00954E5A  |.  BB 01000000   mov ebx,0x1                           ;  初始化 ebx 循環(huán)
  2. 00954E5F  |>  55            /push ebp
  3. 00954E60  |.  8B45 FC       |mov eax,[local.1]                    ;  eax ->用戶名
  4. 00954E63  |.  4B            |dec ebx                              ;  ebx -1
  5. 00954E64  |.  85C0          |test eax,eax
  6. 00954E66  |.  74 05         |je short WinNc.00954E6D              ;  測試 用戶名 是否為 空
  7. 00954E68  |.  3B58 FC       |cmp ebx,dword ptr ds:[eax-0x4]       ;  判斷 長度 是否為 0
  8. 00954E6B  |.  72 05         |jb short WinNc.00954E72
  9. 00954E6D  |>  E8 561FABFF   |call WinNc.00406DC8
  10. 00954E72  |>  43            |inc ebx                              ;  ebx ++ 開始 循環(huán) 了
  11. 00954E73  |.  0FB74458 FE   |movzx eax,word ptr ds:[eax+ebx*2-0x2>;  第一次循環(huán)-取用戶名前兩個字節(jié) ASCII值給 EAX = 0057
  12. 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ù) 。
  1. 00954E7D  |.  59            |pop ecx                              ;  0012F44C
  2. 00954E7E  |.  0145 F0       |add [local.4],eax                    ;  還記得這個 LOCAL.4么 上面已經(jīng)給了 一個常量值 0x203
  3. 00954E81  |.  71 05         |jno short WinNc.00954E88
  4. 00954E83  |.  E8 481FABFF   |call WinNc.00406DD0
  5. 00954E88  |>  43            |inc ebx
  6. 00954E89  |.  4E            |dec esi
  7. 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ù)。
  1. 00954E8C  |. /EB 0B         jmp short WinNc.00954E99
  2. 00954E8E  |> |8D45 FC       /lea eax,[local.1]
  3. 00954E91  |. |8B55 FC       |mov edx,[local.1]
  4. 00954E94  |. |E8 6B51ABFF   |call WinNc.0040A004
  5. 00954E99  |> \8B45 FC        mov eax,[local.1]
  6. 00954E9C  |.  E8 6B43ABFF   |call WinNc.0040920C                  ;  得出 長度
  7. 00954EA1  |.  83F8 0C       |cmp eax,0xC
  8. 00954EA4  |.^ 7C E8         \jl short WinNc.00954E8E
  9. 00954EA6  |.  BB 01000000   mov ebx,0x1                           ;  初始化 ebx
  10. 00954EAB  |.  8B75 F4       mov esi,[local.3]                     ;  esi = 字符 '7'  即住他ESI 指向他
  11. 00954EAE  |.  8D7D C0       lea edi,[local.16]                    ;  估計 貓膩
  12. 00954EB1  |>  55            /push ebp
  13. 00954EB2  |.  8B45 FC       |mov eax,[local.1]
  14. 00954EB5  |.  4B            |dec ebx
  15. 00954EB6  |.  85C0          |test eax,eax
  16. 00954EB8  |.  74 05         |je short WinNc.00954EBF
  17. 00954EBA  |.  3B58 FC       |cmp ebx,dword ptr ds:[eax-0x4]
  18. 00954EBD  |.  72 05         |jb short WinNc.00954EC4              ;  判斷是否為 0 罷了
  19. 00954EBF  |>  E8 041FABFF   |call WinNc.00406DC8
  20. 00954EC4  |>  43            |inc ebx                              ; 計數(shù)開始
  21. 00954EC5  |.  0FB74458 FE   |movzx eax,word ptr ds:[eax+ebx*2-0x2>; 用戶名前兩字節(jié)ASCII 值給EAX   0057
  22. 00954ECA  |.  0306          |add eax,dword ptr ds:[esi]          EAX = EAX + 37    37就是 那個字符‘7’的ASCII 直                  
  23. 00954ECC  |.  71 05         |jno short WinNc.00954ED3
  24. 00954ECE  |.  E8 FD1EABFF   |call WinNc.00406DD0
  25. 00954ED3  |>  0345 F0       |add eax,[local.4]                    ;  說了注意 local 4  =  EAX + LOCAL .4
  26. 00954ED6  |.  71 05         |jno short WinNc.00954EDD
  27. 00954ED8  |.  E8 F31EABFF   |call WinNc.00406DD0
  28. 00954EDD  |>  99            |cdq
  29. 00954EDE  |.  33C2          |xor eax,edx
  30. 00954EE0  |.  2BC2          |sub eax,edx
  31. 00954EE2  |.  71 05         |jno short WinNc.00954EE9             ;  判斷是否為 0 罷了 另類
  32. 00954EE4  |.  E8 E71EABFF   |call WinNc.00406DD0
  33. 00954EE9  |>  E8 BAFEFFFF   |call WinNc.00954DA8                  ;  是否 跟不跟 跟 感覺這個CALL太 熟悉 了  就是第一層算法用的CALL  下面解析
  34. 00954EEE  |.  59            |pop ecx
  35. 00954EEF  |.  8907          |mov dword ptr ds:[edi],eax
  36. 00954EF1  |.  43            |inc ebx
  37. 00954EF2  |.  83C7 04       |add edi,0x4
  38. 00954EF5  |.  83C6 04       |add esi,0x4
  39. 00954EF8  |.  83FB 0D       |cmp ebx,0xD
  40. 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ù)字 就是 注冊碼了 ,看下面的 - 就知道 他是要 組裝了,我就不分析了。。
  1. 00954EFD  |.  8D45 F8       lea eax,[local.2]
  2. 00954F00  |.  E8 0F3EABFF   call WinNc.00408D14
  3. 00954F05  |.  BB 01000000   mov ebx,0x1
  4. 00954F0A  |.  8D75 C0       lea esi,[local.16]
  5. 00954F0D  |>  8D55 BC       /lea edx,[local.17]
  6. 00954F10  |.  8B06          |mov eax,dword ptr ds:[esi]
  7. 00954F12  |.  E8 2509ADFF   |call WinNc.0042583C
  8. 00954F17  |.  8B55 BC       |mov edx,[local.17]
  9. 00954F1A  |.  8D45 F8       |lea eax,[local.2]
  10. 00954F1D  |.  E8 E250ABFF   |call WinNc.0040A004
  11. 00954F22  |.  83FB 04       |cmp ebx,0x4
  12. 00954F25  |.  74 05         |je short WinNc.00954F2C
  13. 00954F27  |.  83FB 08       |cmp ebx,0x8
  14. 00954F2A  |.  75 0D         |jnz short WinNc.00954F39
  15. 00954F2C  |>  8D45 F8       |lea eax,[local.2]
  16. 00954F2F  |.  BA A84F9500   |mov edx,WinNc.00954FA8               ;  -
  17. 00954F34  |.  E8 CB50ABFF   |call WinNc.0040A004
  18. 00954F39  |>  43            |inc ebx
  19. 00954F3A  |.  83C6 04       |add esi,0x4
  20. 00954F3D  |.  83FB 0D       |cmp ebx,0xD
  21. 00954F40  |.^ 75 CB         \jnz short WinNc.00954F0D
  22. 00954F42  |.  8B45 08       mov eax,[arg.1]
  23. 00954F45  |.  8B55 F8       mov edx,[local.2]
  24. 00954F48  |.  E8 A741ABFF   call WinNc.004090F4
  25. 00954F4D  |>  33C0          xor eax,eax
  26. 00954F4F  |.  5A            pop edx
  27. 00954F50  |.  59            pop ecx
  28. 00954F51  |.  59            pop ecx
  29. 00954F52  |.  64:8910       mov dword ptr fs:[eax],edx
  30. 00954F55  |.  68 774F9500   push WinNc.00954F77
  31. 00954F5A  |>  8D45 BC       lea eax,[local.17]
  32. 00954F5D  |.  E8 B23DABFF   call WinNc.00408D14
  33. 00954F62  |.  8D45 F8       lea eax,[local.2]
  34. 00954F65  |.  BA 02000000   mov edx,0x2
  35. 00954F6A  |.  E8 053EABFF   call WinNc.00408D74
  36. 00954F6F  \.  C3            retn
復(fù)制代碼


組裝后的注冊碼是這樣的   5726-3347-5727   我們輸入測試下 。




本次算法教程到此結(jié)束。 感謝大家支持。我是 LYQingYe  我愛雪坡姐 。













    本站是提供個人知識管理的網(wǎng)絡(luò)存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點。請注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊一鍵舉報。
    轉(zhuǎn)藏 分享 獻花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多