网络** V2.05 (2005.04.06) 算法分析
日期:2005年4月7日 破解人:Baby2008
――――――――――――――――――――――――――――――――――――――――――――
先用PEID 0.93汉化增强版查壳,EXE32Pack 1.3x -> SteelBytes,用PEiD v0.93插件PEiD Generic UnPacker轻松搞定,程序没有自校验,脱壳
后能直接运行,默认另存为NetUSB.exe.unpacked_.exe,脱壳后再用PEID 0.93汉化增强版查壳,Nothing found *,看看软件用了什么算法?还是
用PEiD吧,好东西总要多用用! Krypto ANALyzer检测的结果用了一堆的公开算法,顿时晕过去3分钟不醒人事^_^,本想用IDA做个map文件,可
怜小菜的我,E文分成26个字母我全都认识,放在一起就不敢恭维了,外加入门级菜鸟不知到IDA怎么用,在我的本本上(P4 1.5/256M)反编译
NetUSB.exe.unpacked_.exe,电全用完了还没完成(估计至少3个小时),无奈用家里的台式机(P4 2.8HT超频4.1 512M)跑,结果花了近1个小时才
完成,郁闷死了,请问大家用IDA反编译一个文件大概需要多少时间?更可怜的是IDA制作的map文件还是有很多的函数不认识,无奈中还是用
DeDe试试,能反编译,狂喜中……,DeDe3.50,查的注册验证按钮<-TForm9@Bn_RegClick地址005A4004, OD载入NetUSB.exe.unpacked_.exe并在
005A4004,下断,F9运行,输入注册信息,注册名:Baby2008,机器码:(可能是作者设计缺陷,我的本本上显示的机器码为'FFFFFFFF',暂且不管它
),注册码:1234567890,点击立即注册,OD中断在:
005A4004 >/. 55 push ebp ; <-TForm9@Bn_RegClick
005A4005 |. 8BEC mov ebp,esp ; 注册按钮onClick事件
005A4007 |. B9 07000000 mov ecx,7
005A400C |> 6A 00 /push 0
005A400E |. 6A 00 |push 0
005A4010 |. 49 |dec ecx
005A4011 |.^ 75 F9 \jnz short NetUSB_e.005A400C
005A4013 |. 53 push ebx
005A4014 |. 8BD8 mov ebx,eax
005A4016 |. 33C0 xor eax,eax
005A4018 |. 55 push ebp
005A4019 |. 68 E1415A00 push <NetUSB_e.->System.@HandleFinal>
005A401E |. 64:FF30 push dword ptr fs:[eax]
005A4021 |. 64:8920 mov dword ptr fs:[eax],esp
005A4024 |. 8D55 F8 lea edx,[local.2]
005A4027 >|. 8B83 F8020000 mov eax,dword ptr ds:[ebx+2F8] ; *LEt_RegUser:N.A.
005A402D >|. E8 3AACEAFF call NetUSB_e.0044EC6C ; ->Controls.TControl.GetText(TControl):TCaption;
005A4032 |. 8B45 F8 mov eax,[local.2] ; 用户名
005A4035 |. 8D55 FC lea edx,[local.1]
005A4038 >|. E8 A754E6FF call NetUSB_e.004094E4 ; ->SysUtils.Trim(AnsiString):AnsiString;overload;
005A403D |. 837D FC 00 cmp [local.1],0
005A4041 |. 75 4F jnz short NetUSB_e.005A4092 ; 用户名不能为空
005A4043 |. 6A 30 push 30
005A4045 |. 8D55 F4 lea edx,[local.3]
005A4048 |. B8 F8415A00 mov eax,NetUSB_e.005A41F8 ; ASCII "oJCFk\"
005A404D >|. E8 4E3BFFFF call NetUSB_e.00597BA0 ; 对应函数DecodeStr()
005A4052 |. 8B45 F4 mov eax,[local.3] ; '提示'
005A4055 >|. E8 2E0EE6FF call NetUSB_e.00404E88 ; ->System.@LStrToPChar(String):PAnsiChar;
005A405A |. 50 push eax
005A405B |. 8D55 F0 lea edx,[local.4]
005A405E |. B8 08425A00 mov eax,NetUSB_e.005A4208 ; ASCII "qvFntXKwhgk@sHvfkyR_gH[gqi_LlhojpGN_dL"
005A4063 >|. E8 383BFFFF call NetUSB_e.00597BA0 ; DecodeStr()
005A4068 |. 8B45 F0 mov eax,[local.4]
005A406B >|. E8 180EE6FF call NetUSB_e.00404E88 ; ->System.@LStrToPChar(String):PAnsiChar;
005A4070 |. 8BD0 mov edx,eax
005A4072 |. A1 4C2A5C00 mov eax,dword ptr ds:[5C2A4C]
005A4077 |. 8B00 mov eax,dword ptr ds:[eax]
005A4079 |. 59 pop ecx ; 提示注册名不能为空
005A407A >|. E8 71B3ECFF call NetUSB_e.0046F3F0 ;
->Forms.TApplication.MessageBox(TApplication;PChar;PChar;Longint):Integer;
005A407F >|. 8B83 F8020000 mov eax,dword ptr ds:[ebx+2F8] ; *LEt_RegUser:N.A.
005A4085 |. 8B10 mov edx,dword ptr ds:[eax]
005A4087 |. FF92 C0000000 call dword ptr ds:[edx+C0]
005A408D |. E9 FF000000 jmp NetUSB_e.005A4191 ; 提示后结束验证
005A4092 |> 33D2 xor edx,edx
005A4094 >|. 8B83 04030000 mov eax,dword ptr ds:[ebx+304] ; *Bn_Reg:N.A.
005A409A |. 8B08 mov ecx,dword ptr ds:[eax]
005A409C |. FF51 64 call dword ptr ds:[ecx+64]
005A409F |. B2 01 mov dl,1
005A40A1 |. B8 02000000 mov eax,2
005A40A6 >|. E8 693CFFFF call NetUSB_e.00597D14 ; ->:THttpCli._PROC_00597D14()
005A40AB |. 8D55 E4 lea edx,[local.7]
005A40AE >|. 8B83 00030000 mov eax,dword ptr ds:[ebx+300] ; *LEt_RegCode:N.A.
005A40B4 >|. E8 B3ABEAFF call NetUSB_e.0044EC6C ; ->Controls.TControl.GetText(TControl):TCaption;
005A40B9 |. 8B45 E4 mov eax,[local.7] ; 试炼码
005A40BC |. 8D55 E8 lea edx,[local.6]
005A40BF >|. E8 2054E6FF call NetUSB_e.004094E4 ; ->SysUtils.Trim(AnsiString):AnsiString;overload;
005A40C4 |. 8B45 E8 mov eax,[local.6] ; Trim(试炼码)
005A40C7 |. 8D55 EC lea edx,[local.5]
005A40CA >|. E8 D13AFFFF call NetUSB_e.00597BA0 ; 对应函数DecodeStr()
005A40CF |. 8B45 EC mov eax,[local.5] ; DecodeStr(试炼码)
005A40D2 |. 50 push eax
005A40D3 |. 8D55 DC lea edx,[local.9]
005A40D6 >|. 8B83 F8020000 mov eax,dword ptr ds:[ebx+2F8] ; *LEt_RegUser:N.A.
005A40DC >|. E8 8BABEAFF call NetUSB_e.0044EC6C ; ->Controls.TControl.GetText(TControl):TCaption;
005A40E1 |. 8B45 DC mov eax,[local.9] ; 用户名
005A40E4 |. 8D55 E0 lea edx,[local.8]
005A40E7 >|. E8 F853E6FF call NetUSB_e.004094E4 ; ->SysUtils.Trim(AnsiString):AnsiString;overload;
005A40EC |. 8B45 E0 mov eax,[local.8] ; Trim(用户名)
005A40EF |. 50 push eax
005A40F0 |. 8D55 D0 lea edx,[local.12]
005A40F3 |. A1 4C2A5C00 mov eax,dword ptr ds:[5C2A4C]
005A40F8 |. 8B00 mov eax,dword ptr ds:[eax]
005A40FA >|. E8 39B7ECFF call NetUSB_e.0046F838 ; ->DdeMan.TDdeMgr.GetExeName(TDdeMgr):AnsiString;<+>
005A40FF |. 8B45 D0 mov eax,[local.12] ; 当前执行的程序
005A4102 |. 8D55 D4 lea edx,[local.11]
005A4105 >|. E8 2A2EFFFF call NetUSB_e.00596F34 ; ->:THttpCli._PROC_00596F34()
005A410A |. 8B45 D4 mov eax,[local.11] ; 取得应用程序的产品名称 '网络**'
005A410D |. 8D55 D8 lea edx,[local.10]
005A4110 >|. E8 CF53E6FF call NetUSB_e.004094E4 ; ->SysUtils.Trim(AnsiString):AnsiString;overload;
005A4115 |. 8B55 D8 mov edx,[local.10] ; Trim('网络**')
005A4118 |. A1 6C285C00 mov eax,dword ptr ds:[5C286C]
005A411D |. 8B00 mov eax,dword ptr ds:[eax]
005A411F |. 8B80 64030000 mov eax,dword ptr ds:[eax+364]
005A4125 |. 59 pop ecx ; '用户名'
005A4126 |. E8 91B5F4FF call NetUSB_e.004EF6BC ; 注册验证,关键!
005A412B |. 84C0 test al,al
005A412D |. 75 09 jnz short NetUSB_e.005A4138 ; 验证通不过,调用Halt结束程序。
005A412F |. 33C0 xor eax,eax
005A4131 >|. E8 D607E6FF call NetUSB_e.0040490C ; ->System.@Halt(Integer);
005A4136 |. EB 59 jmp short NetUSB_e.005A4191
005A4138 |> B2 01 mov dl,1
005A413A |. B8 02000000 mov eax,2
005A413F >|. E8 D03BFFFF call NetUSB_e.00597D14 ; 保存注册信息?
005A4144 |. 6A 40 push 40
005A4146 |. 8D55 CC lea edx,[local.13] ; 提示注册成功信息
005A4149 |. B8 F8415A00 mov eax,NetUSB_e.005A41F8 ; ASCII "oJCFk\"
005A414E >|. E8 4D3AFFFF call NetUSB_e.00597BA0 ; ->:THttpCli._PROC_00597BA0()
005A4153 |. 8B45 CC mov eax,[local.13]
005A4156 >|. E8 2D0DE6FF call NetUSB_e.00404E88 ; ->System.@LStrToPChar(String):PAnsiChar;
005A415B |. 50 push eax
005A415C |. 8D55 C8 lea edx,[local.14]
005A415F |. B8 38425A00 mov eax,NetUSB_e.005A4238 ; ASCII
"qvFntWKEjVV_gG_LpGk@zgS@iKK=eiVchyV_gIWTpHGPny?LjkJyfySyngronXvfqvFntYK?jvZ_dL"
005A4164 >|. E8 373AFFFF call NetUSB_e.00597BA0 ; ->:THttpCli._PROC_00597BA0()
005A4169 |. 8B45 C8 mov eax,[local.14]
005A416C >|. E8 170DE6FF call NetUSB_e.00404E88 ; ->System.@LStrToPChar(String):PAnsiChar;
005A4171 |. 8BD0 mov edx,eax
005A4173 |. A1 4C2A5C00 mov eax,dword ptr ds:[5C2A4C]
005A4178 |. 8B00 mov eax,dword ptr ds:[eax]
005A417A |. 59 pop ecx
005A417B >|. E8 70B2ECFF call NetUSB_e.0046F3F0 ;
->Forms.TApplication.MessageBox(TApplication;PChar;PChar;Longint):Integer;
005A4180 |. C783 4C020000 01>mov dword ptr ds:[ebx+24C],1
005A418A |. 8BC3 mov eax,ebx
005A418C >|. E8 9379ECFF call NetUSB_e.0046BB24 ; ->Forms.TCustomForm.Close(TCustomForm);
005A4191 |> 33C0 xor eax,eax
005A4193 |. 5A pop edx
005A4194 |. 59 pop ecx
005A4195 |. 59 pop ecx
005A4196 |. 64:8910 mov dword ptr fs:[eax],edx
005A4199 |. 68 E8415A00 push NetUSB_e.005A41E8
005A419E |> 8D45 C8 lea eax,[local.14]
005A41A1 |. BA 05000000 mov edx,5
005A41A6 >|. E8 4108E6FF call NetUSB_e.004049EC ; ->System.@LStrArrayClr(void;void;Integer);
005A41AB |. 8D45 DC lea eax,[local.9]
005A41AE >|. E8 1508E6FF call NetUSB_e.004049C8 ; ->System.@LStrClr(void;void);
005A41B3 |. 8D45 E0 lea eax,[local.8]
005A41B6 >|. E8 0D08E6FF call NetUSB_e.004049C8 ; ->System.@LStrClr(void;void);
005A41BB |. 8D45 E4 lea eax,[local.7]
005A41BE >|. E8 0508E6FF call NetUSB_e.004049C8 ; ->System.@LStrClr(void;void);
005A41C3 |. 8D45 E8 lea eax,[local.6]
005A41C6 |. BA 04000000 mov edx,4
005A41CB >|. E8 1C08E6FF call NetUSB_e.004049EC ; ->System.@LStrArrayClr(void;void;Integer);
005A41D0 |. 8D45 F8 lea eax,[local.2]
005A41D3 >|. E8 F007E6FF call NetUSB_e.004049C8 ; ->System.@LStrClr(void;void);
005A41D8 |. 8D45 FC lea eax,[local.1]
005A41DB >|. E8 E807E6FF call NetUSB_e.004049C8 ; ->System.@LStrClr(void;void);
005A41E0 \. C3 retn
005A41E1 > .^ E9 4A01E6FF jmp NetUSB_e.00404330 ; ->System.@HandleFinally;
005A41E6 .^ EB B6 jmp short NetUSB_e.005A419E
005A41E8 . 5B pop ebx
005A41E9 . 8BE5 mov esp,ebp
005A41EB . 5D pop ebp
005A41EC . C3 retn 从上面代码可以很明显的看出:
1、在005A40CA处 call NetUSB_e.00597BA0 对试炼码进行处理
2、在005A4126处 call NetUSB_e.004EF6BC 是关键部分,需要跟进,
3、在005A412D处 跳转,爆破此处仅仅是注册验证爆破,重启验证还是通不过的!
接下来开始分析一下上面的两了函数吧……
1、call NetUSB_e.00597BA0
-------------------------------------------------------------------------------------------------------------
00597BA0 /$ 55 push ebp ; 字符串解密函数
00597BA1 |. 8BEC mov ebp,esp
00597BA3 |. 83C4 D8 add esp,-28
00597BA6 |. 53 push ebx
00597BA7 |. 56 push esi
00597BA8 |. 57 push edi
00597BA9 |. 33C9 xor ecx,ecx
00597BAB |. 894D D8 mov [local.10],ecx
00597BAE |. 894D DC mov [local.9],ecx
00597BB1 |. 894D E0 mov [local.8],ecx
00597BB4 |. 8955 F8 mov [local.2],edx
00597BB7 |. 8945 FC mov [local.1],eax
00597BBA |. 8B45 FC mov eax,[local.1]
00597BBD |. E8 B6D2E6FF call NetUSB_e.00404E78
00597BC2 |. 33C0 xor eax,eax
00597BC4 |. 55 push ebp
00597BC5 |. 68 047D5900 push NetUSB_e.00597D04
00597BCA |. 64:FF30 push dword ptr fs:[eax]
00597BCD |. 64:8920 mov dword ptr fs:[eax],esp
00597BD0 |. 8B45 F8 mov eax,[local.2]
00597BD3 |. E8 F0CDE6FF call NetUSB_e.004049C8
00597BD8 |. 8D45 E0 lea eax,[local.8]
00597BDB |. E8 E8CDE6FF call NetUSB_e.004049C8
00597BE0 |. C645 EA FC mov byte ptr ss:[ebp-16],0FC
00597BE4 |. C645 EC F0 mov byte ptr ss:[ebp-14],0F0
00597BE8 |. C645 EE C0 mov byte ptr ss:[ebp-12],0C0
00597BEC |. 33C0 xor eax,eax
00597BEE |. 8945 F0 mov [local.4],eax
00597BF1 |. C645 E6 00 mov byte ptr ss:[ebp-1A],0
00597BF5 |. BB 02000000 mov ebx,2
00597BFA |. 33FF xor edi,edi
00597BFC |. 33F6 xor esi,esi
00597BFE |. 8B45 FC mov eax,[local.1]
00597C01 |. E8 8AD0E6FF call NetUSB_e.00404C90
00597C06 |. 8945 F4 mov [local.3],eax
00597C09 |. 3B75 F4 cmp esi,[local.3]
00597C0C |. 0F8D B9000000 jge NetUSB_e.00597CCB
00597C12 |> 8B45 FC /mov eax,[local.1]
00597C15 |. 0FB60430 |movzx eax,byte ptr ds:[eax+esi]
00597C19 |. 83E8 3C |sub eax,3C
00597C1C |. 79 2A |jns short NetUSB_e.00597C48
00597C1E |. 8D45 DC |lea eax,[local.9]
00597C21 |. 8B55 FC |mov edx,[local.1]
00597C24 |. 8A1432 |mov dl,byte ptr ds:[edx+esi]
00597C27 |. E8 7CCFE6FF |call NetUSB_e.00404BA8
00597C2C |. 8B55 DC |mov edx,[local.9]
00597C2F |. 8D45 E0 |lea eax,[local.8]
00597C32 |. E8 61D0E6FF |call NetUSB_e.00404C98
00597C37 |. FF45 F0 |inc [local.4]
00597C3A |. 46 |inc esi
00597C3B |. C645 E6 00 |mov byte ptr ss:[ebp-1A],0
00597C3F |. BB 02000000 |mov ebx,2
00597C44 |. 33FF |xor edi,edi
00597C46 |. EB 7A |jmp short NetUSB_e.00597CC2
00597C48 |> 8B45 FC |mov eax,[local.1]
00597C4B |. 8A0430 |mov al,byte ptr ds:[eax+esi]
00597C4E |. 2C 3C |sub al,3C
00597C50 |. 8845 E7 |mov byte ptr ss:[ebp-19],al
00597C53 |. 8B45 F0 |mov eax,[local.4]
00597C56 |. 3B45 F4 |cmp eax,[local.3]
00597C59 |. 7D 70 |jge short NetUSB_e.00597CCB
00597C5B |. 8D47 06 |lea eax,dword ptr ds:[edi+6]
00597C5E |. 83F8 08 |cmp eax,8
00597C61 |. 7C 44 |jl short NetUSB_e.00597CA7
00597C63 |. 8A45 E7 |mov al,byte ptr ss:[ebp-19]
00597C66 |. 24 3F |and al,3F
00597C68 |. 8BF8 |mov edi,eax
00597C6A |. 81E7 FF000000 |and edi,0FF
00597C70 |. B9 06000000 |mov ecx,6
00597C75 |. 2BCB |sub ecx,ebx
00597C77 |. D3EF |shr edi,cl
00597C79 |. 8D45 D8 |lea eax,[local.10]
00597C7C |. 33D2 |xor edx,edx
00597C7E |. 8A55 E6 |mov dl,byte ptr ss:[ebp-1A]
00597C81 |. 0BD7 |or edx,edi
00597C83 |. E8 20CFE6FF |call NetUSB_e.00404BA8
00597C88 |. 8B55 D8 |mov edx,[local.10]
00597C8B |. 8D45 E0 |lea eax,[local.8]
00597C8E |. E8 05D0E6FF |call NetUSB_e.00404C98
00597C93 |. FF45 F0 |inc [local.4]
00597C96 |. 33FF |xor edi,edi
00597C98 |. 83FB 06 |cmp ebx,6
00597C9B |. 7C 07 |jl short NetUSB_e.00597CA4
00597C9D |. BB 02000000 |mov ebx,2
00597CA2 |. EB 1D |jmp short NetUSB_e.00597CC1
00597CA4 |> 83C3 02 |add ebx,2
00597CA7 |> 8BCB |mov ecx,ebx
00597CA9 |. 8A45 E7 |mov al,byte ptr ss:[ebp-19]
00597CAC |. D2E0 |shl al,cl
00597CAE |. 8845 E6 |mov byte ptr ss:[ebp-1A],al
00597CB1 |. 8A441D E8 |mov al,byte ptr ss:[ebp+ebx-18]
00597CB5 |. 2045 E6 |and byte ptr ss:[ebp-1A],al
00597CB8 |. B8 08000000 |mov eax,8
00597CBD |. 2BC3 |sub eax,ebx
00597CBF |. 03F8 |add edi,eax
00597CC1 |> 46 |inc esi
00597CC2 |> 3B75 F4 |cmp esi,[local.3]
00597CC5 |.^ 0F8C 47FFFFFF \jl NetUSB_e.00597C12
00597CCB |> 8D45 E0 lea eax,[local.8]
00597CCE |. 8B55 F0 mov edx,[local.4]
00597CD1 |. E8 3ED3E6FF call NetUSB_e.00405014
00597CD6 |. 8B45 F8 mov eax,[local.2]
00597CD9 |. 8B55 E0 mov edx,[local.8]
00597CDC |. E8 3BCDE6FF call NetUSB_e.00404A1C
00597CE1 |. 33C0 xor eax,eax
00597CE3 |. 5A pop edx
00597CE4 |. 59 pop ecx
00597CE5 |. 59 pop ecx
00597CE6 |. 64:8910 mov dword ptr fs:[eax],edx
00597CE9 |. 68 0B7D5900 push NetUSB_e.00597D0B
00597CEE |> 8D45 D8 lea eax,[local.10]
00597CF1 |. BA 03000000 mov edx,3
00597CF6 |. E8 F1CCE6FF call NetUSB_e.004049EC
00597CFB |. 8D45 FC lea eax,[local.1]
00597CFE |. E8 C5CCE6FF call NetUSB_e.004049C8
00597D03 \. C3 retn
-------------------------------------------------------------------------------------------------------------
这是一个类Base64DecodeStr函数,调试时的注释被我不小心清除了^_&,大家可以参考Base64相关资料进行调试,记为DecodeStr(),用Delphi 7.0
表示如下:
Function DecodeStr(Const Value: String): String;
Begin
SetLength(Result, (Length(Value) Div 4) * 3);
SetLength(Result, Decode(@Value[1], @Result[1], Length(Value)));
End;
Function Decode(pInput: pointer; pOutput: pointer; Size: longint): longint;
Var
i, j, iptr, optr: integer;
Temp: Array[0..3] Of byte;
Input, Output: PByteArray;
Begin
Input := PByteArray(pInput); Output := PByteArray(pOutput);
iptr := 0; optr := 0;
Result := 0;
For i := 1 To (Size Div 4) Do
Begin
For j := 0 To 3 Do
Begin
If Input^[iptr] <> 0 Then Temp[j] := Input^[iptr] - $3C Else Temp[j] := $FF; ;
Inc(iptr);
End;
Output^[optr] := (Temp[0] Shl 2) Or (Temp[1] Shr 4);
Result := optr + 1;
If (Temp[2] <> $FF) And (Temp[3] = $FF) Then
Begin
Output^[optr + 1] := (Temp[1] Shl 4) Or (Temp[2] Shr 2);
Result := optr + 2;
Inc(optr)
End
Else If (Temp[2] <> $FF) Then
Begin
Output^[optr + 1] := (Temp[1] Shl 4) Or (Temp[2] Shr 2);
Output^[optr + 2] := (Temp[2] Shl 6) Or Temp[3];
Result := optr + 3;
Inc(optr, 2);
End;
Inc(optr);
End;
End;
作者将软件中的提示信息,比如注册成功等提示也是通过这个函数解密后才显示的,所以我们直接找不到有用的提示信息。
2、call NetUSB_e.004EF6BC 函数
-------------------------------------------------------------------------------------------------------------
004EF6BC /$ 55 push ebp ; 注册验证函数
004EF6BD |. 8BEC mov ebp,esp
004EF6BF |. 83C4 F0 add esp,-10
004EF6C2 |. 53 push ebx
004EF6C3 |. 33DB xor ebx,ebx
004EF6C5 |. 895D F0 mov [local.4],ebx
004EF6C8 |. 895D F4 mov [local.3],ebx
004EF6CB |. 894D F8 mov [local.2],ecx ; 用户名
004EF6CE |. 8955 FC mov [local.1],edx
004EF6D1 |. 8BD8 mov ebx,eax
004EF6D3 |. 8B45 FC mov eax,[local.1]
004EF6D6 |. E8 9D57F1FF call NetUSB_e.00404E78
004EF6DB |. 8B45 F8 mov eax,[local.2]
004EF6DE |. E8 9557F1FF call NetUSB_e.00404E78
004EF6E3 |. 8B45 08 mov eax,[arg.1]
004EF6E6 |. E8 8D57F1FF call NetUSB_e.00404E78
004EF6EB |. 33C0 xor eax,eax
004EF6ED |. 55 push ebp
004EF6EE |. 68 A6F74E00 push NetUSB_e.004EF7A6
004EF6F3 |. 64:FF30 push dword ptr fs:[eax]
004EF6F6 |. 64:8920 mov dword ptr fs:[eax],esp
004EF6F9 |. 8B45 FC mov eax,[local.1] ; '网络**'
004EF6FC |. E8 8F55F1FF call NetUSB_e.00404C90 ; System.@LStrLen(String):Integer;
004EF701 |. 3B43 4C cmp eax,dword ptr ds:[ebx+4C] ; cmp length('网络**'),$32
004EF704 |. 7F 19 jg short NetUSB_e.004EF71F
004EF706 |. 8B45 FC mov eax,[local.1]
004EF709 |. E8 8255F1FF call NetUSB_e.00404C90 ; System.@LStrLen(String):Integer;
004EF70E |. 3B43 50 cmp eax,dword ptr ds:[ebx+50] ; cmp length('网络**'),$3
004EF711 |. 7C 0C jl short NetUSB_e.004EF71F
004EF713 |. 8B45 08 mov eax,[arg.1]
004EF716 |. E8 7555F1FF call NetUSB_e.00404C90 ; System.@LStrLen(String):Integer;
004EF71B |. 85C0 test eax,eax
004EF71D |. 75 04 jnz short NetUSB_e.004EF723
004EF71F |> 33DB xor ebx,ebx
004EF721 |. EB 60 jmp short NetUSB_e.004EF783
004EF723 |> 8D55 F4 lea edx,[local.3]
004EF726 |. 8B45 08 mov eax,[arg.1]
004EF729 |. E8 669BF1FF call NetUSB_e.00409294 ; UpperCase(AnsiString):AnsiString;
004EF72E |. 8B55 F4 mov edx,[local.3]
004EF731 |. 8D45 08 lea eax,[arg.1]
004EF734 |. E8 2753F1FF call NetUSB_e.00404A60
004EF739 |. 8D4D F0 lea ecx,[local.4]
004EF73C |. 8B55 FC mov edx,[local.1]
004EF73F |. 8BC3 mov eax,ebx
004EF741 |. E8 46FBFFFF call NetUSB_e.004EF28C ; 产生注册码!!
004EF746 |. 8B45 F0 mov eax,[local.4] ; 硬盘物理序列号经过2次变换的结果,为伪注册码
004EF749 |. 8B55 08 mov edx,[arg.1] ; 变换后的试炼码
004EF74C |. E8 BB9BF1FF call NetUSB_e.0040930C ; SysUtils.CompareStr(AnsiString;AnsiString):Integer;
004EF751 |. 85C0 test eax,eax
004EF753 |. 74 04 je short NetUSB_e.004EF759 ; 又一个注册验证爆破点
004EF755 |. 33DB xor ebx,ebx
004EF757 |. EB 2A jmp short NetUSB_e.004EF783 ; 不一致,Over!
004EF759 |> 8D43 48 lea eax,dword ptr ds:[ebx+48]
004EF75C |. 8B55 FC mov edx,[local.1]
004EF75F |. E8 B852F1FF call NetUSB_e.00404A1C
004EF764 |. 8D43 54 lea eax,dword ptr ds:[ebx+54]
004EF767 |. 8B55 F8 mov edx,[local.2]
004EF76A |. E8 AD52F1FF call NetUSB_e.00404A1C
004EF76F |. 8D43 5C lea eax,dword ptr ds:[ebx+5C]
004EF772 |. 8B55 08 mov edx,[arg.1]
004EF775 |. E8 A252F1FF call NetUSB_e.00404A1C
004EF77A |. 8BC3 mov eax,ebx
004EF77C |. E8 53020000 call NetUSB_e.004EF9D4
004EF781 |. B3 01 mov bl,1
004EF783 |> 33C0 xor eax,eax
004EF785 |. 5A pop edx
004EF786 |. 59 pop ecx
004EF787 |. 59 pop ecx
004EF788 |. 64:8910 mov dword ptr fs:[eax],edx
004EF78B |. 68 ADF74E00 push NetUSB_e.004EF7AD
004EF790 |> 8D45 F0 lea eax,[local.4]
004EF793 |. BA 04000000 mov edx,4
004EF798 |. E8 4F52F1FF call NetUSB_e.004049EC
004EF79D |. 8D45 08 lea eax,[arg.1]
004EF7A0 |. E8 2352F1FF call NetUSB_e.004049C8
004EF7A5 \. C3 retn
-------------------------------------------------------------------------------------------------------------
在这个函数中,我们可以看到:
004EF741 |. E8 46FBFFFF call NetUSB_e.004EF28C ; 产生注册码!!
004EF746 |. 8B45 F0 mov eax,[local.4] ; 硬盘物理序列号经过2次变换的结果,为伪注册码
004EF749 |. 8B55 08 mov edx,[arg.1] ; 变换后的试炼码
004EF74C |. E8 BB9BF1FF call NetUSB_e.0040930C ; SysUtils.CompareStr(AnsiString;AnsiString):Integer;
004EF751 |. 85C0 test eax,eax
004EF753 |. 74 04 je short NetUSB_e.004EF759 ; 又一个注册验证爆破点 软件的注册验证是:call NetUSB_e.004EF28C()=DecodeStr(试炼码),即f1()=f2()的形式,要的到注册码我们要做的是:
1、分析f1()函数,求得计算结果;
2、写出f2()的反函数,根据f1()的计算结果求得软件注册码;
通过上面分析,f1()函数即DecodeStr是个类Base64算法,那么我们可以参考Base64EncodeStr,写出DecodeStr的反函数EncodeStr,Delphi 7.0
表示如下:
Function EncodeStr(Const Value: String): String;
Begin
SetLength(Result, ((Length(Value) + 2) Div 3) * 4);
Encode(@Value[1], @Result[1], Length(Value));
End;
Function Encode(pInput: pointer; pOutput: pointer; Size: longint): longint;
Var
i, iptr, optr: integer;
Input, Output: PByteArray;
Begin
Input := PByteArray(pInput); Output := PByteArray(pOutput);
iptr := 0; optr := 0;
For i := 1 To (Size Div 3) Do
Begin
Output^[optr + 0] := Input^[iptr] Shr 2 + $3C;
Output^[optr + 1] := ((Input^[iptr] And 3) Shl 4) + (Input^[iptr + 1] Shr 4) + $3C;
Output^[optr + 2] := ((Input^[iptr + 1] And 15) Shl 2) + (Input^[iptr + 2] Shr 6) + $3C;
Output^[optr + 3] := Input^[iptr + 2] And 63 + $3C;
Inc(optr, 4); Inc(iptr, 3);
End;
Case (Size Mod 3) Of
1: Begin
Output^[optr + 0] := Input^[iptr] Shr 2 + $3C;
Output^[optr + 1] := (Input^[iptr] And 3) Shl 4 + $3C;
Output^[optr + 2] := byte(0);
Output^[optr + 3] := byte(0);
End;
2: Begin
Output^[optr + 0] := Input^[iptr] Shr 2 + $3C;
Output^[optr + 1] := ((Input^[iptr] And 3) Shl 4) + (Input^[iptr + 1] Shr 4) + $3C;
Output^[optr + 2] := (Input^[iptr + 1] And 15) Shl 2 + $3C;
Output^[optr + 3] := byte(0);
End;
End;
Result := ((Size + 2) Div 3) * 4;
End;
至此,我们离胜利不远了!!!!!,剩下一个在004EF741处的函数call NetUSB_e.004EF28C
call NetUSB_e.004EF28C
-------------------------------------------------------------------------------------------------------------
004EF28C /$ 55 push ebp
004EF28D |. 8BEC mov ebp,esp
004EF28F |. 51 push ecx
004EF290 |. B9 04000000 mov ecx,4
004EF295 |> 6A 00 /push 0
004EF297 |. 6A 00 |push 0
004EF299 |. 49 |dec ecx
004EF29A |.^ 75 F9 \jnz short NetUSB_e.004EF295
004EF29C |. 874D FC xchg [local.1],ecx
004EF29F |. 53 push ebx
004EF2A0 |. 56 push esi
004EF2A1 |. 57 push edi
004EF2A2 |. 8BF9 mov edi,ecx
004EF2A4 |. 8955 FC mov [local.1],edx
004EF2A7 |. 8BF0 mov esi,eax
004EF2A9 |. 8B45 FC mov eax,[local.1] ; '网络**'
004EF2AC |. E8 C75BF1FF call NetUSB_e.00404E78
004EF2B1 |. 33C0 xor eax,eax
004EF2B3 |. 55 push ebp
004EF2B4 |. 68 2CF44E00 push NetUSB_e.004EF42C
004EF2B9 |. 64:FF30 push dword ptr fs:[eax]
004EF2BC |. 64:8920 mov dword ptr fs:[eax],esp
004EF2BF |. 8D55 DC lea edx,[local.9]
004EF2C2 |. 8BC6 mov eax,esi
004EF2C4 |. E8 FF0E0000 call NetUSB_e.004F01C8 ; HDSerialNumber()
004EF2C9 |. 8B45 DC mov eax,[local.9] ; 硬盘物理序列号转换结果
004EF2CC |. 8D55 EC lea edx,[local.5]
004EF2CF |. E8 10A2F1FF call NetUSB_e.004094E4 ; SysUtils.Trim(AnsiString):AnsiString;overload;
004EF2D4 |. 837D EC 00 cmp [local.5],0 ; 去前后空格
004EF2D8 |. 75 0D jnz short NetUSB_e.004EF2E7
004EF2DA |. 8D45 E0 lea eax,[local.8]
004EF2DD |. 8B55 FC mov edx,[local.1]
004EF2E0 |. E8 7B57F1FF call NetUSB_e.00404A60
004EF2E5 |. EB 5D jmp short NetUSB_e.004EF344
004EF2E7 |> 8B45 EC mov eax,[local.5]
004EF2EA |. E8 A159F1FF call NetUSB_e.00404C90 ; System.@LStrLen(String):Integer;
004EF2EF |. 8BD8 mov ebx,eax ; 长度
004EF2F1 |. 8D45 E8 lea eax,[local.6] ; (保存后面函数LStrCopy的结果,即硬盘物理序列号转换结果的
前半部分)
004EF2F4 |. 50 push eax
004EF2F5 |. 8BCB mov ecx,ebx
004EF2F7 |. D1F9 sar ecx,1 ; length Shr 1
004EF2F9 |. 79 03 jns short NetUSB_e.004EF2FE
004EF2FB |. 83D1 00 adc ecx,0
004EF2FE |> BA 01000000 mov edx,1 ; 起始位置1
004EF303 |. 8B45 EC mov eax,[local.5] ; 硬盘物理序列号转换结果
004EF306 |. E8 DD5BF1FF call NetUSB_e.00404EE8 ; System.@LStrCopy;
004EF30B |. 8D45 E4 lea eax,[local.7] ; 保存后半部分
004EF30E |. 50 push eax
004EF30F |. 8BC3 mov eax,ebx
004EF311 |. D1F8 sar eax,1
004EF313 |. 79 03 jns short NetUSB_e.004EF318
004EF315 |. 83D0 00 adc eax,0
004EF318 |> 8BCB mov ecx,ebx
004EF31A |. 2BC8 sub ecx,eax
004EF31C |. 8BD3 mov edx,ebx
004EF31E |. D1FA sar edx,1
004EF320 |. 79 03 jns short NetUSB_e.004EF325
004EF322 |. 83D2 00 adc edx,0
004EF325 |> 42 inc edx
004EF326 |. 8B45 EC mov eax,[local.5]
004EF329 |. E8 BA5BF1FF call NetUSB_e.00404EE8 ; System.@LStrCopy;取后半部分
004EF32E |. FF75 E8 push [local.6] ; 前半部分
004EF331 |. FF75 FC push [local.1] ; '网络**'
004EF334 |. FF75 E4 push [local.7] ; '后半部分'
004EF337 |. 8D45 E0 lea eax,[local.8]
004EF33A |. BA 03000000 mov edx,3
004EF33F |. E8 0C5AF1FF call NetUSB_e.00404D50 ; System.@LStrCatN,字符串连接函数;
004EF344 |> C745 F0 00000000 mov [local.4],0
004EF34B |. C745 F4 00000000 mov [local.3],0
004EF352 |. 8B45 FC mov eax,[local.1] ; '网络**'
004EF355 |. E8 3659F1FF call NetUSB_e.00404C90 ; System.@LStrLen(String):Integer;
004EF35A |. 3B46 4C cmp eax,dword ptr ds:[esi+4C] ; $32
004EF35D |. 7F 0D jg short NetUSB_e.004EF36C
004EF35F |. 8B45 FC mov eax,[local.1]
004EF362 |. E8 2959F1FF call NetUSB_e.00404C90
004EF367 |. 3B46 50 cmp eax,dword ptr ds:[esi+50] ; 3
004EF36A |. 7D 0C jge short NetUSB_e.004EF378
004EF36C |> 8BC7 mov eax,edi
004EF36E |. E8 5556F1FF call NetUSB_e.004049C8
004EF373 |. E9 91000000 jmp NetUSB_e.004EF409
004EF378 |> 8B45 E0 mov eax,[local.8] ; 前半部分+'网络**'+后半部分
004EF37B |. E8 1059F1FF call NetUSB_e.00404C90 ; System.@LStrLen(String):Integer;
004EF380 |. 8BD8 mov ebx,eax
004EF382 |. EB 37 jmp short NetUSB_e.004EF3BB ; 下面代码与硬盘物理序列号转换函数一样!
004EF384 |> 8B45 F0 /mov eax,[local.4] ; 参考004F01C8处注释
004EF387 |. 8B55 F4 |mov edx,[local.3]
004EF38A |. 0346 68 |add eax,dword ptr ds:[esi+68]
004EF38D |. 1356 6C |adc edx,dword ptr ds:[esi+6C]
004EF390 |. 52 |push edx
004EF391 |. 50 |push eax
004EF392 |. 8B45 E0 |mov eax,[local.8]
004EF395 |. 0FB64418 FF |movzx eax,byte ptr ds:[eax+ebx-1]
004EF39A |. 50 |push eax
004EF39B |. B8 59040000 |mov eax,459
004EF3A0 |. 5A |pop edx
004EF3A1 |. 8BCA |mov ecx,edx
004EF3A3 |. 33D2 |xor edx,edx
004EF3A5 |. F7F1 |div ecx
004EF3A7 |. 8BC2 |mov eax,edx
004EF3A9 |. 33D2 |xor edx,edx
004EF3AB |. 290424 |sub dword ptr ss:[esp],eax
004EF3AE |. 195424 04 |sbb dword ptr ss:[esp+4],edx
004EF3B2 |. 58 |pop eax
004EF3B3 |. 5A |pop edx
004EF3B4 |. 8945 F0 |mov [local.4],eax
004EF3B7 |. 8955 F4 |mov [local.3],edx
004EF3BA |. 4B |dec ebx
004EF3BB |> 8B45 E0 mov eax,[local.8]
004EF3BE |. E8 CD58F1FF |call NetUSB_e.00404C90
004EF3C3 |. 3BD8 |cmp ebx,eax
004EF3C5 |. 7F 04 |jg short NetUSB_e.004EF3CB
004EF3C7 |. 85DB |test ebx,ebx
004EF3C9 |.^ 7F B9 \jg short NetUSB_e.004EF384
004EF3CB |> 8B5E 60 mov ebx,dword ptr ds:[esi+60]
004EF3CE |. 85DB test ebx,ebx
004EF3D0 |. 7F 11 jg short NetUSB_e.004EF3E3
004EF3D2 |. FF75 F4 push [local.3] ; /Arg2
004EF3D5 |. FF75 F0 push [local.4] ; |Arg1
004EF3D8 |. 8BD7 mov edx,edi ; |
004EF3DA |. 33C0 xor eax,eax ; |
004EF3DC |. E8 4BA5F1FF call NetUSB_e.0040992C ; \NetUSB_e.0040992C
004EF3E1 |. EB 26 jmp short NetUSB_e.004EF409
004EF3E3 |> FF75 F4 push [local.3] ; /Arg2
004EF3E6 |. FF75 F0 push [local.4] ; |Arg1
004EF3E9 |. 8BD7 mov edx,edi ; |
004EF3EB |. 8BC3 mov eax,ebx ; |
004EF3ED |. E8 3AA5F1FF call NetUSB_e.0040992C ; \NetUSB_e.0040992C
004EF3F2 |. 8B07 mov eax,dword ptr ds:[edi]
004EF3F4 |. E8 9758F1FF call NetUSB_e.00404C90
004EF3F9 |. 8BC8 mov ecx,eax
004EF3FB |. 2B4E 60 sub ecx,dword ptr ds:[esi+60]
004EF3FE |. 8B56 60 mov edx,dword ptr ds:[esi+60]
004EF401 |. 42 inc edx
004EF402 |. 8BC7 mov eax,edi
004EF404 |. E8 1F5BF1FF call NetUSB_e.00404F28
004EF409 |> 33C0 xor eax,eax
004EF40B |. 5A pop edx
004EF40C |. 59 pop ecx
004EF40D |. 59 pop ecx
004EF40E |. 64:8910 mov dword ptr fs:[eax],edx
004EF411 |. 68 33F44E00 push NetUSB_e.004EF433
004EF416 |> 8D45 DC lea eax,[local.9]
004EF419 |. BA 05000000 mov edx,5
004EF41E |. E8 C955F1FF call NetUSB_e.004049EC
004EF423 |. 8D45 FC lea eax,[local.1]
004EF426 |. E8 9D55F1FF call NetUSB_e.004049C8
004EF42B \. C3 retn ; 以上代码同硬盘物理序列号转换函数
------------------------------------------------------------------------------------------------------------- 通过动态调试得知:
程序通过在004EF2C4处调用call NetUSB_e.004F01C8 ,获的硬盘物理序列号的首次转换结果 记为HDSerialNumber,在HDSerialNumber中间插
入'网络**'(应用程序的产品名称),形如:HDSerialNumber前半部分+'网络**'+HDSerialNumber后半部分,通过004EF382 ~004EF3F2的代码转
换的结果即为f1()的返回值,这正是我们所需要的,那么先看看call NetUSB_e.004F01C8函数吧:
call NetUSB_e.004F01C8
-------------------------------------------------------------------------------------------------------------
004F01C8 /$ 55 push ebp ; 获取硬盘物理序列号并转换
004F01C9 |. 8BEC mov ebp,esp
004F01CB |. 83C4 F0 add esp,-10
004F01CE |. 53 push ebx
004F01CF |. 56 push esi
004F01D0 |. 57 push edi
004F01D1 |. 33C9 xor ecx,ecx
004F01D3 |. 894D FC mov [local.1],ecx
004F01D6 |. 8BFA mov edi,edx
004F01D8 |. 8BF0 mov esi,eax
004F01DA |. 33C0 xor eax,eax
004F01DC |. 55 push ebp
004F01DD |. 68 AB024F00 push NetUSB_e.004F02AB
004F01E2 |. 64:FF30 push dword ptr fs:[eax]
004F01E5 |. 64:8920 mov dword ptr fs:[eax],esp
004F01E8 |. C745 F0 00000000 mov [local.4],0
004F01EF |. C745 F4 00000000 mov [local.3],0
004F01F6 |. 8D45 FC lea eax,[local.1]
004F01F9 |. 8B96 94000000 mov edx,dword ptr ds:[esi+94] ; 硬盘物理序列号 HDSerailNo
004F01FF |. E8 5C48F1FF call NetUSB_e.00404A60
004F0204 |. 8B45 FC mov eax,[local.1] ; HDSerailNo
004F0207 |. E8 844AF1FF call NetUSB_e.00404C90 ; System.@LStrLen(String):Integer;
004F020C |. 8BD8 mov ebx,eax
004F020E |. EB 37 jmp short NetUSB_e.004F0247
004F0210 |> 8B46 68 /mov eax,dword ptr ds:[esi+68] ; $F1C981EE
004F0213 |. 8B56 6C |mov edx,dword ptr ds:[esi+6C] ; $0A73A485
004F0216 |. 0345 F0 |add eax,[local.4]
004F0219 |. 1355 F4 |adc edx,[local.3] ; 带符号加法
004F021C |. 52 |push edx ; 常数$0A73A485入栈
004F021D |. 50 |push eax ; 常数$F1C981EE入栈
004F021E |. 8B45 FC |mov eax,[local.1] ; HDSerailNo
004F0221 |. 0FB64418 FF |movzx eax,byte ptr ds:[eax+ebx-1] ; HDSerailNo[i],从后面开始取字符
004F0226 |. 50 |push eax
004F0227 |. B8 59040000 |mov eax,459 ; $459
004F022C |. 5A |pop edx ; EDX=HDSerailNo[i]
004F022D |. 8BCA |mov ecx,edx ; ECX=HDSerailNo[i]
004F022F |. 33D2 |xor edx,edx
004F0231 |. F7F1 |div ecx ; $459 div HDSerailNo[i]
004F0233 |. 8BC2 |mov eax,edx ; EAX=余数
004F0235 |. 33D2 |xor edx,edx ; 0
004F0237 |. 290424 |sub dword ptr ss:[esp],eax ; $F1C981EE-余数
004F023A |. 195424 04 |sbb dword ptr ss:[esp+4],edx ; $0A73A485-0
004F023E |. 58 |pop eax ; $F1C981EE-余数
004F023F |. 5A |pop edx ; $0A73A485-0
004F0240 |. 8945 F0 |mov [local.4],eax
004F0243 |. 8955 F4 |mov [local.3],edx
004F0246 |. 4B |dec ebx ; i=i-1
004F0247 |> 8B45 FC mov eax,[local.1] ; 硬盘物理序列号
004F024A |. E8 414AF1FF |call NetUSB_e.00404C90 ; System.@LStrLen(String):Integer;
004F024F |. 3BD8 |cmp ebx,eax
004F0251 |. 7F 04 |jg short NetUSB_e.004F0257
004F0253 |. 85DB |test ebx,ebx
004F0255 |.^ 7F B9 \jg short NetUSB_e.004F0210 ; i<length(HDSerailNo)继续循环
004F0257 |> 8B5E 60 mov ebx,dword ptr ds:[esi+60]
004F025A |. 85DB test ebx,ebx
004F025C |. 7F 11 jg short NetUSB_e.004F026F
004F025E |. FF75 F4 push [local.3] ; /Arg2
004F0261 |. FF75 F0 push [local.4] ; |Arg1
004F0264 |. 8BD7 mov edx,edi ; |
004F0266 |. 33C0 xor eax,eax ; |
004F0268 |. E8 BF96F1FF call NetUSB_e.0040992C ; \SysUtils.IntToHex(Int64;Integer):AnsiString;overload;
004F026D |. EB 26 jmp short NetUSB_e.004F0295
004F026F |> FF75 F4 push [local.3] ; /Arg2
004F0272 |. FF75 F0 push [local.4] ; |Arg1
004F0275 |. 8BD7 mov edx,edi ; |
004F0277 |. 8BC3 mov eax,ebx ; |
004F0279 |. E8 AE96F1FF call NetUSB_e.0040992C ; \SysUtils.IntToHex(Int64;Integer):AnsiString;overload;
004F027E |. 8B07 mov eax,dword ptr ds:[edi]
004F0280 |. E8 0B4AF1FF call NetUSB_e.00404C90 ; System.@LStrLen(String):Integer;
004F0285 |. 8BC8 mov ecx,eax
004F0287 |. 2B4E 60 sub ecx,dword ptr ds:[esi+60]
004F028A |. 8B56 60 mov edx,dword ptr ds:[esi+60]
004F028D |. 42 inc edx
004F028E |. 8BC7 mov eax,edi
004F0290 |. E8 934CF1FF call NetUSB_e.00404F28 ; System.@LStrDelete;
004F0295 |> 33C0 xor eax,eax
004F0297 |. 5A pop edx
004F0298 |. 59 pop ecx
004F0299 |. 59 pop ecx
004F029A |. 64:8910 mov dword ptr fs:[eax],edx
004F029D |. 68 B2024F00 push NetUSB_e.004F02B2
004F02A2 |> 8D45 FC lea eax,[local.1]
004F02A5 |. E8 1E47F1FF call NetUSB_e.004049C8
004F02AA \. C3 retn ; 转换结束
-------------------------------------------------------------------------------------------------------------
好像是硬盘物理序列号参与一个大数运算,用Delphi表示如下:
Function SerialNumber(Str: String): String; //硬盘序列号转换函数
Var
i: Integer;
X: Int64;
Begin
X := 0;
For i := Length(Str) Downto 1 Do
Begin
X := X + $0A73A485F1C981EE;
X := X - $459 Mod Ord(Str[i]);
End;
Result := IntToHex(X, 16);
If Length(Str) = 0 Then Result := #0;
End;
SerialNumber(硬盘物理序列号)=HDSerialNumber,再在中间插入产品名称"网络**",仔细看看004EF382 ~004EF3F2的代码,你发现了什么?和
call NetUSB_e.004F01C8函数一样,有点郁闷,这是软件作者写了两次同样的代码,还是OD的问题?不管了,到此为止,我们已经有了注册过程
中所有重要的函数了,归纳一下:
1、DecodeStr(注册码)=SN1
2、SerialNumber(硬盘物理序列号)=HDSerialNumber
3、SerialNumber(HDSerialNumber前半部分+'网络**'+HDSerialNumber后半部分)=SN2
if SN1=SN2 Then 注册成功!
通过3,可求的SN2,那么通过DecodeStr()的反函数EncodeStr(SN2),就可以求的软件的注册码了!!!
delphi注册机框架表示如下:
Procedure TFrmMain.FormCreate(Sender: TObject);
Begin
edt1.Text := Trim(GetIdeSerialNumber()); //GetIdeSerialNumber()获取硬盘物理序列号函数
End;
Procedure TFrmMain.edt1Change(Sender: TObject);
Var
MachineNo: String;
Begin
MachineNo := Trim(SerialNumber(edt1.Text)); //SerialNumber(硬盘物理序列号)=HDSerialNumber
edt2.Text := MachineNo
MachineNo := LeftStr(MachineNo, Length(MachineNo) Shr 1) + '网络**' + RightStr(MachineNo, Length(MachineNo) -
Length(MachineNo) Shr 1);
//SerialNumber(HDSerialNumber前半部分+'网络**'+HDSerialNumber后半部分)
MachineNo := Trim(SerialNumber(MachineNo));
edt3.Text := EncodeStr(MachineNo); //EncodeStr(SN2) 注册码
End;
说明:因为在我的笔记本上无法正确显示机器码,不知道机器码是什么形式显示的,所有我就直接安装软件作者的思想,直接从硬盘物理序列号求
注册码了,要是能正确显示的应该是HDSerialNumber,可能在中间加点 '-' 如AAA-BBB-CCCCCCC等样子。 如果你是个懒人话,背上TNT,跟我来,暴了它……
第一处:重启验证
005AEBAD |. B8 5CEE5A00 mov eax,NetUSB_e.005AEE5C ; ASCII "qvFntL"
005AEBB2 >|. E8 E98FFEFF call NetUSB_e.00597BA0 ; ->:THttpCli._PROC_00597BA0()
005AEBB7 |. 8B45 F4 mov eax,[local.3] ; '注册'
005AEBBA |. 5A pop edx
005AEBBB >|. E8 0C64E5FF call NetUSB_e.00404FCC ; ->System.@LStrPos;
005AEBC0 |. 85C0 test eax,eax
005AEBC2 |. 0F8F 2F020000 jg NetUSB_e.005AEDF7
005AEBC8 |. 33D2 xor edx,edx
005AEBCA >|. 8B86 D0030000 mov eax,dword ptr ds:[esi+3D0] ; *PCl:N.A.
005AEBD0 |. 8B08 mov ecx,dword ptr ds:[eax]
005AEBD2 |. FF91 C0010000 call dword ptr ds:[ecx+1C0]
005AEBD8 |. 8BC6 mov eax,esi
005AEBDA |. E8 91F0FFFF call NetUSB_e.005ADC70
005AEBDF >|. 8B86 64030000 mov eax,dword ptr ds:[esi+364] ; *MeKao:N.A.
005AEBE5 >|. E8 9A06F4FF call NetUSB_e.004EF284 ; ->ActiveX.PROPSETHDR_OSVER_KIND(DWORD):Word;<+>
005AEBEA |. 84C0 test al,al ; 真正爆破点!!
005AEBEC |. 0F84 B6000000 je NetUSB_e.005AECA8
005AEBF2 |. 8D55 F0 lea edx,[local.4]
005AEBF5 >|. 8B86 64030000 mov eax,dword ptr ds:[esi+364] ; *MeKao:N.A.
005AEBFB |. 8B40 54 mov eax,dword ptr ds:[eax+54]
005AEBFE >|. E8 E1A8E5FF call NetUSB_e.004094E4 ; ->SysUtils.Trim(AnsiString):AnsiString;overload;
005AEC03 |. 837D F0 00 cmp [local.4],0
005AEC07 |. 0F84 9B000000 je NetUSB_e.005AECA8
005AEC0D |. 33D2 xor edx,edx ; 下面是隐藏注册菜单
005AEC0F >|. 8B86 4C030000 mov eax,dword ptr ds:[esi+34C] ; *Pl_Web:N.A.
005AEC15 >|. E8 72FFE9FF call NetUSB_e.0044EB8C ; ->Controls.TControl.SetVisible(TControl;Boolean);
005AEC1A |. 33D2 xor edx,edx
005AEC1C >|. 8B86 5C030000 mov eax,dword ptr ds:[esi+35C] ; *N6:N.A.
005AEC22 >|. E8 5D1FEBFF call NetUSB_e.00460B84 ; ->Menus.TMenuItem.SetVisible(TMenuItem;Boolean);
005AEC27 |. 33D2 xor edx,edx
005AEC29 >|. 8B86 CC030000 mov eax,dword ptr ds:[esi+3CC] ; *N36:N.A.
005AEC2F >|. E8 501FEBFF call NetUSB_e.00460B84 ; ->Menus.TMenuItem.SetVisible(TMenuItem;Boolean);
005AEC34 |. 8D55 EC lea edx,[local.5]
005AEC37 |. 8BC6 mov eax,esi
005AEC39 >|. E8 2E00EAFF call NetUSB_e.0044EC6C ; ->Controls.TControl.GetText(TControl):TCaption;
005AEC3E |. 8D45 EC lea eax,[local.5]
第二处:注册验证
005A4118 |. A1 6C285C00 mov eax,dword ptr ds:[5C286C]
005A411D |. 8B00 mov eax,dword ptr ds:[eax]
005A411F |. 8B80 64030000 mov eax,dword ptr ds:[eax+364]
005A4125 |. 59 pop ecx ; '用户名'
005A4126 |. E8 91B5F4FF call NetUSB_e.004EF6BC ; 注册验证,关键!
005A412B |. 84C0 test al,al
005A412D |. 75 09 jnz short NetUSB_e.005A4138 ; 验证通不过,调用Halt结束程序。
005A412F |. 33C0 xor eax,eax
005A4131 >|. E8 D607E6FF call NetUSB_e.0040490C ; ->System.@Halt(Integer);
005A4136 |. EB 59 jmp short NetUSB_e.005A4191 ………………………………………………………………………………………………………………………………………………
不能正确显示我的机器码我一直很郁闷,也没时间去好好看看,要是看象我一样看不到机器码,硬盘物理序列号不知道(我相信坛子里的人自己
硬盘序列号肯定都背的出来,因为你们调试的太多了!),总不会去拆机箱吧?哪我们从注册界面上获取注册信息按钮下手,Dede查的事件地址
005A47C0 下断:
005A47C0 >/. 55 push ebp ; <-TForm9@Bn_GetRegCodeClick
005A47C1 |. 8BEC mov ebp,esp
005A47C3 |. B9 0B000000 mov ecx,0B
005A47C8 |> 6A 00 /push 0
005A47CA |. 6A 00 |push 0
005A47CC |. 49 |dec ecx
005A47CD |.^ 75 F9 \jnz short NetUSB_e.005A47C8
005A47CF |. 51 push ecx
005A47D0 |. 53 push ebx
005A47D1 |. 8BD8 mov ebx,eax
005A47D3 |. 33C0 xor eax,eax
005A47D5 |. 55 push ebp
005A47D6 |. 68 554A5A00 push <NetUSB_e.->System.@HandleFinal>
005A47DB |. 64:FF30 push dword ptr fs:[eax]
005A47DE |. 64:8920 mov dword ptr fs:[eax],esp
005A47E1 |. 8D55 EC lea edx,[local.5]
005A47E4 >|. 8B83 F8020000 mov eax,dword ptr ds:[ebx+2F8] ; *LEt_RegUser:N.A.
005A47EA >|. E8 7DA4EAFF call NetUSB_e.0044EC6C ; ->Controls.TControl.GetText(TControl):TCaption;
005A47EF |. 8B45 EC mov eax,[local.5] ; 用户名
005A47F2 |. 8D55 F0 lea edx,[local.4]
005A47F5 >|. E8 EA4CE6FF call NetUSB_e.004094E4 ; ->SysUtils.Trim(AnsiString):AnsiString;overload;
005A47FA |. 837D F0 00 cmp [local.4],0
005A47FE |. 75 4F jnz short NetUSB_e.005A484F ; 用户名不能为空
005A4800 |. 6A 30 push 30
005A4802 |. 8D55 E8 lea edx,[local.6] ; 提示注册名为空等信息
005A4805 |. B8 6C4A5A00 mov eax,NetUSB_e.005A4A6C ; ASCII "oJCFk\"
005A480A >|. E8 9133FFFF call NetUSB_e.00597BA0 ; ->:THttpCli._PROC_00597BA0()
005A480F |. 8B45 E8 mov eax,[local.6]
005A4812 >|. E8 7106E6FF call NetUSB_e.00404E88 ; ->System.@LStrToPChar(String):PAnsiChar;
005A4817 |. 50 push eax
005A4818 |. 8D55 E4 lea edx,[local.7]
005A481B |. B8 7C4A5A00 mov eax,NetUSB_e.005A4A7C ; ASCII "qvFntXKwhgk@sHvfkyR_gH[gqi_LlhojpGN_dL"
005A4820 >|. E8 7B33FFFF call NetUSB_e.00597BA0 ; ->:THttpCli._PROC_00597BA0()
005A4825 |. 8B45 E4 mov eax,[local.7]
005A4828 >|. E8 5B06E6FF call NetUSB_e.00404E88 ; ->System.@LStrToPChar(String):PAnsiChar;
005A482D |. 8BD0 mov edx,eax
005A482F |. A1 4C2A5C00 mov eax,dword ptr ds:[5C2A4C]
005A4834 |. 8B00 mov eax,dword ptr ds:[eax]
005A4836 |. 59 pop ecx
005A4837 >|. E8 B4ABECFF call NetUSB_e.0046F3F0 ;
->Forms.TApplication.MessageBox(TApplication;PChar;PChar;Longint):Integer;
005A483C >|. 8B83 F8020000 mov eax,dword ptr ds:[ebx+2F8] ; *LEt_RegUser:N.A.
005A4842 |. 8B10 mov edx,dword ptr ds:[eax]
005A4844 |. FF92 C0000000 call dword ptr ds:[edx+C0]
005A484A |. E9 9F010000 jmp NetUSB_e.005A49EE
005A484F |> B2 01 mov dl,1
005A4851 >|. 8B83 F8020000 mov eax,dword ptr ds:[ebx+2F8] ; *LEt_RegUser:N.A.
005A4857 >|. E8 5073E9FF call NetUSB_e.0043BBAC ;
->StdCtrls.TCustomEdit.SetReadOnly(TCustomEdit;Boolean);
005A485C |. B2 01 mov dl,1
005A485E >|. 8B83 FC020000 mov eax,dword ptr ds:[ebx+2FC] ; *LEt_HardCode:N.A.
005A4864 >|. E8 4373E9FF call NetUSB_e.0043BBAC ;
->StdCtrls.TCustomEdit.SetReadOnly(TCustomEdit;Boolean);
005A4869 |. 33C0 xor eax,eax
005A486B |. 8945 F8 mov [local.2],eax
005A486E |. 8945 FC mov [local.1],eax
005A4871 |. EB 19 jmp short NetUSB_e.005A488C
005A4873 >|> E8 70E3E5FF /call NetUSB_e.00402BE8 ; ->System.Randomize;
005A4878 |. B8 FFC99A3B |mov eax,3B9AC9FF ; 产生一个随机数
005A487D |. E8 CAE9E5FF |call NetUSB_e.0040324C
005A4882 |. 8945 E0 |mov [local.8],eax
005A4885 |. DB45 E0 |fild [local.8]
005A4888 |. DD5D F8 |fstp qword ptr ss:[ebp-8]
005A488B |. 9B |wait
005A488C |> DD45 F8 fld qword ptr ss:[ebp-8]
005A488F |. D81D A44A5A00 |fcomp dword ptr ds:[5A4AA4]
005A4895 |. DFE0 |fstsw ax
005A4897 |. 9E |sahf
005A4898 |.^ 72 D9 \jb short <NetUSB_e.->System.Randomi>
005A489A |. 8D55 D8 lea edx,[local.10]
005A489D |. A1 4C2A5C00 mov eax,dword ptr ds:[5C2A4C]
005A48A2 |. 8B00 mov eax,dword ptr ds:[eax]
005A48A4 >|. E8 8FAFECFF call NetUSB_e.0046F838 ; ->DdeMan.TDdeMgr.GetExeName(TDdeMgr):AnsiString;<+>
005A48A9 |. 8B45 D8 mov eax,[local.10] ; 当前应用程序路径
005A48AC |. 8D55 DC lea edx,[local.9]
005A48AF >|. E8 8026FFFF call NetUSB_e.00596F34 ; ->:THttpCli._PROC_00596F34()
005A48B4 |. FF75 DC push [local.9] ; 产品名称:'网络**'
005A48B7 |. 68 B04A5A00 push NetUSB_e.005A4AB0 ; '|'
005A48BC |. DD45 F8 fld qword ptr ss:[ebp-8]
005A48BF |. 83C4 F4 add esp,-0C
005A48C2 |. DB3C24 fstp tbyte ptr ss:[esp] ; |
005A48C5 |. 9B wait ; |
005A48C6 |. 8D45 D4 lea eax,[local.11] ; |
005A48C9 |. E8 926CE6FF call NetUSB_e.0040B560 ; \NetUSB_e.0040B560
005A48CE |. FF75 D4 push [local.11] ; 随机数?
005A48D1 |. 68 B04A5A00 push NetUSB_e.005A4AB0 ; '|'
005A48D6 |. 8D55 CC lea edx,[local.13]
005A48D9 >|. 8B83 F8020000 mov eax,dword ptr ds:[ebx+2F8] ; *LEt_RegUser:N.A.
005A48DF >|. E8 88A3EAFF call NetUSB_e.0044EC6C ; ->Controls.TControl.GetText(TControl):TCaption;
005A48E4 |. 8B45 CC mov eax,[local.13] ; 用户名
005A48E7 |. 8D55 D0 lea edx,[local.12]
005A48EA >|. E8 F54BE6FF call NetUSB_e.004094E4 ; ->SysUtils.Trim(AnsiString):AnsiString;overload;
005A48EF |. FF75 D0 push [local.12]
005A48F2 |. 68 B04A5A00 push NetUSB_e.005A4AB0
005A48F7 |. 8D55 C4 lea edx,[local.15] ; '|'
005A48FA |. A1 6C285C00 mov eax,dword ptr ds:[5C286C]
005A48FF |. 8B00 mov eax,dword ptr ds:[eax]
005A4901 |. 8B80 64030000 mov eax,dword ptr ds:[eax+364]
005A4907 |. E8 BCB8F4FF call NetUSB_e.004F01C8 ; SerialNumber()
005A490C |. 8B45 C4 mov eax,[local.15] ; 得到HDSerialNumber
005A490F |. 8D55 C8 lea edx,[local.14]
005A4912 >|. E8 CD4BE6FF call NetUSB_e.004094E4 ; ->SysUtils.Trim(AnsiString):AnsiString;overload;
005A4917 |. FF75 C8 push [local.14]
005A491A |. 68 B04A5A00 push NetUSB_e.005A4AB0 ; '|'
005A491F |. 8D55 BC lea edx,[local.17]
005A4922 >|. 8B83 FC020000 mov eax,dword ptr ds:[ebx+2FC] ; *LEt_HardCode:N.A.
005A4928 >|. E8 3FA3EAFF call NetUSB_e.0044EC6C ; ->Controls.TControl.GetText(TControl):TCaption;
005A492D |. 8B45 BC mov eax,[local.17] ; 机器码
005A4930 |. 8D55 C0 lea edx,[local.16]
005A4933 >|. E8 AC4BE6FF call NetUSB_e.004094E4 ; ->SysUtils.Trim(AnsiString):AnsiString;overload;
005A4938 |. FF75 C0 push [local.16] ; 机器码
005A493B |. 68 B04A5A00 push NetUSB_e.005A4AB0 ; '|'
005A4940 |. 8D45 F4 lea eax,[local.3]
005A4943 |. BA 0A000000 mov edx,0A
005A4948 >|. E8 0304E6FF call NetUSB_e.00404D50 ; ->System.@LStrCatN;
005A494D |. 8D55 B8 lea edx,[local.18] ; 将上面的字符串连接起来
005A4950 |. 8B45 F4 mov eax,[local.3] ; 网络**|随机数|用户名|HDSerialNumber|机器码|
005A4953 |. E8 403DFFFF call NetUSB_e.00598698 ; 加密注册信息
005A4958 |. 8B55 B8 mov edx,[local.18]
005A495B |. 8D45 F4 lea eax,[local.3]
005A495E >|. E8 FD00E6FF call NetUSB_e.00404A60 ; ->System.@LStrLAsg(void;void;void;void);
005A4963 |. 8D55 B0 lea edx,[local.20]
005A4966 |. 8B45 F4 mov eax,[local.3]
005A4969 >|. E8 764BE6FF call NetUSB_e.004094E4 ; ->SysUtils.Trim(AnsiString):AnsiString;overload;
005A496E |. 8B45 B0 mov eax,[local.20]
005A4971 |. 8D55 B4 lea edx,[local.19]
005A4974 |. E8 373AFFFF call NetUSB_e.005983B0
005A4979 |. 8B55 B4 mov edx,[local.19]
005A497C |. 8D45 F4 lea eax,[local.3] ; 放到粘贴板中……
005A497F >|. E8 DC00E6FF call NetUSB_e.00404A60 ; ->System.@LStrLAsg(void;void;void;void);
005A4984 >|. E8 2F3CEAFF call NetUSB_e.004485B8 ; ->Clipbrd.Clipboard:TClipboard;<+>
005A4989 |. 8B10 mov edx,dword ptr ds:[eax]
005A498B |. FF52 18 call dword ptr ds:[edx+18]
005A498E |. 8D55 AC lea edx,[local.21]
005A4991 |. 8B45 F4 mov eax,[local.3]
005A4994 >|. E8 4B4BE6FF call NetUSB_e.004094E4 ; ->SysUtils.Trim(AnsiString):AnsiString;overload;
005A4999 |. 8B45 AC mov eax,[local.21]
005A499C |. 50 push eax
005A499D >|. E8 163CEAFF call NetUSB_e.004485B8 ; ->Clipbrd.Clipboard:TClipboard;<+>
005A49A2 |. 5A pop edx
005A49A3 >|. E8 F837EAFF call NetUSB_e.004481A0 ; ->Clipbrd.TClipboard.SetAsText(TClipboard;AnsiString);
005A49A8 >|. E8 0B3CEAFF call NetUSB_e.004485B8 ; ->Clipbrd.Clipboard:TClipboard;<+>
005A49AD |. 8B10 mov edx,dword ptr ds:[eax]
005A49AF |. FF52 14 call dword ptr ds:[edx+14]
005A49B2 |. 6A 30 push 30
005A49B4 |. 8D55 A8 lea edx,[local.22] ; 提示获取注册信息成功。
005A49B7 |. B8 6C4A5A00 mov eax,NetUSB_e.005A4A6C ; ASCII "oJCFk\"
005A49BC >|. E8 DF31FFFF call NetUSB_e.00597BA0 ; ->:THttpCli._PROC_00597BA0()
005A49C1 |. 8B45 A8 mov eax,[local.22]
005A49C4 >|. E8 BF04E6FF call NetUSB_e.00404E88 ; ->System.@LStrToPChar(String):PAnsiChar;
005A49C9 |. 50 push eax
005A49CA |. 8D55 A4 lea edx,[local.23]
005A49CD |. B8 BC4A5A00 mov eax,NetUSB_e.005A4ABC ; ASCII
"piByfyZ^hjCLmXz^jGORmgRyqWKHzW?advoCvwRyPQBwxiKFkKw<wyRooKb_gGZ^nxrtzHwNdVH"
005A49D2 >|. E8 C931FFFF call NetUSB_e.00597BA0 ; ->:THttpCli._PROC_00597BA0()
005A49D7 |. 8B45 A4 mov eax,[local.23]
005A49DA >|. E8 A904E6FF call NetUSB_e.00404E88 ; ->System.@LStrToPChar(String):PAnsiChar;
005A49DF |. 8BD0 mov edx,eax
005A49E1 |. A1 4C2A5C00 mov eax,dword ptr ds:[5C2A4C]
005A49E6 |. 8B00 mov eax,dword ptr ds:[eax]
005A49E8 |. 59 pop ecx
005A49E9 >|. E8 02AAECFF call NetUSB_e.0046F3F0 ;
->Forms.TApplication.MessageBox(TApplication;PChar;PChar;Longint):Integer;
005A49EE |> 33C0 xor eax,eax
005A49F0 |. 5A pop edx
005A49F1 |. 59 pop ecx
005A49F2 |. 59 pop ecx
005A49F3 |. 64:8910 mov dword ptr fs:[eax],edx
005A49F6 |. 68 5C4A5A00 push NetUSB_e.005A4A5C
005A49FB |> 8D45 A4 lea eax,[local.23]
005A49FE |. BA 06000000 mov edx,6
005A4A03 >|. E8 E4FFE5FF call NetUSB_e.004049EC ; ->System.@LStrArrayClr(void;void;Integer);
005A4A08 |. 8D45 BC lea eax,[local.17]
005A4A0B >|. E8 B8FFE5FF call NetUSB_e.004049C8 ; ->System.@LStrClr(void;void);
005A4A10 |. 8D45 C0 lea eax,[local.16]
005A4A13 |. BA 03000000 mov edx,3
005A4A18 >|. E8 CFFFE5FF call NetUSB_e.004049EC ; ->System.@LStrArrayClr(void;void;Integer);
005A4A1D |. 8D45 CC lea eax,[local.13]
005A4A20 >|. E8 A3FFE5FF call NetUSB_e.004049C8 ; ->System.@LStrClr(void;void);
005A4A25 |. 8D45 D0 lea eax,[local.12]
005A4A28 |. BA 04000000 mov edx,4
005A4A2D >|. E8 BAFFE5FF call NetUSB_e.004049EC ; ->System.@LStrArrayClr(void;void;Integer);
005A4A32 |. 8D45 E4 lea eax,[local.7]
005A4A35 |. BA 02000000 mov edx,2
005A4A3A >|. E8 ADFFE5FF call NetUSB_e.004049EC ; ->System.@LStrArrayClr(void;void;Integer);
005A4A3F |. 8D45 EC lea eax,[local.5]
005A4A42 >|. E8 81FFE5FF call NetUSB_e.004049C8 ; ->System.@LStrClr(void;void);
005A4A47 |. 8D45 F0 lea eax,[local.4]
005A4A4A |. BA 02000000 mov edx,2
005A4A4F >|. E8 98FFE5FF call NetUSB_e.004049EC ; ->System.@LStrArrayClr(void;void;Integer);
005A4A54 \. C3 retn
在005A4950处将 注册信息: “网络**|随机数|用户名|HDSerialNumber|机器码|” 加密,跟进call NetUSB_e.00598698看看:
call NetUSB_e.00598698
-------------------------------------------------------------------------------------------------------------
00598698 /$ 55 push ebp
00598699 |. 8BEC mov ebp,esp
0059869B |. 83C4 F8 add esp,-8
0059869E |. 53 push ebx
0059869F |. 33C9 xor ecx,ecx
005986A1 |. 894D F8 mov [local.2],ecx
005986A4 |. 8BDA mov ebx,edx
005986A6 |. 8945 FC mov [local.1],eax
005986A9 |. 8B45 FC mov eax,[local.1]
005986AC |. E8 C7C7E6FF call NetUSB_e.00404E78
005986B1 |. 33C0 xor eax,eax
005986B3 |. 55 push ebp
005986B4 |. 68 EF865900 push NetUSB_e.005986EF
005986B9 |. 64:FF30 push dword ptr fs:[eax]
005986BC |. 64:8920 mov dword ptr fs:[eax],esp
005986BF |. 8D55 F8 lea edx,[local.2]
005986C2 |. 8B45 FC mov eax,[local.1]
005986C5 |. E8 E6FCFFFF call NetUSB_e.005983B0 ; Base64EncodeStr()
005986CA |. 8B45 F8 mov eax,[local.2]
005986CD |. 8BD3 mov edx,ebx
005986CF |. E8 2CF3FFFF call NetUSB_e.00597A00 ; EncodeStr()
005986D4 |. 33C0 xor eax,eax
005986D6 |. 5A pop edx
005986D7 |. 59 pop ecx
005986D8 |. 59 pop ecx
005986D9 |. 64:8910 mov dword ptr fs:[eax],edx
005986DC |. 68 F6865900 push NetUSB_e.005986F6
005986E1 |> 8D45 F8 lea eax,[local.2]
005986E4 |. BA 02000000 mov edx,2
005986E9 |. E8 FEC2E6FF call NetUSB_e.004049EC
005986EE \. C3 retn
-------------------------------------------------------------------------------------------------------------
005986C5处是标准的Base64EncodeStr(),005986CF处EncodeStr()实际上就是DecodeStr(注册码)=SN1中DecodeStr的反函数,为了加深对
DecodeStr的理解,看看自己高级语言写的DecodeStr()函数是否正确,还是调试一下吧Base64EncodeStr()函数网上N多。
call NetUSB_e.00597A00
-------------------------------------------------------------------------------------------------------------
00597A00 /$ 55 push ebp ; EncodeStr()
00597A01 |. 8BEC mov ebp,esp
00597A03 |. B9 05000000 mov ecx,5
00597A08 |> 6A 00 /push 0
00597A0A |. 6A 00 |push 0
00597A0C |. 49 |dec ecx
00597A0D |.^ 75 F9 \jnz short NetUSB_e.00597A08
00597A0F |. 51 push ecx
00597A10 |. 53 push ebx
00597A11 |. 56 push esi
00597A12 |. 57 push edi
00597A13 |. 8955 F8 mov [local.2],edx
00597A16 |. 8945 FC mov [local.1],eax
00597A19 |. 8B45 FC mov eax,[local.1]
00597A1C |. E8 57D4E6FF call NetUSB_e.00404E78
00597A21 |. 33C0 xor eax,eax
00597A23 |. 55 push ebp
00597A24 |. 68 8F7B5900 push NetUSB_e.00597B8F
00597A29 |. 64:FF30 push dword ptr fs:[eax]
00597A2C |. 64:8920 mov dword ptr fs:[eax],esp
00597A2F |. 8B45 F8 mov eax,[local.2]
00597A32 |. E8 91CFE6FF call NetUSB_e.004049C8
00597A37 |. 8D45 E8 lea eax,[local.6]
00597A3A |. E8 89CFE6FF call NetUSB_e.004049C8
00597A3F |. 33C0 xor eax,eax
00597A41 |. 8945 F0 mov [local.4],eax
00597A44 |. C645 EF 00 mov byte ptr ss:[ebp-11],0
00597A48 |. 33FF xor edi,edi
00597A4A |. 33F6 xor esi,esi
00597A4C |. 8B45 FC mov eax,[local.1]
00597A4F |. E8 3CD2E6FF call NetUSB_e.00404C90
00597A54 |. 8945 F4 mov [local.3],eax
00597A57 |. 3B75 F4 cmp esi,[local.3]
00597A5A |. 0F8D D4000000 jge NetUSB_e.00597B34
00597A60 |> 817D F0 10270000 /cmp [local.4],2710
00597A67 |. 0F8D C7000000 |jge NetUSB_e.00597B34
00597A6D |. 8B45 FC |mov eax,[local.1]
00597A70 |. 0FB60430 |movzx eax,byte ptr ds:[eax+esi]
00597A74 |. 8D4F 02 |lea ecx,dword ptr ds:[edi+2]
00597A77 |. D3E8 |shr eax,cl
00597A79 |. 8BD8 |mov ebx,eax
00597A7B |. 0A5D EF |or bl,byte ptr ss:[ebp-11]
00597A7E |. 80E3 3F |and bl,3F
00597A81 |. 8B45 FC |mov eax,[local.1]
00597A84 |. 0FB60430 |movzx eax,byte ptr ds:[eax+esi]
00597A88 |. 8D57 02 |lea edx,dword ptr ds:[edi+2]
00597A8B |. B9 08000000 |mov ecx,8
00597A90 |. 2BCA |sub ecx,edx
00597A92 |. D3E0 |shl eax,cl
00597A94 |. C1E8 02 |shr eax,2
00597A97 |. 24 3F |and al,3F
00597A99 |. 8845 EF |mov byte ptr ss:[ebp-11],al
00597A9C |. 83C7 02 |add edi,2
00597A9F |. 83FF 06 |cmp edi,6
00597AA2 |. 7C 69 |jl short NetUSB_e.00597B0D
00597AA4 |. 817D F0 0F270000 |cmp [local.4],270F
00597AAB |. 7C 1F |jl short NetUSB_e.00597ACC
00597AAD |. 8D45 E4 |lea eax,[local.7]
00597AB0 |. 33D2 |xor edx,edx
00597AB2 |. 8AD3 |mov dl,bl
00597AB4 |. 83C2 3C |add edx,3C
00597AB7 |. E8 ECD0E6FF |call NetUSB_e.00404BA8
00597ABC |. 8B55 E4 |mov edx,[local.7]
00597ABF |. 8D45 E8 |lea eax,[local.6]
00597AC2 |. E8 D1D1E6FF |call NetUSB_e.00404C98
00597AC7 |. FF45 F0 |inc [local.4]
00597ACA |. EB 39 |jmp short NetUSB_e.00597B05
00597ACC |> 8D45 E0 |lea eax,[local.8]
00597ACF |. 33D2 |xor edx,edx
00597AD1 |. 8AD3 |mov dl,bl
00597AD3 |. 83C2 3C |add edx,3C
00597AD6 |. E8 CDD0E6FF |call NetUSB_e.00404BA8
00597ADB |. 8B55 E0 |mov edx,[local.8]
00597ADE |. 8D45 E8 |lea eax,[local.6]
00597AE1 |. E8 B2D1E6FF |call NetUSB_e.00404C98
00597AE6 |. 8D45 DC |lea eax,[local.9]
00597AE9 |. 33D2 |xor edx,edx
00597AEB |. 8A55 EF |mov dl,byte ptr ss:[ebp-11]
00597AEE |. 83C2 3C |add edx,3C
00597AF1 |. E8 B2D0E6FF |call NetUSB_e.00404BA8
00597AF6 |. 8B55 DC |mov edx,[local.9]
00597AF9 |. 8D45 E8 |lea eax,[local.6]
00597AFC |. E8 97D1E6FF |call NetUSB_e.00404C98
00597B01 |. 8345 F0 02 |add [local.4],2
00597B05 |> 33FF |xor edi,edi
00597B07 |. C645 EF 00 |mov byte ptr ss:[ebp-11],0
00597B0B |. EB 1D |jmp short NetUSB_e.00597B2A
00597B0D |> 8D45 D8 |lea eax,[local.10]
00597B10 |. 33D2 |xor edx,edx
00597B12 |. 8AD3 |mov dl,bl
00597B14 |. 83C2 3C |add edx,3C
00597B17 |. E8 8CD0E6FF |call NetUSB_e.00404BA8
00597B1C |. 8B55 D8 |mov edx,[local.10]
00597B1F |. 8D45 E8 |lea eax,[local.6]
00597B22 |. E8 71D1E6FF |call NetUSB_e.00404C98
00597B27 |. FF45 F0 |inc [local.4]
00597B2A |> 46 |inc esi
00597B2B |. 3B75 F4 |cmp esi,[local.3]
00597B2E |.^ 0F8C 2CFFFFFF \jl NetUSB_e.00597A60
00597B34 |> 85FF test edi,edi
00597B36 |. 7E 1E jle short NetUSB_e.00597B56
00597B38 |. 8D45 D4 lea eax,[local.11]
00597B3B |. 33D2 xor edx,edx
00597B3D |. 8A55 EF mov dl,byte ptr ss:[ebp-11]
00597B40 |. 83C2 3C add edx,3C
00597B43 |. E8 60D0E6FF call NetUSB_e.00404BA8
00597B48 |. 8B55 D4 mov edx,[local.11]
00597B4B |. 8D45 E8 lea eax,[local.6]
00597B4E |. E8 45D1E6FF call NetUSB_e.00404C98
00597B53 |. FF45 F0 inc [local.4]
00597B56 |> 8D45 E8 lea eax,[local.6]
00597B59 |. 8B55 F0 mov edx,[local.4]
00597B5C |. E8 B3D4E6FF call NetUSB_e.00405014
00597B61 |. 8B45 F8 mov eax,[local.2]
00597B64 |. 8B55 E8 mov edx,[local.6]
00597B67 |. E8 B0CEE6FF call NetUSB_e.00404A1C
00597B6C |. 33C0 xor eax,eax
00597B6E |. 5A pop edx
00597B6F |. 59 pop ecx
00597B70 |. 59 pop ecx
00597B71 |. 64:8910 mov dword ptr fs:[eax],edx
00597B74 |. 68 967B5900 push NetUSB_e.00597B96
00597B79 |> 8D45 D4 lea eax,[local.11]
00597B7C |. BA 06000000 mov edx,6
00597B81 |. E8 66CEE6FF call NetUSB_e.004049EC
00597B86 |. 8D45 FC lea eax,[local.1]
00597B89 |. E8 3ACEE6FF call NetUSB_e.004049C8
00597B8E \. C3 retn
00597B8F .^ E9 9CC7E6FF jmp NetUSB_e.00404330
00597B94 .^ EB E3 jmp short NetUSB_e.00597B79
00597B96 . 5F pop edi
00597B97 . 5E pop esi
00597B98 . 5B pop ebx
00597B99 . 8BE5 mov esp,ebp
00597B9B . 5D pop ebp
00597B9C . C3 retn
-------------------------------------------------------------------------------------------------------------
这样一来,我们可以先解密“注册信息” 得到----“网络**|随机数|用户名|HDSerialNumber|机器码|”
再参考前面所描述的,可以很方便的求的软件的注册码了。
注册机Delphi 7.0原代码(包括获取硬盘物理序列号、Base64、注册成功截图)附件:NetUSB 2.05.rar
【破解总结】:
因为本人不懂一些公开算法,调试算法花了很多时间 ,惭愧ing……,有以下几点我认为作者保护的比好:
1、软件的提示信息都经过加密,不能直接找到关键断点。
2、软件采用F1()=F2()的注册方式,不出现明码,内存注册机肯定是做不了了。
3、值得一提的是,软件的产品名称也参加注册计算,手工脱壳Import REConstructor修复等容易丢失这不份信息,导致注册机无效。 我机器上的注册信息:
硬盘物理序列号:CSH305DAJB16RB
HDSerialNumber:9252FF533905195C
注册码:M_<rHpHtH?]>JOA=LOY?IL
验证通过!累死我了…………,写这篇破文花了我N小时!各位看客看在我疲劳的份上………………顶一下^_^ (本文完)
[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)