10:50 2005-4-18
破解电脑报2003光盘软件Throttle
这个软件是用来调整上网设置的,据说会使上网速度快200-300%
能应用于各种操作系统
用PECompact 1.68 - 1.84 -> Jeremy Collake加壳
但是用Peid找到的OEP居然是假的!
我不得不手动脱壳,这还是第一次。
浮点数作为注册码
我不得不再次翻阅有关浮点的资料,总算搞清了,我自已以为。
破文在说明浮点运算上,可能让人看不明白,不过经过多次跟踪,我还是知道是什么意思了。
破解人:wofan[OCN][PYG]
OD载入,输入:
name:wofan
serial:123456789 后来证明这个假码是不合法的
在这里下断:
0047A0CE . BA 80A44700 mov edx,unpack.0047A480 ; ASCII "Name"
0047A0D3 . 8B45 EC mov eax,dword ptr ss:[ebp-14]
0047A0D6 . E8 316BFAFF call unpack.00420C0C
0047A0DB . 8B4D F8 mov ecx,dword ptr ss:[ebp-8]
0047A0DE . BA 90A44700 mov edx,unpack.0047A490 ; ASCII "Serial"
省略一大段,无非是注册名,注册框是否为空,并取得注册名长度,注册码长度
0047A1B8 . 8BD3 mov edx,ebx
0047A1BA . 8B45 FC mov eax,dword ptr ss:[ebp-4]
0047A1BD . E8 A6A3F8FF call unpack.00404568
0047A1C2 . 8B45 D4 mov eax,dword ptr ss:[ebp-2C] 注册名首址送EAX,开始处理注册名wofan
0047A1C5 . 0FB600 movzx eax,byte ptr ds:[eax] 逐位ASCII送EAX,第一位77(w)
0047A1C8 . F7EB imul ebx EBX中是循环次数 77*1=77
0047A1CA . 8945 D0 mov dword ptr ss:[ebp-30],eax 保存起来,
0047A1CD . DB45 D0 fild dword ptr ss:[ebp-30] 浮点运算,
0047A1D0 . E8 A788F8FF call unpack.00402A7C
0047A1D5 . 8945 C8 mov dword ptr ss:[ebp-38],eax
0047A1D8 . 8955 CC mov dword ptr ss:[ebp-34],edx
0047A1DB . DF6D C8 fild qword ptr ss:[ebp-38]
0047A1DE . 83C4 F4 add esp,-0C
0047A1E1 . DB3C24 fstp tbyte ptr ss:[esp] ; |
0047A1E4 . 9B wait ; |
0047A1E5 . 8D55 D8 lea edx,dword ptr ss:[ebp-28] ; |
0047A1E8 . B8 ACA44700 mov eax,unpack.0047A4AC ; |
0047A1ED . E8 DEF8F8FF call unpack.00409AD0 ; \unpack.00409AD0
0047A1F2 . FF75 D8 push dword ptr ss:[ebp-28] 77的十进制119
0047A1F5 . 8D55 C4 lea edx,dword ptr ss:[ebp-3C]
0047A1F8 . 8BC3 mov eax,ebx
0047A1FA . E8 99E0F8FF call unpack.00408298
0047A1FF . FF75 C4 push dword ptr ss:[ebp-3C]
0047A202 . FF35 481F4800 push dword ptr ds:[481F48]
0047A208 . 8D45 E8 lea eax,dword ptr ss:[ebp-18]
0047A20B . BA 03000000 mov edx,3
0047A210 . E8 B3A1F8FF call unpack.004043C8 连接
0047A215 . 8B45 E8 mov eax,dword ptr ss:[ebp-18] 1191
0047A218 . E8 B7E1F8FF call unpack.004083D4 取1191的十六进制数4A7
0047A21D . 8BF0 mov esi,eax
0047A21F . 8B45 E8 mov eax,dword ptr ss:[ebp-18]
0047A222 . E8 ADE1F8FF call unpack.004083D4
0047A227 . 03F0 add esi,eax 加起来:4A7+4A7=94E
0047A229 . 8BC6 mov eax,esi
0047A22B . 8D55 C0 lea edx,dword ptr ss:[ebp-40]
0047A22E . E8 65E0F8FF call unpack.00408298 94E的十进制2382
0047A233 . 8B55 C0 mov edx,dword ptr ss:[ebp-40]
0047A236 . 8D45 E8 lea eax,dword ptr ss:[ebp-18]
0047A239 . E8 A29EF8FF call unpack.004040E0
0047A23E . 43 inc ebx EBX自加1 EBX=1+1=2(第一次循环)
0047A23F . 8B45 FC mov eax,dword ptr ss:[ebp-4] 注册名:wofan
0047A242 . E8 C1A0F8FF call unpack.00404308 注册名长度5送EAX
0047A247 . 40 inc eax EAX自加1
0047A248 . 3BD8 cmp ebx,eax 看看是否该结束了!
0047A24A .^ 0F85 5FFFFFFF jnz unpack.0047A1AF 没有结束就往上跳
********************************************************************************************************************
以上循环的运算:
w 77*1=77 十进制为119 119与循环次数1连接起来变成1191 ,它的十六进制是4A7,翻倍,变成94E,取其十进制2382
o 6F*2=DE 222 2222 8AE 115C 4444
f 66*3=132 306 3063 BF7 17EE 6126
a 61*4=184 388 3884 F2C 1E58 7768
n 6E*5=226 550 5505 1581 2B02 11010
**********************************************************************************************************************
0047A250 . 6A 06 push 6 一个固定数压栈
0047A252 . 68 6AEBB29B push 9BB2EB6A 又一个固定数压栈(我们应该知道,浮点运算与栈有很大关系)
0047A257 . 8B45 E8 mov eax,dword ptr ss:[ebp-18] dword ptr ss:[ebp-18]里面是2B02的十进制数:11010
0047A25A . E8 75E1F8FF call unpack.004083D4
0047A25F . 99 cdq 扩展,双字变四字
0047A260 . E8 DFACF8FF call unpack.00404F44 ********按F7跟进,看看 Call 之一 计算注册码的中间数********
0047A265 . 8945 C8 mov dword ptr ss:[ebp-38],eax eax=44F0A4D4
0047A268 . 8955 CC mov dword ptr ss:[ebp-34],edx edx=11C34
0047A26B . DF6D C8 fild qword ptr ss:[ebp-38] 浮点运算,装入整数Integer
************************************************************************
Stack ss:[0012F5A8]=00011C3444F0A4D4
************************************************************************
0047A26E . 83C4 F4 add esp,-0C
0047A271 . DB3C24 fstp tbyte ptr ss:[esp] ; | 浮点运算:存实数与上托栈
**********************************************************************
st=3.1248579720930001920e+14
Stack ss:[0012F53C]=1.3086894416192335360e-4930
**********************************************************************
0047A274 . 9B wait ; |
0047A275 . 8D55 BC lea edx,dword ptr ss:[ebp-44] ; | EDX=11C34
0047A278 . B8 ACA44700 mov eax,unpack.0047A4AC ; | EAX=44F0A4D4
0047A27D . E8 4EF8F8FF call unpack.00409AD0 ; \unpack.00409AD0
0047A282 . 8B55 BC mov edx,dword ptr ss:[ebp-44]
*************************************************************************
Stack ss:[0012F59C]=00E7C3E8, (ASCII "312485797209300") 到这里就获得了注册码的中间数
edx=00000000
*************************************************************************
0047A285 . 8D45 E8 lea eax,dword ptr ss:[ebp-18]
0047A288 . E8 539EF8FF call unpack.004040E0
0047A28D . 8D45 F0 lea eax,dword ptr ss:[ebp-10]
0047A290 . 50 push eax
0047A291 . 8B55 F8 mov edx,dword ptr ss:[ebp-8] 假码123456789
0047A294 . B8 A0A44700 mov eax,unpack.0047A4A0
0047A299 . E8 AEA3F8FF call unpack.0040464C
0047A29E . 8BC8 mov ecx,eax
0047A2A0 . 49 dec ecx
0047A2A1 . BA 01000000 mov edx,1
0047A2A6 . 8B45 F8 mov eax,dword ptr ss:[ebp-8]
0047A2A9 . E8 BAA2F8FF call unpack.00404568
0047A2AE . 8B45 F0 mov eax,dword ptr ss:[ebp-10]
0047A2B1 . E8 72F8F8FF call unpack.00409B28 这个Call看看假码是否合法浮点数
0047A2B6 . DB7D B0 fstp tbyte ptr ss:[ebp-50]
0047A2B9 . 9B wait
0047A2BA . 8B45 E8 mov eax,dword ptr ss:[ebp-18] EAX=312485797209300
0047A2BD . E8 66F8F8FF call unpack.00409B28 *******这个Call看看假码是否合法浮点数 CAll 之二*******
0047A2C2 . DB6D B0 fld tbyte ptr ss:[ebp-50] 装上刚才假码,(如果是真正的浮点数的话)
0047A2C5 . DEE1 fsubrp st(1),st 浮点运算:fsubrp:反向实数相减并上托
******************************
st0=
st(1)=3.1248579720930001920e+14
******************************
0047A2C7 . D81D B0A44700 fcomp dword ptr ds:[47A4B0] 在这里进行浮点数比较,如果输入的注册码不合法,根本就到不了这里!
*****************************************
st=-UNORM F798 00E7C3A0 00000005
ds:[0047A4B0]=1000.000 反向相减(这里是假码减真码的中间数)的结果与ds:[0047A4B0]相比:1000.000的话,相等(大于Ja就死)就继续下去
****************************************
0047A2CD . DFE0 fstsw ax
0047A2CF . 9E sahf
******************************
AH=01 (S0 Z0 A0 P0 C1)
FL=12
******************************
0047A2D0 . 0F87 E2000000 ja unpack.0047A3B8
0047A2D6 . 8B45 E8 mov eax,dword ptr ss:[ebp-18]
0047A2D9 . E8 4AF8F8FF call unpack.00409B28
0047A2DE . DB7D A4 fstp tbyte ptr ss:[ebp-5C]
0047A2E1 . 9B wait
0047A2E2 . 8B45 F0 mov eax,dword ptr ss:[ebp-10]
0047A2E5 . E8 3EF8F8FF call unpack.00409B28
0047A2EA . DB6D A4 fld tbyte ptr ss:[ebp-5C]
0047A2ED . DEE1 fsubrp st(1),st
0047A2EF . D81D B0A44700 fcomp dword ptr ds:[47A4B0]
0047A2F5 . DFE0 fstsw ax
0047A2F7 . 9E sahf
省略,下面是第二次减,注册名算出的中间数减去假码,如果结果等于1000.000,注册通过!以后会使AL得到1
0047A2E5 . E8 3EF8F8FF call unpack.00409B28
0047A2EA . DB6D A4 fld tbyte ptr ss:[ebp-5C]
0047A2ED . DEE1 fsubrp st(1),st
0047A2EF . D81D B0A44700 fcomp dword ptr ds:[47A4B0]
0047A2F5 . DFE0 fstsw ax
0047A2F7 . 9E sahf
0047A2F8 . 0F87 BA000000 ja unpack.0047A3B8
0047A2FE . C605 401F4800 01 mov byte ptr ds:[481F40],1
0047A305 . C645 F7 01 mov byte ptr ss:[ebp-9],1
0047A309 . 33C0 xor eax,eax
0047A30B . 55 push ebp
*************************按F7跟进,看看 Call 之一 计算注册码的中间数 ***********************
00404F44 /$ 52 push edx
00404F45 |. 50 push eax EAX=2B02(11010)压栈
00404F46 |. 8B4424 10 mov eax,dword ptr ss:[esp+10] EAX=6
00404F4A |. F72424 mul dword ptr ss:[esp] 乘起来,EAX=2B02*6=1020C
00404F4D |. 89C1 mov ecx,eax 1020C放在ECX
00404F4F |. 8B4424 04 mov eax,dword ptr ss:[esp+4] 开始dword ptr ss:[esp+4] 为零
00404F53 |. F76424 0C mul dword ptr ss:[esp+C] dword ptr ss:[esp+C] 里面是: 9BB2EB6A
00404F57 |. 01C1 add ecx,eax 加起来ECX=1020C+0=1020C
00404F59 |. 8B0424 mov eax,dword ptr ss:[esp] EAX= 2B02
00404F5C |. F76424 0C mul dword ptr ss:[esp+C] EAX=2B02*9BB2EB6A=44F0A4D4 r 1A28
00404F60 |. 01CA add edx,ecx EDX=1A28+1020C=11C34
00404F62 |. 59 pop ecx
00404F63 |. 59 pop ecx
00404F64 \. C2 0800 retn 8
********************************************************************************
*********************这个Call看看假码是否合法浮点数 CAll 之二*********************
00409B28 /$ 53 push ebx
00409B29 |. 83C4 EC add esp,-14
00409B2C |. 8BD8 mov ebx,eax
00409B2E |. 8BC3 mov eax,ebx
00409B30 |. E8 D3A9FFFF call unpack.00404508
00409B35 |. 8BD4 mov edx,esp
00409B37 |. 33C9 xor ecx,ecx
00409B39 |. E8 1EFEFFFF call unpack.0040995C 那么这里就一定要看看,看看注册码是否全法浮点数Call 之三
00409B3E |. 84C0 test al,al AL被置0,表示,不是合法浮点数,我的假码123456789不是合法的!合法浮点数,在末尾应该是E+10形式!
00409B40 |. 75 19 jnz short unpack.00409B5B 这里没有跳就完了,强行改为Jmp,进行下面的浮点运算,后来就进行浮点比较,然后会弹出浮点运算错误!
00409B42 |. 895C24 0C mov dword ptr ss:[esp+C],ebx
00409B46 |. C64424 10 0B mov byte ptr ss:[esp+10],0B
00409B4B |. 8D5424 0C lea edx,dword ptr ss:[esp+C]
00409B4F |. A1 20074800 mov eax,dword ptr ds:[480720]
00409B54 |. 33C9 xor ecx,ecx
00409B56 |. E8 DDE1FFFF call unpack.00407D38 Econvertioner
00409B5B |> DB2C24 fld tbyte ptr ss:[esp]
00409B5E |. 83C4 14 add esp,14
00409B61 |. 5B pop ebx
00409B62 \. C3 retn
××××××××××那么这里就一定要看看,看看注册码是否全法浮点数Call 之三×××××××××××××××××××××
00409970 . A0 87164800 mov al,byte ptr ds:[481687]
00409975 . 8845 FB mov byte ptr ss:[ebp-5],al AL=2E (.)
00409978 . 89CB mov ebx,ecx
0040997A . 9B wait
0040997B . D97D F8 fstcw word ptr ss:[ebp-8] Stack SS:[0012F51C]=2B02 fstcw:把控制字存入16位寄存器
0040997E . 9B wait
0040997F . DBE2 fclex 浮点运算:清除异常
00409981 . D92D 78F14700 fldcw word ptr ds:[47F178] ds:[47F178]=133F fldcw:装控制字
00409987 . D9EE fldz 装入常数0
00409989 . E8 85000000 call unpack.00409A13 *************这个Call还是要看的!!看Call之四*******
0040998E . 8A3E mov bh,byte ptr ds:[esi]
00409990 . 80FF 2B cmp bh,2B
00409993 . 74 05 je short unpack.0040999A
00409995 . 80FF 2D cmp bh,2D
00409998 . 75 01 jnz short unpack.0040999B
0040999A > 46 inc esi
0040999B > 89F1 mov ecx,esi
0040999D . E8 7C000000 call unpack.00409A1E
004099A2 . 31D2 xor edx,edx
004099A4 . 8A06 mov al,byte ptr ds:[esi]
004099A6 . 3A45 FB cmp al,byte ptr ss:[ebp-5] byte ptr ss:[ebp-5]=2E (.)
004099A9 . 75 08 jnz short unpack.004099B3 跳吧:
004099AB . 46 inc esi
004099AC . E8 6D000000 call unpack.00409A1E
004099B1 . F7DA neg edx
004099B3 > 39F1 cmp ecx,esi 跳到这里:
004099B5 . 74 4F je short unpack.00409A06 不跳了
004099B7 . 8A06 mov al,byte ptr ds:[esi] byte ptr ds:[esi]=0
004099B9 . 24 DF and al,0DF
004099BB . 3C 45 cmp al,45
004099BD . 75 0A jnz short unpack.004099C9 又走了
004099BF . 46 inc esi
004099C0 . 52 push edx
004099C1 . E8 74000000 call unpack.00409A3A
004099C6 . 58 pop eax
004099C7 . 01C2 add edx,eax
004099C9 > E8 45000000 call unpack.00409A13
004099CE . 803E 00 cmp byte ptr ds:[esi],0
004099D1 . 75 33 jnz short unpack.00409A06
004099D3 . 89D0 mov eax,edx
004099D5 . 80FB 01 cmp bl,1
004099D8 . 75 03 jnz short unpack.004099DD 看一下跳到那里去了?
004099DA . 83C0 04 add eax,4
004099DD > 53 push ebx
004099DE . 8B5D FC mov ebx,dword ptr ss:[ebp-4]
004099E1 . E8 E293FFFF call unpack.00402DC8
004099E6 . 5B pop ebx
004099E7 . 80FF 2D cmp bh,2D
004099EA . 75 02 jnz short unpack.004099EE
004099EC . D9E0 fchs
004099EE > 80FB 00 cmp bl,0
004099F1 . 74 04 je short unpack.004099F7
004099F3 . DF3F fistp qword ptr ds:[edi]
004099F5 . EB 02 jmp short unpack.004099F9
004099F7 > DB3F fstp tbyte ptr ds:[edi] 转到了这里: fstp:存实数与上托栈
004099F9 > 9B wait
004099FA . DFE0 fstsw ax fstsw: 存状态字,AX=0000
004099FC . 66:A9 0900 test ax,9
00409A00 . 75 06 jnz short unpack.00409A08
00409A02 . B0 01 mov al,1 AL=1(AL得到1,就一切都好了!!!)表明是合法的浮点数!
00409A04 . EB 04 jmp short unpack.00409A0A
00409A06 > DDD8 fstp st
00409A08 > 31C0 xor eax,eax
00409A0A > 9B wait
00409A0B . DBE2 fclex 清除异常
00409A0D . D96D F8 fldcw word ptr ss:[ebp-8] fldcw:装控制字:Stack ss:[0012F51C]=1272
00409A10 . 9B wait
00409A11 . EB 56 jmp short unpack.00409A69
00409A13 /$ AC /lods byte ptr ds:[esi]
00409A14 |. 08C0 |or al,al
00409A16 |. 74 04 |je short unpack.00409A1C
00409A18 |. 3C 20 |cmp al,20
00409A1A |.^ 74 F7 \je short unpack.00409A13
00409A1C |> 4E dec esi
00409A1D \. C3 retn
……
00409A69 > \5B pop ebx ; 00E7C430 Jmp到这里:EBX=312485797209300
00409A6A . 5E pop esi ESI=2B02
00409A6B . 5F pop edi
00409A6C . 8BE5 mov esp,ebp
00409A6E . 5D pop ebp
00409A6F . C3 retn
****************************这个Call还是要看的!!看Call之四******************************
00409A13 /$ AC /lods byte ptr ds:[esi] AL得到第一位的ASCII码:33
00409A14 |. 08C0 |or al,al
00409A16 |. 74 04 |je short unpack.00409A1C
00409A18 |. 3C 20 |cmp al,20
00409A1A |.^ 74 F7 \je short unpack.00409A13
00409A1C |> 4E dec esi
00409A1D \. C3 retn
省略
00409A22 |> /AC /lods byte ptr ds:[esi]
00409A23 |. |2C 3A |sub al,3A AL=33-3A=F9
00409A25 |. |04 0A |add al,0A AL=F9+0A=3
00409A27 |. |73 0F |jnb short unpack.00409A38 跳转没有实现
00409A29 |. |DA0D 74F14700 |fimul dword ptr ds:[47F174] 浮点运算:浮点寄存器ST=0 dword ptr ds:[47F174]=A
00409A2F |. |8945 F4 |mov dword ptr ss:[ebp-C],eax dword ptr ss:[ebp-C]=EAX=3
00409A32 |. |DA45 F4 |fiadd dword ptr ss:[ebp-C] 浮点运算:ST=0 ,ST=0+3=3
00409A35 |. |42 |inc edx EDX自加1
00409A36 |.^\EB EA \jmp short unpack.00409A22 跳上去进行第二次取数
00409A38 |> 4E dec esi
00409A39 \. C3 retn
这里总结一下:
处理:312485797209300 ST初值是0
33-3A+A=3
ST*A=0
ST+3=3
以后:
31-3A+A=1
ST=3*A=1E(30十进制)
ST=30+1=31
……
最后ST0 valid 3.1248579720930001920e+14 ST0 得到有效浮点数!!!!
EDX=F
*****************************************************************************************************
如果是输入的是合法的浮点数注册码,最后会到这里:
00478A9E . 3C 01 cmp al,1 比较注册标志值,Al=1注册成功!!!!
这一行改为:
00478A9E 3C 00 cmp al,0
爆破成功!
00478AA0 . 0F85 B1000000 jnz unpack.00478B57 跳向注册不成功的地方,请重新输入注册码提示框!
不过软件的说明文档表示,程序会联网效验注册码,我试了一下并没有这个现象!不过我总是用着不放心,爆破总是有种不安全感。
用上这个软件后,我上网的速度的确快了不少!推荐一下!
在到达这里之前,程序与一个内置数据66064比较了一下,我在里面转了好久,才明白它对注册一点用也没有!!!!
从上面分析可知,注册码只与注册名的最后一个字符有关。
我的注册码:
注册名:wofan 长度为5
最后一个是n,它的ASCII码是6E
6E*5=226 226的十进制形式是550
变成5505 它的十六进制形式是1581
翻个倍变成:2B02
两个固定数:6 和 9BB2EB6A
2B02×6=1020C
2B02*9BB2EB6A=44F0A4D4 r 1A28 EAX=44F0A4D4 数太大,扩展到EDX中的是1A28
1020C+1A28=11C34 放在EDX中
EDX与EAX中的值连接起来,为
11C3444F0A4D4
它的十进制形式就是注册码的中间数:
312485797209300
这个中间数减去1000,就得到注册码,当然在输入注册码时,一定要输入它的浮点样式!!切切!!
312485797209300-1000=312485797208300
数一下它有多少位?这里是14位!
那么填入注册框中的数据就是:
312485797208300E+14
我的注册名:wofan
我的注册码:312485797208300E+14
12:55 2005-4-18
by wofan[OCN]
附VB6注册机:
Option Explicit
Private Declare Function ShellExecute Lib "shell32.dll" Alias "ShellExecuteA" (ByVal hwnd As Long, ByVal lpOperation As String, ByVal lpFile As String, ByVal lpParameters As String, ByVal lpDirectory As String, ByVal nShowCmd As Long) As Long '函数声明,产生网络链接效果'
Private Sub Image2_Click()
ShellExecute 0, "open", "http://ocn.e5v.com/cgi-bin/bbs/ccb/index.cgi?", vbNullString, vbNullString, 0 '到OCN破解组织
End Sub
Private Sub Image3_Click()
ShellExecute 0, "open", "http://luowei.mireene.com/bbs/index.php", vbNullString, vbNullString, 0 '到飘云论坛
End Sub
Private Sub Text2_Click()
Dim name As String
Dim code As String
Dim lenj As Integer
Dim a, b, c, N, d, e As Double '将常数作label2.caption,解决数制问题
N = Val(Label2.Caption) 'N表示常数&H9BB2EB6A,如查直接赋值,它竟然是个负数,这是VB的错误!
name = Trim(Text1.Text)
lenj = Len(name)
If Len(name) = 0 Then
MsgBox "请输入注册名!", 48, "wofan[OCN]"
Text1.SetFocus
Exit Sub
End If
a = Asc(Mid$(name, lenj, 1))
b = a * lenj
code = CStr(b)
code = code & CStr(lenj)
a = CLng(code) * 2
b = a * 6
c = a * N
b = b * &H10000000
b = b * &H10
c = c - 1000 '让它转成真正的注册码
a = b + c
code = CStr(a) '转换成字串
lenj = Len(code) '取它的长度,以便确定浮点位数!
code = code & "E+" & (lenj - 1) '转成合法的浮点样式注册码
'因为VB6在数据太大时,会自作主张转换为浮点数,这个注机对于注册名长度超过9位,就会得到
'错误的注册码,它的形式就是多了一个E+……这真是莫名其妙!
Text2.Text = code
End Sub
Private Sub Text2_GotFocus()
With Text2
.SelStart = 0
.SelLength = Len(Trim(Text2.Text))
End With
End Sub
by wofan[OCN][PYG]
感谢你看完!