pendan2001 发表于 2016-6-29 13:57

某软件安装序列号算法分析

本帖最后由 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中文版。





bestyyb 发表于 2016-6-29 14:01

强大啊 学习了

iamLiar 发表于 2016-6-29 14:03

still1414 发表于 2016-6-29 14:09

楼主可以写份注册机参考一下么?

rzlsysw01 发表于 2016-6-29 14:10

好强大,完全看不懂……。

cohon 发表于 2016-6-29 14:13

可以写个注册机出来了

pendan2001 发表于 2016-6-29 14:14

都很老的东西了,写出来也没什么价值的,呵呵

yhxing 发表于 2016-6-29 15:14

方法不错的啊 学习了 支持~

zhangbaida 发表于 2016-7-21 22:49

楼主果然厉害
页: [1]
查看完整版本: 某软件安装序列号算法分析