SwiftDog PCThrust V1.4.25.2005 注册算法分析
日期:2005年4月26日 破解人:Baby2008
--------------------------------------------------------------------------------------------------------------
『软件名称』:SwiftDog PCThrust V1.4.25.2005
『软件大小』:850 KB
『下载地址』:http://www.skycn.com/soft/21448.html
『软件介绍』:
PCThrust 通过修改相关设置,提高计算机的性能和运行速度,对硬盘没有任何修改,界面友好,操作简单。
『保护方式』:注册码保护
『破解声明』:初学Crack,只是感兴趣,失误之处敬请诸位大侠赐教!
『破解工具』:OllyDbg.V1.10 聆风听雨汉化第二版、PeID 0.93
『破解过程』:
先用PeID 0.93查壳,PECompact 2.x -> Jeremy Collake。那就先脱了再说,OllyDbg忽略内存访问异常,载入主程序:
00401000 P> B8 94A05800 mov eax,PcThrust.0058A094
00401005 50 push eax
00401006 64:FF35 0000000>push dword ptr fs:[0]
0040100D 64:8925 0000000>mov dword ptr fs:[0],esp
00401014 33C0 xor eax,eax
00401016 8908 mov dword ptr ds:[eax],ecx
00401018 50 push eax
00401019 45 inc ebp
0040101A 43 inc ebx
0040101B 6F outs dx,dword ptr es:[edi]
0040101C 6D ins dword ptr es:[edi],dx
0040101D 70 61 jo short PcThrust.00401080
0040101F 637432 00 arpl word ptr ds:[edx+esi],si
00401023 CE into
00401024 1E push ds
00401025 42 inc edx
00401026 AF scas dword ptr es:[edi]
00401027 F8 clc
00401028 D6 salc
00401029 CC int3
0040102A - E9 FBC84F1B jmp 1B8FD92A
下中断 bp VirtualAlloc,F9运行,OD中断在:
7C809A81 k> 8BFF mov edi,edi ; ntdll.7C930738
7C809A83 55 push ebp
7C809A84 8BEC mov ebp,esp
7C809A86 FF75 14 push dword ptr ss:[ebp+14]
7C809A89 FF75 10 push dword ptr ss:[ebp+10]
7C809A8C FF75 0C push dword ptr ss:[ebp+C]
7C809A8F FF75 08 push dword ptr ss:[ebp+8]
7C809A92 6A FF push -1
7C809A94 E8 09000000 call kernel32.VirtualAllocEx
7C809A99 5D pop ebp
7C809A9A C2 1000 retn 10
在次F9运行,再次中断在7C809A81,取消断点,Alt+F9返回
003F0C1B 8985 421B0010 mov dword ptr ss:[ebp+10001B42],eax 返回这里
003F0C21 56 push esi
003F0C22 E8 89030000 call 003F0FB0
003F0C27 85C0 test eax,eax
003F0C29 0F85 A6000000 jnz 003F0CD5
003F0C2F 56 push esi
003F0C30 E8 D7020000 call 003F0F0C
003F0C35 56 push esi
003F0C36 E8 DF010000 call 003F0E1A
003F0C3B 90 nop
003F0C3C 90 nop
003F0C3D 90 nop
003F0C3E 90 nop
003F0C3F 90 nop
003F0C40 90 nop
003F0C41 90 nop
003F0C42 90 nop
003F0C43 90 nop
003F0C44 90 nop
003F0C45 90 nop
003F0C46 90 nop
003F0C47 90 nop
003F0C48 90 nop
003F0C49 8B4E 34 mov ecx,dword ptr ds:[esi+34]
003F0C4C 85C9 test ecx,ecx //选择此行
003F0C4E 0F84 89000000 je 003F0CDD //强制跳过
003F0C54 034E 08 add ecx,dword ptr ds:[esi+8]
003F0C57 51 push ecx
003F0C58 56 push esi
选择003F0C4C,F4运行到003F0C4C,此时寄存器状态如下:
EAX 00000000
ECX 00093000
EDX 00400000 ASCII "MZP"
EBX 003F0A54
ESP 0012FF90
EBP F03EF945
ESI 003F0A54
EDI 003F147F
EIP 003F0C4C
ecx=00093000保存原始Import,把它改成0,让003F0C4E处强制跳过。 bp VirtualFree,F9运行,中断两次取消断点以后,ALT+F9返回
0058A157 8BC6 mov eax,esi ; PcThrust.0048D598
0058A159 5A pop edx
0058A15A 5E pop esi
0058A15B 5F pop edi
0058A15C 59 pop ecx
0058A15D 5B pop ebx
0058A15E 5D pop ebp
0058A15F FFE0 jmp eax //Magic Jmp 0048D598 55 push ebp //跳到这里
0048D599 8BEC mov ebp,esp
0048D59B B9 36000000 mov ecx,36
0048D5A0 6A 00 push 0
0048D5A2 6A 00 push 0
0048D5A4 49 dec ecx
0048D5A5 ^ 75 F9 jnz short PcThrust.0048D5A0
0048D5A7 51 push ecx
0048D5A8 53 push ebx
0048D5A9 56 push esi
0048D5AA 57 push edi
0048D5AB B8 B8D14800 mov eax,PcThrust.0048D1B8
在0048D598处完全dump下来,另存为UnPacked.exe,用LoadPE修正UnPacked.exe输入表为00093000,脱壳完成。
再次PeID查壳,Borland Delphi 6.0 - 7.0 ^_^
OD载入UnPacked.exe,开始分析算法啦,F9运行,输入注册信息Name=Baby008 Serial=135792468012345,切换到OD窗口,在004868BC处下断(注册按钮事件地址,可以用DeDe分析获得),点击OK,OD中断在:
004868BC <> . 55 push ebp ; <-TForm3@Button1Click
004868BD . 8BEC mov ebp,esp
004868BF . B9 04000000 mov ecx,4
004868C4 > 6A 00 push 0
004868C6 . 6A 00 push 0
004868C8 . 49 dec ecx
004868C9 .^ 75 F9 jnz short UnPacked.004868C4
004868CB . 51 push ecx
004868CC . 53 push ebx
004868CD . 56 push esi
004868CE . 57 push edi
004868CF . 8BD8 mov ebx,eax
004868D1 . 33C0 xor eax,eax
004868D3 . 55 push ebp
004868D4 . 68 E16A4800 push <UnPacked.->System.@HandleFinall>
004868D9 . 64:FF30 push dword ptr fs:[eax]
004868DC . 64:8920 mov dword ptr fs:[eax],esp
004868DF . 8D55 FC lea edx,dword ptr ss:[ebp-4]
004868E2 <> . 8B83 38030000 mov eax,dword ptr ds:[ebx+338]
004868E8 <> . E8 C712FDFF call UnPacked.00457BB4
004868ED . 837D FC 00 cmp dword ptr ss:[ebp-4],0 ; 用户名,记为Name
004868F1 . 0F84 98010000 je UnPacked.00486A8F
004868F7 . 8D55 F8 lea edx,dword ptr ss:[ebp-8]
004868FA <> . 8B83 34030000 mov eax,dword ptr ds:[ebx+334]
00486900 <> . E8 AF12FDFF call UnPacked.00457BB4
00486905 . 837D F8 00 cmp dword ptr ss:[ebp-8],0 ; 序列号,记为SerialNo
00486909 . 0F84 80010000 je UnPacked.00486A8F
0048690F . 8D55 F0 lea edx,dword ptr ss:[ebp-10]
00486912 <> . 8B83 34030000 mov eax,dword ptr ds:[ebx+334]
00486918 <> . E8 9712FDFF call UnPacked.00457BB4
0048691D . 8B45 F0 mov eax,dword ptr ss:[ebp-10] ; SerialNo
00486920 . 8D55 F4 lea edx,dword ptr ss:[ebp-C]
00486923 <> . E8 FC17F8FF call UnPacked.00408124 ; Trim()函数
00486928 . 8B45 F4 mov eax,dword ptr ss:[ebp-C] ; Trim(SerialNo)
0048692B . 50 push eax
0048692C . 8D55 E8 lea edx,dword ptr ss:[ebp-18]
0048692F <> . 8B83 38030000 mov eax,dword ptr ds:[ebx+338]
00486935 <> . E8 7A12FDFF call UnPacked.00457BB4
0048693A . 8B45 E8 mov eax,dword ptr ss:[ebp-18] ; Name
0048693D . 8D55 EC lea edx,dword ptr ss:[ebp-14]
00486940 <> . E8 DF17F8FF call UnPacked.00408124 ; Trim()函数
00486945 . 8B45 EC mov eax,dword ptr ss:[ebp-14] ; Trim(Name)
00486948 . 5A pop edx
00486949 <> . E8 662D0000 call UnPacked.004896B4 ; 注册验证关键,跟进
0048694E . 3C 01 cmp al,1
00486950 0F85 03010000 jnz UnPacked.00486A59 ; 注册验证爆破 跟进00486949 call UnPacked.004896B4:
--------------------------------------------------------------------------------------------------------------
004896B4 $ 55 push ebp
004896B5 . 8BEC mov ebp,esp
004896B7 . B9 0C000000 mov ecx,0C
004896BC > 6A 00 push 0
004896BE . 6A 00 push 0
004896C0 . 49 dec ecx
004896C1 .^ 75 F9 jnz short UnPacked.004896BC
004896C3 . 51 push ecx
004896C4 . 53 push ebx
004896C5 . 56 push esi
004896C6 . 57 push edi
004896C7 . 8955 F8 mov dword ptr ss:[ebp-8],edx ; SerialNo
004896CA . 8945 FC mov dword ptr ss:[ebp-4],eax ; Name
004896CD . 8B45 FC mov eax,dword ptr ss:[ebp-4]
004896D0 . E8 3BAEF7FF call UnPacked.00404510
004896D5 . 8B45 F8 mov eax,dword ptr ss:[ebp-8]
004896D8 . E8 33AEF7FF call UnPacked.00404510
004896DD . 33C0 xor eax,eax
004896DF . 55 push ebp
004896E0 . 68 589B4800 push UnPacked.00489B58
004896E5 . 64:FF30 push dword ptr fs:[eax]
004896E8 . 64:8920 mov dword ptr fs:[eax],esp
004896EB . 33C0 xor eax,eax
004896ED . 55 push ebp
004896EE . 68 0C9B4800 push UnPacked.00489B0C
004896F3 . 64:FF30 push dword ptr fs:[eax]
004896F6 . 64:8920 mov dword ptr fs:[eax],esp
004896F9 . 837D FC 00 cmp dword ptr ss:[ebp-4],0 ; Name,用户名不能为空
004896FD . 74 73 je short UnPacked.00489772
004896FF . 837D F8 00 cmp dword ptr ss:[ebp-8],0 ; SerialNo,序列号不能为空
00489703 . 74 6D je short UnPacked.00489772
注册信息不为空时在注册表\Software\SWIFTDOG\PcThrust中保存注册信息
00489705 . 33C0 xor eax,eax
00489707 . 55 push ebp
00489708 . 68 66974800 push UnPacked.00489766
0048970D . 64:FF30 push dword ptr fs:[eax]
00489710 . 64:8920 mov dword ptr fs:[eax],esp
00489713 . B2 01 mov dl,1
00489715 . A1 B01A4200 mov eax,dword ptr ds:[421AB0]
0048971A . E8 9184F9FF call UnPacked.00421BB0
0048971F . 8BD8 mov ebx,eax
00489721 . BA 02000080 mov edx,80000002
00489726 . 8BC3 mov eax,ebx
00489728 . E8 2385F9FF call UnPacked.00421C50 ; 开始在注册表中保存注册信息
0048972D . B1 01 mov cl,1
0048972F . BA 749B4800 mov edx,UnPacked.00489B74 ; ASCII "\Software\SWIFTDOG\PcThrust"
00489734 . 8BC3 mov eax,ebx
00489736 . E8 7985F9FF call UnPacked.00421CB4
0048973B . 8B4D FC mov ecx,dword ptr ss:[ebp-4] ; Name
0048973E . BA 989B4800 mov edx,UnPacked.00489B98 ; ASCII "Name"
00489743 . 8BC3 mov eax,ebx
00489745 . E8 2687F9FF call UnPacked.00421E70
0048974A . 8B4D F8 mov ecx,dword ptr ss:[ebp-8] ; SerialNo
0048974D . BA A89B4800 mov edx,UnPacked.00489BA8 ; ASCII "Serial"
00489752 . 8BC3 mov eax,ebx
00489754 . E8 1787F9FF call UnPacked.00421E70
00489759 . 33C0 xor eax,eax
0048975B . 5A pop edx
0048975C . 59 pop ecx
0048975D . 59 pop ecx
0048975E . 64:8910 mov dword ptr fs:[eax],edx
00489761 . E9 89000000 jmp UnPacked.004897EF
00489766 .^ E9 C19FF7FF jmp UnPacked.0040372C
0048976B . E8 24A3F7FF call UnPacked.00403A94
00489770 . EB 7D jmp short UnPacked.004897EF
00489772 > 33C0 xor eax,eax
00489774 . 55 push ebp
00489775 . 68 E5974800 push UnPacked.004897E5
0048977A . 64:FF30 push dword ptr fs:[eax]
0048977D . 64:8920 mov dword ptr fs:[eax],esp
00489780 . B2 01 mov dl,1
00489782 . A1 B01A4200 mov eax,dword ptr ds:[421AB0]
00489787 . E8 2484F9FF call UnPacked.00421BB0
0048978C . 8BD8 mov ebx,eax
0048978E . BA 02000080 mov edx,80000002
00489793 . 8BC3 mov eax,ebx
00489795 . E8 B684F9FF call UnPacked.00421C50
0048979A . C743 18 19000>mov dword ptr ds:[ebx+18],20019
注册信息为空时清空注册信息
004897A1 . 33C9 xor ecx,ecx
004897A3 . BA 749B4800 mov edx,UnPacked.00489B74 ; ASCII "\Software\SWIFTDOG\PcThrust"
004897A8 . 8BC3 mov eax,ebx
004897AA . E8 0585F9FF call UnPacked.00421CB4
004897AF . 8D4D FC lea ecx,dword ptr ss:[ebp-4]
004897B2 . BA 989B4800 mov edx,UnPacked.00489B98 ; ASCII "Name"
004897B7 . 8BC3 mov eax,ebx
004897B9 . E8 DE86F9FF call UnPacked.00421E9C
004897BE . 8D4D F8 lea ecx,dword ptr ss:[ebp-8]
004897C1 . BA A89B4800 mov edx,UnPacked.00489BA8 ; ASCII "Serial"
004897C6 . 8BC3 mov eax,ebx
004897C8 . E8 CF86F9FF call UnPacked.00421E9C
004897CD . 8BC3 mov eax,ebx
004897CF . E8 4C84F9FF call UnPacked.00421C20
004897D4 . 8BC3 mov eax,ebx
004897D6 . E8 B19AF7FF call UnPacked.0040328C
004897DB . 33C0 xor eax,eax
004897DD . 5A pop edx
004897DE . 59 pop ecx
004897DF . 59 pop ecx
004897E0 . 64:8910 mov dword ptr fs:[eax],edx
004897E3 . EB 0A jmp short UnPacked.004897EF
004897E5 .^ E9 429FF7FF jmp UnPacked.0040372C
004897EA . E8 A5A2F7FF call UnPacked.00403A94
开始验证啦
004897EF > 33C0 xor eax,eax
004897F1 . 55 push ebp
004897F2 . 68 F49A4800 push UnPacked.00489AF4
004897F7 . 64:FF30 push dword ptr fs:[eax]
004897FA . 64:8920 mov dword ptr fs:[eax],esp
004897FD . 837D FC 00 cmp dword ptr ss:[ebp-4],0 ; Name
00489801 . 0F84 E3020000 je UnPacked.00489AEA
00489807 . 837D F8 00 cmp dword ptr ss:[ebp-8],0 ; SerialNo
0048980B . 0F84 D9020000 je UnPacked.00489AEA
00489811 . B8 781F4900 mov eax,UnPacked.00491F78
00489816 . 8B55 FC mov edx,dword ptr ss:[ebp-4]
00489819 . E8 96A8F7FF call UnPacked.004040B4
0048981E . 68 7C1F4900 push UnPacked.00491F7C
00489823 . 8D45 E4 lea eax,dword ptr ss:[ebp-1C]
00489826 . 50 push eax
00489827 . 8B55 F8 mov edx,dword ptr ss:[ebp-8] ; SerialNo
0048982A . B8 B89B4800 mov eax,UnPacked.00489BB8 ; '+'
0048982F . E8 30AEF7FF call UnPacked.00404664 ; System.@LStrPos;
00489834 . 40 inc eax ; 分隔字符在序列号中的位置+1
00489835 . 50 push eax ; 入栈
00489836 . 8B45 F8 mov eax,dword ptr ss:[ebp-8] ; SerialNo
00489839 . E8 E2AAF7FF call UnPacked.00404320 ; System.@LStrLen(String):Integer;
0048983E . 8BC8 mov ecx,eax ; 注册码长度
00489840 . 8B45 F8 mov eax,dword ptr ss:[ebp-8] ; SerialNo
00489843 . 5A pop edx ; 出栈
00489844 . E8 37ADF7FF call UnPacked.00404580 ; System.@LStrCopy;
00489849 . 8B55 E4 mov edx,dword ptr ss:[ebp-1C] ; 取得第一个分隔字符后的序列号
0048984C . B8 B89B4800 mov eax,UnPacked.00489BB8 ; '+'
00489851 . E8 0EAEF7FF call UnPacked.00404664 ; System.@LStrPos;
00489856 . 48 dec eax ; 第2个分隔字符在序列号中的位置-1
00489857 . 50 push eax ; 入栈
00489858 . 8D45 E0 lea eax,dword ptr ss:[ebp-20]
0048985B . 50 push eax
0048985C . 8B55 F8 mov edx,dword ptr ss:[ebp-8] ; SerialNo
0048985F . B8 B89B4800 mov eax,UnPacked.00489BB8 ; '+'
00489864 . E8 FBADF7FF call UnPacked.00404664 ; System.@LStrPos;
00489869 . 40 inc eax
0048986A . 50 push eax
0048986B . 8B45 F8 mov eax,dword ptr ss:[ebp-8] ; SerialNo
0048986E . E8 ADAAF7FF call UnPacked.00404320 ; System.@LStrLen(String):Integer;
00489873 . 8BC8 mov ecx,eax
00489875 . 8B45 F8 mov eax,dword ptr ss:[ebp-8] ; SerialNo
00489878 . 5A pop edx
00489879 . E8 02ADF7FF call UnPacked.00404580 ; System.@LStrCopy;
0048987E . 8B45 E0 mov eax,dword ptr ss:[ebp-20]
00489881 . BA 01000000 mov edx,1
00489886 . 59 pop ecx
00489887 . E8 F4ACF7FF call UnPacked.00404580 ; System.@LStrCopy;
0048988C . BB 01000000 mov ebx,1
00489891 > 8D45 D8 lea eax,dword ptr ss:[ebp-28]
00489894 . 50 push eax
00489895 . B9 01000000 mov ecx,1
0048989A . 8BD3 mov edx,ebx
0048989C . 8B45 FC mov eax,dword ptr ss:[ebp-4] ; 用户名
0048989F . E8 DCACF7FF call UnPacked.00404580 ; System.@LStrCopy;
004898A4 . 8B45 D8 mov eax,dword ptr ss:[ebp-28] ; Name[i]=Copy(Name,i,1)
004898A7 . 0FB600 movzx eax,byte ptr ds:[eax] ; Name[i]
004898AA . F7EB imul ebx ; i
004898AC . 8945 D4 mov dword ptr ss:[ebp-2C],eax ; Eax=Name[i]*i
004898AF . DB45 D4 fild dword ptr ss:[ebp-2C] ; 装入到st(0)
004898B2 . E8 DD91F7FF call UnPacked.00402A94 ; System.@ROUND;
004898B7 . 8945 CC mov dword ptr ss:[ebp-34],eax ; Round(Name[i])
004898BA . 8955 D0 mov dword ptr ss:[ebp-30],edx
004898BD . DF6D CC fild qword ptr ss:[ebp-34] ; 装入到st(0)
004898C0 . 83C4 F4 add esp,-0C
004898C3 . DB3C24 fstp tbyte ptr ss:[esp] ; |dest <- st(0)
004898C6 . 9B wait ; |
004898C7 . 8D55 DC lea edx,dword ptr ss:[ebp-24] ; |
004898CA . B8 C49B4800 mov eax,UnPacked.00489BC4 ; |
004898CF . E8 9804F8FF call UnPacked.00409D6C ; \SysUtils.FormatFloat(AnsiString;Extended):AnsiString;overload;
004898D4 . FF75 DC push dword ptr ss:[ebp-24] ; FormatFloat(Round(Name[i]))
004898D7 . 8D55 C8 lea edx,dword ptr ss:[ebp-38]
004898DA . 8BC3 mov eax,ebx ; i
004898DC . E8 13ECF7FF call UnPacked.004084F4 ; SysUtils.IntToStr(Integer):AnsiString;overload;
004898E1 . FF75 C8 push dword ptr ss:[ebp-38] ; IntStr(i)
004898E4 . FF35 7C1F4900 push dword ptr ds:[491F7C] ; 序列号第二段
004898EA . 8D45 EC lea eax,dword ptr ss:[ebp-14]
004898ED . BA 03000000 mov edx,3
004898F2 . E8 E9AAF7FF call UnPacked.004043E0 ; System.@LStrCatN;
004898F7 . 8B45 EC mov eax,dword ptr ss:[ebp-14] ; FormatFloat(Round(Name[i]))+IntToStr(i)+注册码第2段,记为Temp
004898FA . E8 31EDF7FF call UnPacked.00408630 ; SysUtils.StrToInt(AnsiString):Integer;
004898FF . 8BF0 mov esi,eax ; EAX=StrToInt(Temp)
00489901 . 8B45 EC mov eax,dword ptr ss:[ebp-14]
00489904 . E8 27EDF7FF call UnPacked.00408630 ; SysUtils.StrToInt(AnsiString):Integer;
00489909 . 03F0 add esi,eax ; ESI=EAX+EAX
0048990B . 8BC6 mov eax,esi
0048990D . 8D55 C4 lea edx,dword ptr ss:[ebp-3C]
00489910 . E8 DFEBF7FF call UnPacked.004084F4 ; SysUtils.IntToStr(Integer):AnsiString;overload;
00489915 . 8B55 C4 mov edx,dword ptr ss:[ebp-3C] ; IntToStr(Temp*2)
00489918 . 8D45 EC lea eax,dword ptr ss:[ebp-14]
0048991B . E8 D8A7F7FF call UnPacked.004040F8
00489920 . 43 inc ebx ; i=i+1
00489921 . 8B45 FC mov eax,dword ptr ss:[ebp-4] ; Name
00489924 . E8 F7A9F7FF call UnPacked.00404320 ; System.@LStrLen(String):Integer;
00489929 . 40 inc eax ; Length(Name)+1
0048992A . 3BD8 cmp ebx,eax ; i
0048992C .^ 0F85 5FFFFFFF jnz UnPacked.00489891 ; 用户名长度循环
00489932 . 6A 16 push 16
00489934 . 68 99BD5116 push 1651BD99
00489939 . 8B45 EC mov eax,dword ptr ss:[ebp-14] ; 用户名与序列号第2段计算结果,实际上是(IntToStr(Name[Length]*Length)+IntToStr(Length)+'序列号第2段')*2 0048993C . E8 EFECF7FF call UnPacked.00408630 ; SysUtils.StrToInt(AnsiString):Integer;
00489941 . 99 cdq
00489942 . E8 15B6F7FF call UnPacked.00404F5C ; System.@_llmul; 64位乘法运算
00489947 . 8945 CC mov dword ptr ss:[ebp-34],eax ; StrToInt(计算结果)*161651BD99
0048994A . 8955 D0 mov dword ptr ss:[ebp-30],edx ; EDX保存高32位,EAX保存低32位
0048994D . DF6D CC fild qword ptr ss:[ebp-34]
00489950 . 83C4 F4 add esp,-0C
00489953 . DB3C24 fstp tbyte ptr ss:[esp] ; |
00489956 . 9B wait ; |
00489957 . 8D55 C0 lea edx,dword ptr ss:[ebp-40] ; |
0048995A . B8 C49B4800 mov eax,UnPacked.00489BC4 ; |'#'
0048995F . E8 0804F8FF call UnPacked.00409D6C ; \SysUtils.FormatFloat(AnsiString;Extended):AnsiString;overload;
00489964 . 8B55 C0 mov edx,dword ptr ss:[ebp-40] ; 指数表示
00489967 . 8D45 EC lea eax,dword ptr ss:[ebp-14]
0048996A . E8 89A7F7FF call UnPacked.004040F8 ; System.@LStrLAsg(void;void;void;void);
0048996F . 8D45 F0 lea eax,dword ptr ss:[ebp-10]
00489972 . 50 push eax
00489973 . 8B55 F8 mov edx,dword ptr ss:[ebp-8] ; 序列号
00489976 . B8 B89B4800 mov eax,UnPacked.00489BB8 ; '+'
0048997B . E8 E4ACF7FF call UnPacked.00404664 ; System.@LStrPos;
00489980 . 8BC8 mov ecx,eax ; '+'在序列号中的位置
00489982 . 49 dec ecx ; 位置-1
00489983 . BA 01000000 mov edx,1
00489988 . 8B45 F8 mov eax,dword ptr ss:[ebp-8] ; 序列号
0048998B . E8 F0ABF7FF call UnPacked.00404580 ; System.@LStrCopy;
00489990 . 8B45 F0 mov eax,dword ptr ss:[ebp-10] ; 取得序列号第1段
00489993 . E8 2C04F8FF call UnPacked.00409DC4 ; SysUtils.StrToFloat(AnsiString):Extended;overload;
00489998 . DB7D B4 fstp tbyte ptr ss:[ebp-4C]
0048999B . 9B wait
0048999C . 8B45 EC mov eax,dword ptr ss:[ebp-14] ; 用户名与序列号第2段计算结果
0048999F . E8 2004F8FF call UnPacked.00409DC4 ; SysUtils.StrToFloat(AnsiString):Extended;overload;
004899A4 . DB6D B4 fld tbyte ptr ss:[ebp-4C] ; 装入实数到st(0),StrToFloat(序列号第1段)
004899A7 . DEE1 fsubrp st(1),st ; st(0) <- st(i) - st(0)
004899A9 . D81D C89B4800 fcomp dword ptr ds:[489BC8] ; 将st(0)和4000.000比较
004899AF . DFE0 fstsw ax ; 保存状态字的值到AX
004899B1 . 9E sahf
004899B2 0F87 2E010000 ja UnPacked.00489AE6 ; St(0)>4000跳转
004899B8 . 8B45 EC mov eax,dword ptr ss:[ebp-14] ; 序列号第2段计算结果
004899BB . E8 0404F8FF call UnPacked.00409DC4 ; SysUtils.StrToFloat(AnsiString):Extended;overload;
004899C0 . DB7D A8 fstp tbyte ptr ss:[ebp-58] ; 转为浮点数
004899C3 . 9B wait
004899C4 . 8B45 F0 mov eax,dword ptr ss:[ebp-10] ; 序列号第1段
004899C7 . E8 F803F8FF call UnPacked.00409DC4 ; SysUtils.StrToFloat(AnsiString):Extended;overload;
004899CC . DB6D A8 fld tbyte ptr ss:[ebp-58]
004899CF . DEE1 fsubrp st(1),st
004899D1 . D81D C89B4800 fcomp dword ptr ds:[489BC8] ; 4000.000
004899D7 . DFE0 fstsw ax
004899D9 . 9E sahf
004899DA 0F87 06010000 ja UnPacked.00489AE6
004899E0 . C605 741F4900>mov byte ptr ds:[491F74],1 ;满足条件 置注册成功标准
004899E7 . C645 F7 01 mov byte ptr ss:[ebp-9],1
004899EB . 33C0 xor eax,eax
004899ED . 55 push ebp
004899EE . 68 5A9A4800 push UnPacked.00489A5A
004899F3 . 64:FF30 push dword ptr fs:[eax]
004899F6 . 64:8920 mov dword ptr fs:[eax],esp
004899F9 . 8D45 E8 lea eax,dword ptr ss:[ebp-18]
004899FC . 8B55 F8 mov edx,dword ptr ss:[ebp-8]
004899FF . E8 F4A6F7FF call UnPacked.004040F8 ; System.@LStrLAsg(void;void;void;void);
00489A04 . 8D45 E8 lea eax,dword ptr ss:[ebp-18]
00489A07 . 50 push eax
00489A08 . 8B55 E8 mov edx,dword ptr ss:[ebp-18] ; 序列号
00489A0B . B8 B89B4800 mov eax,UnPacked.00489BB8 ; '+'
00489A10 . E8 4FACF7FF call UnPacked.00404664 ; System.@LStrPos;
00489A15 . 40 inc eax ; '+'在序列号中得位置
00489A16 . 50 push eax
00489A17 . 8B45 E8 mov eax,dword ptr ss:[ebp-18] ; 序列号
00489A1A . E8 01A9F7FF call UnPacked.00404320 ; System.@LStrLen(String):Integer;
00489A1F . 8BC8 mov ecx,eax ; Length
00489A21 . 8B45 E8 mov eax,dword ptr ss:[ebp-18] ; 序列号
00489A24 . 5A pop edx
00489A25 . E8 56ABF7FF call UnPacked.00404580 ; System.@LStrCopy;
00489A2A . 8D45 E8 lea eax,dword ptr ss:[ebp-18] ; 取得序列号后两段
00489A2D . 50 push eax
00489A2E . 8B55 E8 mov edx,dword ptr ss:[ebp-18] ; 序列号后两段
00489A31 . B8 B89B4800 mov eax,UnPacked.00489BB8 ; '+'
00489A36 . E8 29ACF7FF call UnPacked.00404664 ; System.@LStrPos;
00489A3B . 40 inc eax ; 位置+1
00489A3C . 50 push eax
00489A3D . 8B45 E8 mov eax,dword ptr ss:[ebp-18] ; 序列号后两段
00489A40 . E8 DBA8F7FF call UnPacked.00404320 ; System.@LStrLen(String):Integer;
00489A45 . 8BC8 mov ecx,eax ; 序列号长度
00489A47 . 8B45 E8 mov eax,dword ptr ss:[ebp-18]
00489A4A . 5A pop edx
00489A4B . E8 30ABF7FF call UnPacked.00404580 ; System.@LStrCopy;取得序列号第3段
00489A50 . 33C0 xor eax,eax
00489A52 . 5A pop edx
00489A53 . 59 pop ecx
00489A54 . 59 pop ecx
00489A55 . 64:8910 mov dword ptr fs:[eax],edx
00489A58 . EB 0A jmp short UnPacked.00489A64
00489A5A .^ E9 CD9CF7FF jmp UnPacked.0040372C
00489A5F . E8 30A0F7FF call UnPacked.00403A94
00489A64 > 8B55 F8 mov edx,dword ptr ss:[ebp-8] ; 序列号
00489A67 . B8 B89B4800 mov eax,UnPacked.00489BB8 ; '+'
00489A6C . E8 F3ABF7FF call UnPacked.00404664 ; StrPos
00489A71 . 85C0 test eax,eax
00489A73 . 75 04 jnz short UnPacked.00489A79
00489A75 . C645 F7 00 mov byte ptr ss:[ebp-9],0 ; 注册成功标志位,置失败
00489A79 > B2 01 mov dl,1
00489A7B . A1 B42B4100 mov eax,dword ptr ds:[412BB4] ; 00412C00
00489A80 . E8 D797F7FF call UnPacked.0040325C
00489A85 . 8BF0 mov esi,eax
00489A87 . BA D49B4800 mov edx,UnPacked.00489BD4 ; ASCII "1164121"
00489A8C . 8BC6 mov eax,esi
00489A8E . 8B08 mov ecx,dword ptr ds:[eax]
00489A90 . FF51 38 call dword ptr ds:[ecx+38]
00489A93 . 33DB xor ebx,ebx
00489A95 > 8D55 A4 lea edx,dword ptr ss:[ebp-5C]
00489A98 . 8B45 E8 mov eax,dword ptr ss:[ebp-18] ; 注册码第3段
00489A9B . E8 34E4F7FF call UnPacked.00407ED4 ; SysUtils.UpperCase(AnsiString):AnsiString;
00489AA0 . 8B45 A4 mov eax,dword ptr ss:[ebp-5C] ; UpCase(注册码第3段)
00489AA3 . 50 push eax
00489AA4 . 8D4D 9C lea ecx,dword ptr ss:[ebp-64]
00489AA7 . 8BD3 mov edx,ebx
00489AA9 . 8BC6 mov eax,esi
00489AAB . 8B38 mov edi,dword ptr ds:[eax]
00489AAD . FF57 0C call dword ptr ds:[edi+C]
00489AB0 . 8B45 9C mov eax,dword ptr ss:[ebp-64] ; '1164121'
00489AB3 . 8D55 A0 lea edx,dword ptr ss:[ebp-60]
00489AB6 . E8 19E4F7FF call UnPacked.00407ED4 ; SysUtils.UpperCase(AnsiString):AnsiString;
00489ABB . 8B55 A0 mov edx,dword ptr ss:[ebp-60] ; '1164121'
00489ABE . 58 pop eax ; '序列号第3段'
00489ABF . E8 A8A9F7FF call UnPacked.0040446C ; System.@LStrCmp;
00489AC4 . 75 0B jnz short UnPacked.00489AD1 ;必须跳 要求序列号第3段<>'1164121'
00489AC6 . C605 741F4900>mov byte ptr ds:[491F74],0
00489ACD . C645 F7 00 mov byte ptr ss:[ebp-9],0
00489AD1 > 43 inc ebx
00489AD2 . 8BC6 mov eax,esi
00489AD4 . 8B10 mov edx,dword ptr ds:[eax]
00489AD6 . FF52 14 call dword ptr ds:[edx+14]
00489AD9 . 3BD8 cmp ebx,eax
00489ADB .^ 75 B8 jnz short UnPacked.00489A95
00489ADD . 8BC6 mov eax,esi
00489ADF . E8 A897F7FF call UnPacked.0040328C
00489AE4 . EB 04 jmp short UnPacked.00489AEA
00489AE6 > C645 F7 00 mov byte ptr ss:[ebp-9],0 ;注册失败标志
00489AEA > 33C0 xor eax,eax
00489AEC . 5A pop edx
00489AED . 59 pop ecx
00489AEE . 59 pop ecx
00489AEF . 64:8910 mov dword ptr fs:[eax],edx
00489AF2 . EB 0E jmp short UnPacked.00489B02
00489AF4 .^ E9 339CF7FF jmp UnPacked.0040372C
00489AF9 . C645 F7 00 mov byte ptr ss:[ebp-9],0
00489AFD . E8 929FF7FF call UnPacked.00403A94
00489B02 > 33C0 xor eax,eax
00489B04 . 5A pop edx
00489B05 . 59 pop ecx
00489B06 . 59 pop ecx
00489B07 . 64:8910 mov dword ptr fs:[eax],edx
00489B0A . EB 0A jmp short UnPacked.00489B16
00489B0C .^ E9 1B9CF7FF jmp UnPacked.0040372C
00489B11 . E8 7E9FF7FF call UnPacked.00403A94
00489B16 > 33C0 xor eax,eax
00489B18 . 5A pop edx
00489B19 . 59 pop ecx
00489B1A . 59 pop ecx
00489B1B . 64:8910 mov dword ptr fs:[eax],edx
00489B1E . 68 5F9B4800 push UnPacked.00489B5F
00489B23 > 8D45 9C lea eax,dword ptr ss:[ebp-64]
00489B26 . BA 03000000 mov edx,3
00489B2B . E8 54A5F7FF call UnPacked.00404084
00489B30 . 8D45 C0 lea eax,dword ptr ss:[ebp-40]
00489B33 . BA 03000000 mov edx,3
00489B38 . E8 47A5F7FF call UnPacked.00404084
00489B3D . 8D45 D8 lea eax,dword ptr ss:[ebp-28]
00489B40 . BA 07000000 mov edx,7
00489B45 . E8 3AA5F7FF call UnPacked.00404084
00489B4A . 8D45 F8 lea eax,dword ptr ss:[ebp-8]
00489B4D . BA 02000000 mov edx,2
00489B52 . E8 2DA5F7FF call UnPacked.00404084
00489B57 . C3 retn
00489B58 .^ E9 839EF7FF jmp UnPacked.004039E0
00489B5D .^ EB C4 jmp short UnPacked.00489B23
00489B5F . 8A45 F7 mov al,byte ptr ss:[ebp-9]
00489B62 . 5F pop edi
00489B63 . 5E pop esi
00489B64 . 5B pop ebx
00489B65 . 8BE5 mov esp,ebp
00489B67 . 5D pop ebp
00489B68 . C3 retn
--------------------------------------------------------------------------------------------------------------
『算法总结』:
1、序列号以'+'分隔,形式为12345+67890+12345
2、序列号第1段-(IntToStr(Name[Length]*Length)+IntToStr(Length)+'序列号第2段')*2<=4000.000
3、序列号第3段<>'1164121'
[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!