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" ,直接可見到正確註冊碼。呵……*^_^*