PC 安全虎[Beta 1]演算法分析 (6千字)

看雪資料發表於2001-12-05

PC 安全虎[Beta 1]演算法分析

作者:PaulYoung ( 屬於 China Cracking Group )
簡介:不要再為朋友用自己電腦玩遊戲、看影碟、亂裝東西而煩惱不要再為孩子上有不健康內容的網站而擔心,不要再怕老弟偷用電話上網,PC安全虎全都輕鬆搞定!!
下載:http://shareware.onlinedown.net/download.asp?id={B2594856-886B-4224-A457-53C0976CB2B6}
工具:SoftICE v4.05
日期:2001-12-05

*************************************************************************************************

  輸入使用者名稱、假註冊碼,用 SoftICE V4.05 設斷 bpx hmemcpy ,中斷後按8下F12,F10單步跟蹤,直到……

:00408AD6 E825D50000              call 00416000    //驗證註冊碼,F8跟入
:00408ADB 83C408                  add esp, 00000008
:00408ADE 8945C8                  mov dword ptr [ebp-38], eax
:00408AE1 837DC800                cmp dword ptr [ebp-38], 00000000
:00408AE5 0F84AF000000            je 00408B9A

  繼續按F10,直到……

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:004161B6(U)
|
:0041615E 8B8574FFFFFF            mov eax, dword ptr [ebp+FFFFFF74]
:00416164 83C001                  add eax, 00000001
:00416167 898574FFFFFF            mov dword ptr [ebp+FFFFFF74], eax

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0041615C(U)
|
:0041616D 8B4DF0                  mov ecx, dword ptr [ebp-10]
:00416170 038D74FFFFFF            add ecx, dword ptr [ebp+FFFFFF74]
:00416176 0FBE11                  movsx edx, byte ptr [ecx]  //依次取使用者名稱字元的 ASCII 值,儲存到 edx
:00416179 85D2                    test edx, edx         //比較 edx 是否為0,即比較是否取完使用者名稱
:0041617B 743B                    je 004161B8         //取完即跳
:0041617D 83BD74FFFFFF1E          cmp dword ptr [ebp+FFFFFF74], 0000001E //取了多少個字元?
:00416184 7D32                    jge 004161B8                       //取夠30個則跳
:00416186 8B45F0                  mov eax, dword ptr [ebp-10]
:00416189 038574FFFFFF            add eax, dword ptr [ebp+FFFFFF74]
:0041618F 0FBE00                  movsx eax, byte ptr [eax]       //依次取字元的 ASCII 送 eax
:00416192 8B8D74FFFFFF            mov ecx, dword ptr [ebp+FFFFFF74]
:00416198 03848D78FFFFFF          add eax, dword ptr [ebp+4*ecx-00000088] //eax=eax+[ebp+4*ecx-00000088]這個變數
:0041619F 99                      cdq              //edx 清零
:004161A0 B917000000              mov ecx, 00000017 //把 ecx 置值為0x17
:004161A5 F7F9                    idiv ecx      //eax/ecx ,商放在 eax ,餘數放在 edx
:004161A7 83C242                  add edx, 00000042  //edx=餘數+0x42
:004161AA 8B8574FFFFFF            mov eax, dword ptr [ebp+FFFFFF74]
:004161B0 8890E07A4800            mov byte ptr [eax+00487AE0], dl  //把每次計算結果的ASCII值儲存
:004161B6 EBA6                    jmp 0041615E    //繼續取下一個字元

* Referenced by a (U)nconditional or (C)onditional Jump at Addresses:
|:0041617B(C), :00416184(C)
|
:004161B8 8B8D74FFFFFF            mov ecx, dword ptr [ebp+FFFFFF74]
:004161BE C681E07A480000          mov byte ptr [ecx+00487AE0], 00

* Possible Reference to Dialog: 
                                  |
:004161C5 68E07A4800              push 00487AE0      //計算結果入棧
:004161CA E8E1DB0000              call 00423DB0
:004161CF 83C404                  add esp, 00000004
:004161D2 83F805                  cmp eax, 00000005    //使用者名稱長度大於5嗎
:004161D5 7712                    ja 004161E9     //大於則跳

* Possible Reference to Dialog: 
                                  |
:004161D7 6828254800              push 00482528        //不跳則 CNIAWFKU 入棧
:004161DC 68E07A4800              push 00487AE0     //0<使用者名稱≤5時的計算結果入棧
:004161E1 E80AE10000              call 004242F0        //組成一個字串
:004161E6 83C408                  add esp, 00000008

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:004161D5(C)
|

* Possible Reference to Dialog: 
                                  |
:004161E9 68E07A4800              push 00487AE0              //正確註冊碼入棧
:004161EE 8D4D0C                  lea ecx, dword ptr [ebp+0C] //輸入的假註冊碼放到[ebp+0C]
:004161F1 E8BAB1FEFF              call 004013B0              //真假註冊碼比較
:004161F6 85C0                    test eax, eax
:004161F8 752D                    jne 00416227                //不等則跳,跳則死
:004161FA C7856CFFFFFF01000000    mov dword ptr [ebp+FFFFFF6C], 00000001
:00416204 C645FC00                mov [ebp-04], 00
:00416208 8D4D08                  lea ecx, dword ptr [ebp+08]
:0041620B E8F2C50200              call 00442802
:00416210 C745FCFFFFFFFF          mov [ebp-04], FFFFFFFF
:00416217 8D4D0C                  lea ecx, dword ptr [ebp+0C]
:0041621A E8E3C50200              call 00442802
:0041621F 8B856CFFFFFF            mov eax, dword ptr [ebp+FFFFFF6C]
:00416225 EB2B                    jmp 00416252

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:004161F8(C)
|
:00416227 C78568FFFFFF00000000    mov dword ptr [ebp+FFFFFF68], 00000000
:00416231 C645FC00                mov [ebp-04], 00
:00416235 8D4D08                  lea ecx, dword ptr [ebp+08]
:00416238 E8C5C50200              call 00442802
:0041623D C745FCFFFFFFFF          mov [ebp-04], FFFFFFFF
:00416244 8D4D0C                  lea ecx, dword ptr [ebp+0C]
:00416247 E8B6C50200              call 00442802
:0041624C 8B8568FFFFFF            mov eax, dword ptr [ebp+FFFFFF68]

* Referenced by a (U)nconditional or (C)onditional Jump at Addresses:
|:00416068(U), :00416225(U)
|
:00416252 8B4DF4                  mov ecx, dword ptr [ebp-0C]
:00416255 64890D00000000          mov dword ptr fs:[00000000], ecx
:0041625C 8BE5                    mov esp, ebp
:0041625E 5D                      pop ebp
:0041625F C3                      ret


演算法總結:
  1、先將使用者名稱每個字元的 ASCII 值加上一個數,這個數按其所在位數不同而不同。從第1位開始,1~30位所加的數依次為(十進位制):23、15、18、17、4、21、24、2、19、7、22、10、11、13、5、72、238、118、29、103、105、161、27、122、140、71、248、84、149、151。
  2、每位字元與上述對應的數相加後所得的和,除以 0x17 ,求得一個餘數。餘數再與 0x42 相加和的 ASCII 的值,作為對應使用者名稱位數的註冊碼,把使用者名稱各個字元計算出的結果依次排列成串。
  3、當0<使用者名稱≤5時,在計算結果後加上" CNIAWFKU ",作為正確的註冊碼。
  4、當5<使用者名稱≤30時,根據使用者名稱各位字元的ASCII值計算出結果(ASCII),排列成串直接作為正確的註冊碼。
  5、31位(包括31位)以後的字元,不列入計算範圍,即註冊碼最長為30位。
  6、中文算2個字元。

  呵……演算法其實非常的簡單,只是有點羅嗦。不過,如果這樣這樣設斷點的話,就不煩了, bpx 4161E9 do "d 487AE0" ,直接可見到正確註冊碼。呵……*^_^*

相關文章