某软件安装序列号算法分析
本帖最后由 pendan2001 于 2016-6-29 14:29 编辑【文章标题】:Adobe Photoshop 4.0.4英文版算法分析
【软件名称】: Adobe Photoshop 4.0.4英文版
【下载地址】: 自己找吧
【使用工具】: OD等
【操作平台】:Winxp
【软件介绍】: 一看就明白干什么的。
【 声 明】: 仅为算法研究,勿作它途。
这个现在都是古董了,很多年前写的,没什么技术含量,写的不好别笑我,当时没留截图,大家凑合着看把,呵呵,论坛没看到有这方面的资料,所以^O^。。。
首先
isdcc21 setup.ins>setup.txt
// ------------- MAIN PROGRAM CODE --------------
program
start:
000CE1:0002: Disable(12);
000CE8:0021: number45 = 0;
000CF2:0021: number33 = 0;
000CFC:0146: InstallationInfo("Adobe", "Photoshop", "4.0", "photoshp.exe");
000D27:00B5: function82();
000D2F:00B5: function90();
000D37:0001: Enable(54);
000D3E:0002: Disable(11);
label1: //Ref: 000DD9
000D49:0002: Disable(50);
000D50:00B5: function24("Photoshop");
000D64:00B5: function5("", "");
000D72:0001: Enable(50);
label2: //Ref: 000F97001016001388
000D7D:00B5: function0("Adobe Photoshop Setup", "", string11, string12, string14);
000DA9:0021: number49 = LAST_RESULT;
000DB1:0021: number34 = number49;
000DB9:0128: number49 = number34 = 12;
000DCB:0022: if (number49 = 0) then
goto label3;
endif;
000DD9:002C: goto label1;
label3: //Ref: 000DCB
000DE6:0125: string25 = SUPPORTDIR ^ "PSSupprt.DLL";
000DFD:00B2: UseDLL(string25);
000E02:0021: number49 = LAST_RESULT;
000E0A:0021: number42 = number49;
000E12:0128: number49 = number42 != 0;
000E24:0022: if (number49 = 0) then
goto label5;
endif;
000E32:0013: string4 = "An Error occurred during the setup process! Please contact Adobe Systems Technical Support.";
000E95:0104: SprintfBox(-65533, "Adobe Photoshop Setup", string4);
000EBA:002B: exit;
label5: //Ref: 000E24
000EC4:00B4: PSFunc1(string14);
000ECC:0021: number49 = LAST_RESULT;
000ED4:0128: number50 = number49 = 0;
000EE6:0022: if (number50 = 0) then
goto label7;
endif;
000EF4:00B3: UnUseDLL("PSSupprt");//调用PSSupprt.DLL校验序列号
000F01:0013: string4 = "The serial number %s is not a valid Adobe Photoshop serial number. Please re-enter your serial number.";
000F6F:0104: SprintfBox(-65534, "Adobe Photoshop Setup", string4, string14);
000F97:002C: goto label2;
运行安装程序后,任务拦进程多了5个文件,看下这几个文件的用途:
wowexec.exe:是操作系统相关程序,用于支持16位进程。
ntvdm.exe:是Windows 16位虚拟机的一部分。该进程用于使16位的进程能够运行在32位的系统环境下。这个程序对你系统的正常运行是非常重要的。
winoldap.mod:是用于载入一些早期在DOS模式下开发的16位应用程序。
_isdel.exe是 InstallShieled (很多软件都是使用这套安装程序)安装后删除临时文件的工作,在安装过程中,有些暂时的文件会先存放在 Windows\Temp 下
,安装完毕,就自动删除,_ISDEL 如果不能正常执行的话,这些临时的暂存盘就不会被删掉,你可以自己把 Windows/Temp 下的文件删除,Windows/Temp 本来
就是存放一些站存盘用的,里面的东西你都可以清除掉而不会影响到系统。
第二步:
首先OD载入PSSupprt.DLL
在输出中选择10001230 PSFunc1--反汇编窗口中跟随,在call 10001230
下F2断点,在Arg1,Arg2,Arg3,Arg4,Arg5,Arg6参数窗口打勾。不然,OD拦截不下来。
忽略所有异常,F9运行程序,输入假序列号PWW123R7654321-565,不点确定。再开一个OD,附加进程inso432.mp
查看可执行模块
Executable modules, 条目 1
基址=00E00000
大小=0000E000 (57344.)
入口=00E01000 _WUTL95.<模块入口点>
名称=_WUTL95
文件版本=1.12.000.0
路径=C:\WINDOWS\TEMP\_WUTL95.DLL
F2,F9运行,断下来了
00E01000 >55 push ebp
00E01001 8BEC mov ebp, esp
00E01003 53 push ebx
00E01004 56 push esi
00E01005 57 push edi
00E01006 8B45 08 mov eax, dword ptr
00E01009 A3 E894E000 mov dword ptr , eax
00E0100E A1 E894E000 mov eax, dword ptr
00E01013 A3 EC94E000 mov dword ptr , eax
00E01018 B8 01000000 mov eax, 1
00E0101D E9 00000000 jmp 00E01022
。。。。。。。。。。。
CTRL+F9,ALT+F9,CTRL+F9,返回到序列号注册输入领空,点“确定”按钮,
断在这里
7C92E514 >C3 retn
观察寄存器,查看可执行模块,可以看到PSSupprt.DLL文件了
EAX 00000003
ECX 01689824 PSSupprt.01689824//数据窗口中跟随,下内存访问断点,F9
EDX F1680000
EBX 00000000
ESP 0013EB64
EBP 0013EC58
ESI 00253D10
EDI 00000000
EIP 7C92E514 ntdll.KiFastSystemCallRet
停在这里
004011E0 C705 A8BA4900 0>mov dword ptr , 0
004011EA E9 91000000 jmp 00401280
004011EF 837D 08 01 cmp dword ptr , 1
004011F3 0F85 87000000 jnz 00401280
ctrl+f9,好了,终于到达PSSupprt.DLL文件算法领空,
观察寄存器
EAX 01681230 PSSupprt.PSFunc1
ECX 0000F9AC
EDX 00000005
EBX 7FFD7000
ESP 0013F910
EBP 0013FDF8
ESI 0015237E
EDI 7C92E920 ntdll.7C92E920
EIP 01671230 PSSupprt.PSFunc1
PSSupprt.DLL调用函数PSFunc1校验序列号
01681230 >/$81EC 84020000 sub esp, 284//中断在这里
01681236|.C64424 02 50mov byte ptr , 50
0168123B|.C64424 03 57mov byte ptr , 57
01681240|.53 push ebx
01681241|.56 push esi
01681242|.8BB424 900200>mov esi, dword ptr //(ASCII "ABC123R7654321-566"),PSSupprt.PSFunc1+12
01681249|.57 push edi
0168124A|.55 push ebp
0168124B|.56 push esi//esi=001C55BF, (ASCII "ABC123R7654321-566")
PSSupprt.PSFunc1+1B
0168124C|.FF15 DCA06801 call dword ptr [<&KERNEL32.lstrlenA>] ; \lstrlenA
01681252|.66:3D FE00 cmp ax, 0FE//ax=12,比较序列号是否小等于254
01681256|.66:8BE8 mov bp, ax
01681259|.7E 04 jle short 0168125F
0168125B|.66:BD FE00 mov bp, 0FE
0168125F|>0FBFC5 movsx eax, bp
01681262|.8DBC24 940000>lea edi, dword ptr
01681269|.8BC8 mov ecx, eax
0168126B|.C1E9 02 shr ecx, 2
0168126E|.F3:A5 rep movs dword ptr es:, dword p>
01681270|.8BC8 mov ecx, eax
01681272|.33DB xor ebx, ebx
01681274|.83E1 03 and ecx, 3
01681277|.F3:A4 rep movs byte ptr es:, byte ptr>
01681279|.66:33F6 xor si, si
0168127C|.889C04 940000>mov byte ptr , bl
01681283|.66:85ED test bp, bp
01681286|.7E 6B jle short 016812F3
01681288|.BF 01000000 mov edi, 1
0168128D|>393D 44866801 /cmp dword ptr , edi\\\\\\\\\\\\\\\\\\\\\\\\
01681293|.7E 18 |jle short 016812AD
....
016812AD|>0FBFC6 |movsx eax, si
016812B0|.0FBE8C04 9400>|movsx ecx, byte ptr
016812B8|.8B15 38846801 |mov edx, dword ptr ;PSSupprt.01688442
016812BE|.33C0 |xor eax, eax
016812C0|.66:8B044A |mov ax, word ptr
016812C4|.83E0 08 |and eax, 8
016812C7|>85C0 |test eax, eax
016812C9|.75 21 |jnz short 016812EC
016812CB|.0FBFC6 |movsx eax, si
016812CE|.0FBE8C04 9400>|movsx ecx, byte ptr ///////////////依次取序列号每一位
016812D6|.51 |push ecx
016812D7|.E8 7F160000 |call 0168295B//范围是否在A-Z,0-9
016812DC|.0FBFCB |movsx ecx, bx
016812DF|.66:43 |inc bx
016812E1|.90 |nop
016812E2|.88840C 980000>|mov byte ptr , al
016812E9|.83C4 04 |add esp, 4
016812EC|>66:46 |inc si
016812EE|.66:3BEE |cmp bp, si
016812F1|.^ 7F 9A \jg short 0168128D////////////////////////////////////
016812F3|>0FBFC3 movsx eax, bx
016812F6|.33DB xor ebx, ebx
016812F8|.8D8C24 940000>lea ecx, dword ptr
016812FF|.889C04 940000>mov byte ptr , bl
01681306|.51 push ecx ; /String
01681307|.FF15 DCA06801 call dword ptr [<&KERNEL32.lstrlenA>] ; \lstrlenA
0168130D|.0FBFE8 movsx ebp, ax
01681310|.66:894424 10mov word ptr , ax
01681315|.8DB424 940000>lea esi, dword ptr
0168131C|.8DBC24 940100>lea edi, dword ptr
01681323|.8BCD mov ecx, ebp
01681325|.C1E9 02 shr ecx, 2
01681328|.F3:A5 rep movs dword ptr es:, dword p>
0168132A|.8BCD mov ecx, ebp
0168132C|.83E1 03 and ecx, 3
0168132F|.F3:A4 rep movs byte ptr es:, byte ptr>
01681331|.889C2C 940100>mov byte ptr , bl
01681338|>0FBFC3 /movsx eax, bx
0168133B|.8A8C04 940000>|mov cl, byte ptr
01681342|.384C04 12 |cmp byte ptr , cl//比较第1,2位序列号是否是PW
01681346|.75 21 |jnz short 01681369
01681348|.66:43 |inc bx
0168134A|.66:83FB 02 |cmp bx, 2
0168134E|.^ 7C E8 \jl short 01681338
01681350|.66:837C24 10 >cmp word ptr , 5
01681356|.7C 18 jl short 01681370
01681358|.80BC2C 900000>cmp byte ptr , 2D//比较第15位是否为“-”
01681360|.75 0E jnz short 01681370
01681362|.BE 01000000 mov esi, 1
01681367|.EB 09 jmp short 01681372
01681372|>85F6 test esi, esi
01681374|.0F84 DD020000 je 01681657
0168137A|.8D842C 910000>lea eax, dword ptr
01681381|.50 push eax//取序列号最后3位 (ASCII "566")
PSSupprt.PSFunc1+151
01681382|.E8 4C150000 call 016828D3//转化为16进制值236
01681387|.C6842C 940000>mov byte ptr , 0
0168138F|.66:8BF0 mov si, ax
01681392|.8D8424 980000>lea eax, dword ptr
01681399|.83C4 04 add esp, 4
0168139C|.50 push eax//序列号前14位 (ASCII "PWW123R7654321"); /String
0168139D|.FF15 DCA06801 call dword ptr [<&KERNEL32.lstrlenA>] ; \lstrlenA
016813A3|.66:894424 10mov word ptr , ax
016813A8|.8D8424 940000>lea eax, dword ptr
016813AF|.50 push eax// (ASCII "PWW123R7654321")
016813B0|.E8 EBFCFFFF call 016810A0////F7
________________________________________________
016810BE|> /66:B9 1100 /mov cx, 11
016810C2|. |66:8BC5 |mov ax, bp
016810C5|. |66:99 |cwd
016810C7|. |66:F7F9 |idiv cx
016810CA|. |0FBFC2 |movsx eax, dx
016810CD|. |40 |inc eax ;Switch (cases 0..10)
016810CE|. |48 |dec eax
016810CF|. |83F8 10 |cmp eax, 10
016810D2|. |77 07 |ja short 016810DB
016810D4|. /FF2485 8C1167>|jmp dword ptr ;PSSupprt.016810E6
016810DB|> \33C9 |xor ecx, ecx
016810DD|.EB 75 |jmp short 01681154
016810DF|>B9 52020000 |mov ecx, 252 ;Case 0 of switch 016810CD
016810E4|.EB 6E |jmp short 01681154
016810E6|>B9 75020000 |mov ecx, 275 ;Case 1 of switch 016810CD
016810EB|.EB 67 |jmp short 01681154
016810ED|>B9 AF010000 |mov ecx, 1AF ;Case 2 of switch 016810CD
016810F2|.EB 60 |jmp short 01681154
016810F4|>B9 BA030000 |mov ecx, 3BA ;Case 3 of switch 016810CD
016810F9|.EB 59 |jmp short 01681154
016810FB|>B9 E4000000 |mov ecx, 0E4 ;Case 4 of switch 016810CD
01681100|.EB 52 |jmp short 01681154
01681102|>B9 E5020000 |mov ecx, 2E5 ;Case 5 of switch 016810CD
01681107|.EB 4B |jmp short 01681154
01681109|>B9 9D010000 |mov ecx, 19D ;Case 6 of switch 016810CD
0168110E|.EB 44 |jmp short 01681154
01681110|>B9 4E030000 |mov ecx, 34E ;Case 7 of switch 016810CD
01681115|.EB 3D |jmp short 01681154
01681117|>B9 24020000 |mov ecx, 224 ;Case 8 of switch 016810CD
0168111C|.EB 36 |jmp short 01681154
0168111E|>B9 B1030000 |mov ecx, 3B1 ;Case 9 of switch 016810CD
01681123|.EB 2F |jmp short 01681154
01681125|>B9 BB000000 |mov ecx, 0BB ;Case A of switch 016810CD
0168112A|.EB 28 |jmp short 01681154
0168112C|>B9 77010000 |mov ecx, 177 ;Case B of switch 016810CD
01681131|.EB 21 |jmp short 01681154
01681133|>B9 57020000 |mov ecx, 257 ;Case C of switch 016810CD
01681138|.EB 1A |jmp short 01681154
0168113A|>B9 79020000 |mov ecx, 279 ;Case D of switch 016810CD
0168113F|.EB 13 |jmp short 01681154
01681141|>B9 A6030000 |mov ecx, 3A6 ;Case E of switch 016810CD
01681146|.EB 0C |jmp short 01681154
01681148|>B9 25020000 |mov ecx, 225 ;Case F of switch 016810CD
0168114D|.EB 05 |jmp short 01681154
0168114F|>B9 5B010000 |mov ecx, 15B ;Case 10 of switch 016810CD
01681154|> \0FBFC5 |movsx eax, bp ;Default case of switch 016810CD
01681157|.66:45 |inc bp
01681159|.57 |push edi/edi=0013F710, (ASCII "PWW123R7654321")
0168115A|.0FBE0438 |movsx eax, byte ptr //依次取每位ASCII
0168115E|.0FAFC1 |imul eax, ecx//ecx=252,相乘
01681161|.03D8 |add ebx, eax///每一次相乘后结果累加
01681163|.FFD6 |call esi
01681165|.0FBFCD |movsx ecx, bp
01681168|.3BC1 |cmp eax, ecx
0168116A|.^ 0F8F 4EFFFFFF \jg 016810BE
01681170|>B9 E8030000 mov ecx, 3E8
01681175|.8BC3 mov eax, ebx
01681177|.99 cdq
01681178|.F7F9 idiv ecx///768BE IDIV 3E8=1E5+236
0168117A|.83FA 64 cmp edx, 64//比较余数236是否大于64
0168117D|.8BC2 mov eax, edx
0168117F|.7D 05 jge short 01681186
01681181|.05 1C010000 add eax, 11C
01681186|>5D pop ebp
01681187|.5F pop edi
01681188|.5E pop esi
01681189|.5B pop ebx
0168118A\.C3 retn
016813B5|.66:2BC6 sub ax, si////ax=0236,si=236,上面运算的余数-序列号最后3位的16进制值=0
016813B8|.83C4 04 add esp, 4//相等则序列号正确
016813BB|.66:3D 0100 cmp ax, 1
016813BF|.1BF6 sbb esi, esi
016813C1|.F7DE neg esi
016813C3|.85F6 test esi, esi///esi=0则完了,等于1正确。
016813C5|.0F84 8C020000 je 01681657///跳就over了。
016813CB|.66:C705 A0626>mov word ptr , 1
016813D4|.66:837C24 10 >cmp word ptr , 7
016813DA|.7C 14 jl short 016813F0
016813DC|.80BC24 9A0000>cmp byte ptr , 41(A)//取序列号第7位即R比较是否在(A--Z)
016813E4|.7C 0A jl short 016813F0
016813E6|.80BC24 9A0000>cmp byte ptr , 5A(Z)
016813EE|.7E 02 jle short 016813F2
016813F0|>33F6 xor esi, esi
016813F2|>66:837C24 10 >cmp word ptr , 5
016813F8|.0F8C A1000000 jl 0168149F
016813FE|.0FBF4424 10 movsx eax, word ptr
01681403|.8DBC04 900000>lea edi, dword ptr //(ASCII "4321")取序列号第11-14位
0168140A|.803F 2D cmp byte ptr , 2D//是否等于“-”,不等继续往下
0168140D|.0F85 8C000000 jnz 0168149F
01681413|.8D8404 910000>lea eax, dword ptr
0168141A|.8D4C24 14 lea ecx, dword ptr
0168141E|.50 push eax ; /String2
0168141F|.51 push ecx ; |String1
01681420|.FF15 30A16801 call dword ptr [<&KERNEL32.lstrcpyA>] ; \lstrcpyA
01681426|.8D8C24 940000>lea ecx, dword ptr
0168142D|.BB 01000000 mov ebx, 1
01681432|.51 push ecx ; /String
01681433|.C607 00 mov byte ptr , 0 ; |
01681436|.66:33FF xor di, di ; |
01681439|.FF15 DCA06801 call dword ptr [<&KERNEL32.lstrlenA>] ; \lstrlenA
0168143F|.66:894424 10mov word ptr , ax
01681444|>85F6 /test esi, esi
01681446|.74 3A |je short 01681482
01681448|.391D 44866801 |cmp dword ptr , ebx
0168144E|.7E 15 |jle short 01681465
01681450|.0FBFC7 |movsx eax, di
01681453|.0FBE4C04 14 |movsx ecx, byte ptr
01681458|.6A 04 |push 4
0168145A|.51 |push ecx
0168145B|.E8 80140000 |call 016828E0
01681460|.83C4 08 |add esp, 8
01681463|.EB 17 |jmp short 0168147C
01681465|>0FBFC7 |movsx eax, di
01681468|.0FBE5404 14 |movsx edx, byte ptr
0168146D|.8B0D 38846801 |mov ecx, dword ptr ;PSSupprt.01688442
01681473|.33C0 |xor eax, eax
01681475|.66:8B0451 |mov ax, word ptr
01681479|.83E0 04 |and eax, 4
0168147C|>8BF3 |mov esi, ebx
0168147E|.85C0 |test eax, eax
01681480|.75 02 |jnz short 01681484
01681482|>33F6 |xor esi, esi
01681484|>66:47 |inc di
01681486|.66:83FF 03 |cmp di, 3
0168148A|.^ 7C B8 \jl short 01681444
0168148C|.8D4424 14 lea eax, dword ptr
01681490|.50 push eax
01681491|.E8 3D140000 call 016828D3
01681496|.66:A3 A062680>mov word ptr , ax
0168149C|.83C4 04 add esp, 4
0168149F|>33DB xor ebx, ebx
016814A1|.85F6 test esi, esi
016814A3|.0F84 06010000 je 016815AF
016814A9|.66:837C24 10 >cmp word ptr , 6
016814AF|.0F8E FA000000 jle 016815AF
016814B5|.8D8424 940000>lea eax, dword ptr
016814BC|.8D4C24 14 lea ecx, dword ptr
016814C0|.50 push eax //(ASCII "PWW123R7654321"); /String2
016814C1|.51 push ecx ; |String1
016814C2|.FF15 30A16801 call dword ptr [<&KERNEL32.lstrcpyA>] ; \lstrcpyA
016814C8|.0FBF4C24 10 movsx ecx, word ptr
016814CD|.8D5424 14 lea edx, dword ptr
016814D1|.885C0C 0E mov byte ptr , bl
016814D5|.52 push edx // (ASCII "PWW123R7") ;/String
016814D6|.FF15 DCA06801 call dword ptr [<&KERNEL32.lstrlenA>] ; \lstrlenA
016814DC|.66:8BF8 mov di, ax
016814DF|.66:85FF test di, di
016814E2|.0F8E 8F000000 jle 01681577
016814E8|.BD 01000000 mov ebp, 1
016814ED|>85F6 /test esi, esi\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\循环
016814EF|.74 79 |je short 0168156A
016814F1|.392D 44866801 |cmp dword ptr , ebp
016814F7|.7E 15 |jle short 0168150E
016814F9|.0FBFC3 |movsx eax, bx
016814FC|.0FBE4C04 14 |movsx ecx, byte ptr
01681501|.6A 04 |push 4
01681503|.51 |push ecx
01681504|.E8 D7130000 |call 016828E0
01681509|.83C4 08 |add esp, 8
0168150C|.EB 17 |jmp short 01681525
0168150E|>0FBFC3 |movsx eax, bx
01681511|.0FBE4C04 14 |movsx ecx, byte ptr //依次取"PWW123R7"
01681516|.8B15 38846801 |mov edx, dword ptr ;PSSupprt.01688442
0168151C|.33C0 |xor eax, eax
0168151E|.66:8B044A |mov ax, word ptr
01681522|.83E0 04 |and eax, 4
01681525|>85C0 |test eax, eax
01681527|.75 3D |jnz short 01681566
01681529|.392D 44866801 |cmp dword ptr , ebp
0168152F|.7E 18 |jle short 01681549
01681531|.0FBFC3 |movsx eax, bx
01681534|.0FBE4C04 14 |movsx ecx, byte ptr
01681539|.68 03010000 |push 103
0168153E|.51 |push ecx
0168153F|.E8 9C130000 |call 016828E0
01681544|.83C4 08 |add esp, 8
01681547|.EB 19 |jmp short 01681562
01681549|>0FBFC3 |movsx eax, bx
0168154C|.0FBE4C04 14 |movsx ecx, byte ptr
01681551|.8B15 38846801 |mov edx, dword ptr ;PSSupprt.01688442
01681557|.33C0 |xor eax, eax
01681559|.66:8B044A |mov ax, word ptr
0168155D|.25 03010000 |and eax, 103
01681562|>85C0 |test eax, eax
01681564|.74 04 |je short 0168156A
01681566|>8BF5 |mov esi, ebp
01681568|.EB 02 |jmp short 0168156C
0168156A|>33F6 |xor esi, esi
0168156C|>66:43 |inc bx
0168156E|.66:3BFB |cmp di, bx
01681571|.^ 0F8F 76FFFFFF \jg 016814ED///////////////////////////////循环,取8次
01681577|>66:83FF 08 cmp di, 8
0168157B|.7F 12 jg short 0168158F
0168157D|.8D4424 14 lea eax, dword ptr
01681581|.50 push eax ; /String2
01681582|.68 00606801 push 01686000 ; |String1 = PSSupprt.01686000
01681587|.FF15 30A16801 call dword ptr [<&KERNEL32.lstrcpyA>] ; \lstrcpyA
0168158D|.EB 02 jmp short 01681591
0168158F|>33F6 xor esi, esi
01681591|>66:8B4424 10mov ax, word ptr
01681596|.8D8C24 940000>lea ecx, dword ptr
0168159D|.66:2D 0600 sub ax, 6
016815A1|.50 push eax
016815A2|.6A 00 push 0
016815A4|.51 push ecx
016815A5|.E8 56FAFFFF call 01681000////PSSupprt.DLL文件入口地址
016815AA|.83C4 0C add esp, 0C
016815AD|.EB 07 jmp short 016815B6
016815AF|>C605 00606801>mov byte ptr , 0
016815B6|>66:33FF xor di, di
016815B9|.8D8424 940000>lea eax, dword ptr
016815C0|.50 push eax(ASCII "654321") ; /String
016815C1|.FF15 DCA06801 call dword ptr [<&KERNEL32.lstrlenA>] ; \lstrlenA
016815C7|.66:8BD8 mov bx, ax
016815CA|.66:85DB test bx, bx
016815CD|.7E 52 jle short 01681621
016815CF|.BD 01000000 mov ebp, 1
016815D4|>85F6 /test esi, esi
016815D6|.74 40 |je short 01681618
016815D8|.392D 44866801 |cmp dword ptr , ebp
016815DE|.7E 18 |jle short 016815F8
016815E0|.0FBFC7 |movsx eax, di
016815E3|.0FBE8C04 9400>|movsx ecx, byte ptr
016815EB|.6A 04 |push 4
016815ED|.51 |push ecx
016815EE|.E8 ED120000 |call 016828E0
016815F3|.83C4 08 |add esp, 8
016815F6|.EB 1A |jmp short 01681612
016815F8|>0FBFC7 |movsx eax, di
016815FB|.0FBE9404 9400>|movsx edx, byte ptr ///依次取序列号“654321”
01681603|.8B0D 38846801 |mov ecx, dword ptr ;PSSupprt.01688442
01681609|.33C0 |xor eax, eax
0168160B|.66:8B0451 |mov ax, word ptr
0168160F|.83E0 04 |and eax, 4
01681612|>8BF5 |mov esi, ebp
01681614|.85C0 |test eax, eax
01681616|.75 02 |jnz short 0168161A
01681618|>33F6 |xor esi, esi
0168161A|>66:47 |inc di
0168161C|.66:3BDF |cmp bx, di//循环6次
0168161F|.^ 7F B3 \jg short 016815D4
01681621|>8D8424 940000>lea eax, dword ptr
01681628|.50 push eax //(ASCII "654321")
01681629|.E8 10120000 call 0168283E //654321转化为16进制9FBF1
0168162E|.83C4 04 add esp, 4
01681631|.A3 9C626801 mov dword ptr , eax
01681636|.8D8424 940100>lea eax, dword ptr
0168163D|.50 push eax //(ASCII "PWW123R7654321-566")
0168163E|.E8 8DFBFFFF call 016811D0///////F7
01681643|.83C4 04 add esp, 4
01681646|.85C0 test eax, eax
01681648|.74 0D je short 01681657
0168164A|.68 D0070000 push 7D0 ; /Timeout = 2000. ms
0168164F|.33F6 xor esi, esi ; |
01681651|.FF15 E4A06801 call dword ptr [<&KERNEL32.Sleep>] ; \Sleep
01681657|>8BC6 mov eax, esi
01681659|>5D pop ebp
0168165A|.5F pop edi
0168165B|.5E pop esi
0168165C|.5B pop ebx
0168165D|.81C4 84020000 add esp, 284
01681663\.C2 0400 retn 4
017511D0/$53 push ebx
017511D1|.56 push esi
017511D2|.57 push edi
017511D3|.33F6 xor esi, esi
017511D5|.8B7C24 10 mov edi, dword ptr
017511D9|.8B1D DCA07501 mov ebx, dword ptr [<&KERNEL32.lstrlenA>] ;kernel32.lstrlenA
017511DF|.57 push edi ; /String
017511E0|.FFD3 call ebx ; \lstrlenA
017511E2|.85C0 test eax, eax
017511E4|.7E 0C jle short 017511F2
017511E6|>803437 AA /xor byte ptr , 0AA//取序列号“PWW123R7654321-566”与AA异或
017511EA|.46 |inc esi
017511EB|.57 |push edi
017511EC|.FFD3 |call ebx
017511EE|.3BC6 |cmp eax, esi
017511F0|.^ 7F F4 \jg short 017511E6//循环18次
017511F2|>BE 00807501 mov esi, 01758000
017511F7|.85F6 test esi, esi
017511F9|.74 19 je short 01751214
017511FB|.8B1D E0A07501 mov ebx, dword ptr [<&KERNEL32.lstrcmpA>] ;kernel32.lstrcmpA
01751201|>8B06 /mov eax, dword ptr
01751203|.85C0 |test eax, eax
01751205|.74 0D |je short 01751214
01751207|.57 |push edi
01751208|.50 |push eax
01751209|.FFD3 |call ebx ;kernel32.lstrcmpA
0175120B|.85C0 |test eax, eax
0175120D|.74 0B |je short 0175121A
0175120F|.83C6 04 |add esi, 4
01751212|.^ 75 ED \jnz short 01751201
01751214|>33C0 xor eax, eax
01751216|.5F pop edi
01751217|.5E pop esi
01751218|.5B pop ebx
01751219|.C3 retn
算法总结:
1。序列号18位,格式为S1-S2。S1共14位,第1,2位为PW,第7位为字母,范围在A--Z,
第15位是否为“-”,S2共3位。
2。S1共14位中的每一位与252,275,1AF,3BA,0E4,2E5,19D,34E,224,3B1,0BB,177,257,
279相乘,每次结果相加。最后的结果除以1000,余数等于S2的16进制值,但要大等于100。
得到简单的几个安装序列号
PWF400T9876543-514
PWW400R7110035-487
PWW123R7654321-566
经测试,该算法同样适合Adobe Photoshop5.0 简体中文版、Adobe Photoshop6.0中文版。
强大啊 学习了 楼主可以写份注册机参考一下么? 好强大,完全看不懂……。 可以写个注册机出来了 都很老的东西了,写出来也没什么价值的,呵呵 方法不错的啊 学习了 支持~ 楼主果然厉害
页:
[1]