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" ,直接可见到正确注册码。呵……*^_^*
- 标 题:PC 安全虎[Beta 1]算法分析 (6千字)
- 作 者:PaulYoung[CCG]
- 时 间:2001-12-5 20:35:53
- 链 接:http://bbs.pediy.com