好友
阅读权限10
听众
最后登录1970-1-1
|
本帖最后由 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: 000F97 001016 001388
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 [ebp+8]
00E01009 A3 E894E000 mov dword ptr [E094E8], eax
00E0100E A1 E894E000 mov eax, dword ptr [E094E8]
00E01013 A3 EC94E000 mov dword ptr [E094EC], 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 [49BAA8], 0
004011EA E9 91000000 jmp 00401280
004011EF 837D 08 01 cmp dword ptr [ebp+8], 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 50 mov byte ptr [esp+2], 50
0168123B |. C64424 03 57 mov byte ptr [esp+3], 57
01681240 |. 53 push ebx
01681241 |. 56 push esi
01681242 |. 8BB424 900200>mov esi, dword ptr [esp+290]//(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 [esp+94]
01681269 |. 8BC8 mov ecx, eax
0168126B |. C1E9 02 shr ecx, 2
0168126E |. F3:A5 rep movs dword ptr es:[edi], 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:[edi], byte ptr>
01681279 |. 66:33F6 xor si, si
0168127C |. 889C04 940000>mov byte ptr [esp+eax+94], 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 [1688644], edi\\\\\\\\\\\\\\\\\\\\\\\\
01681293 |. 7E 18 |jle short 016812AD
....
016812AD |> 0FBFC6 |movsx eax, si
016812B0 |. 0FBE8C04 9400>|movsx ecx, byte ptr [esp+eax+94]
016812B8 |. 8B15 38846801 |mov edx, dword ptr [1688438] ; PSSupprt.01688442
016812BE |. 33C0 |xor eax, eax
016812C0 |. 66:8B044A |mov ax, word ptr [edx+ecx*2]
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 [esp+eax+94]///////////////依次取序列号每一位
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 [esp+ecx+98], 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 [esp+94]
016812FF |. 889C04 940000>mov byte ptr [esp+eax+94], bl
01681306 |. 51 push ecx ; /String
01681307 |. FF15 DCA06801 call dword ptr [<&KERNEL32.lstrlenA>] ; \lstrlenA
0168130D |. 0FBFE8 movsx ebp, ax
01681310 |. 66:894424 10 mov word ptr [esp+10], ax
01681315 |. 8DB424 940000>lea esi, dword ptr [esp+94]
0168131C |. 8DBC24 940100>lea edi, dword ptr [esp+194]
01681323 |. 8BCD mov ecx, ebp
01681325 |. C1E9 02 shr ecx, 2
01681328 |. F3:A5 rep movs dword ptr es:[edi], dword p>
0168132A |. 8BCD mov ecx, ebp
0168132C |. 83E1 03 and ecx, 3
0168132F |. F3:A4 rep movs byte ptr es:[edi], byte ptr>
01681331 |. 889C2C 940100>mov byte ptr [esp+ebp+194], bl
01681338 |> 0FBFC3 /movsx eax, bx
0168133B |. 8A8C04 940000>|mov cl, byte ptr [esp+eax+94]
01681342 |. 384C04 12 |cmp byte ptr [esp+eax+12], 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 [esp+10], 5
01681356 |. 7C 18 jl short 01681370
01681358 |. 80BC2C 900000>cmp byte ptr [esp+ebp+90], 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 [esp+ebp+91]
01681381 |. 50 push eax//取序列号最后3位 (ASCII "566")
PSSupprt.PSFunc1+151
01681382 |. E8 4C150000 call 016828D3//转化为16进制值236
01681387 |. C6842C 940000>mov byte ptr [esp+ebp+94], 0
0168138F |. 66:8BF0 mov si, ax
01681392 |. 8D8424 980000>lea eax, dword ptr [esp+98]
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 10 mov word ptr [esp+10], ax
016813A8 |. 8D8424 940000>lea eax, dword ptr [esp+94]
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 [eax*4+167118C] ; 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 [eax+edi]//依次取每位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 [16862A0], 1
016813D4 |. 66:837C24 10 >cmp word ptr [esp+10], 7
016813DA |. 7C 14 jl short 016813F0
016813DC |. 80BC24 9A0000>cmp byte ptr [esp+9A], 41(A)//取序列号第7位即R比较是否在(A--Z)
016813E4 |. 7C 0A jl short 016813F0
016813E6 |. 80BC24 9A0000>cmp byte ptr [esp+9A], 5A(Z)
016813EE |. 7E 02 jle short 016813F2
016813F0 |> 33F6 xor esi, esi
016813F2 |> 66:837C24 10 >cmp word ptr [esp+10], 5
016813F8 |. 0F8C A1000000 jl 0168149F
016813FE |. 0FBF4424 10 movsx eax, word ptr [esp+10]
01681403 |. 8DBC04 900000>lea edi, dword ptr [esp+eax+90]//(ASCII "4321")取序列号第11-14位
0168140A |. 803F 2D cmp byte ptr [edi], 2D//是否等于“-”,不等继续往下
0168140D |. 0F85 8C000000 jnz 0168149F
01681413 |. 8D8404 910000>lea eax, dword ptr [esp+eax+91]
0168141A |. 8D4C24 14 lea ecx, dword ptr [esp+14]
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 [esp+94]
0168142D |. BB 01000000 mov ebx, 1
01681432 |. 51 push ecx ; /String
01681433 |. C607 00 mov byte ptr [edi], 0 ; |
01681436 |. 66:33FF xor di, di ; |
01681439 |. FF15 DCA06801 call dword ptr [<&KERNEL32.lstrlenA>] ; \lstrlenA
0168143F |. 66:894424 10 mov word ptr [esp+10], ax
01681444 |> 85F6 /test esi, esi
01681446 |. 74 3A |je short 01681482
01681448 |. 391D 44866801 |cmp dword ptr [1688644], ebx
0168144E |. 7E 15 |jle short 01681465
01681450 |. 0FBFC7 |movsx eax, di
01681453 |. 0FBE4C04 14 |movsx ecx, byte ptr [esp+eax+14]
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 [esp+eax+14]
0168146D |. 8B0D 38846801 |mov ecx, dword ptr [1688438] ; PSSupprt.01688442
01681473 |. 33C0 |xor eax, eax
01681475 |. 66:8B0451 |mov ax, word ptr [ecx+edx*2]
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 [esp+14]
01681490 |. 50 push eax
01681491 |. E8 3D140000 call 016828D3
01681496 |. 66:A3 A062680>mov word ptr [16862A0], 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 [esp+10], 6
016814AF |. 0F8E FA000000 jle 016815AF
016814B5 |. 8D8424 940000>lea eax, dword ptr [esp+94]
016814BC |. 8D4C24 14 lea ecx, dword ptr [esp+14]
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 [esp+10]
016814CD |. 8D5424 14 lea edx, dword ptr [esp+14]
016814D1 |. 885C0C 0E mov byte ptr [esp+ecx+E], 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 [1688644], ebp
016814F7 |. 7E 15 |jle short 0168150E
016814F9 |. 0FBFC3 |movsx eax, bx
016814FC |. 0FBE4C04 14 |movsx ecx, byte ptr [esp+eax+14]
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 [esp+eax+14]//依次取"PWW123R7"
01681516 |. 8B15 38846801 |mov edx, dword ptr [1688438] ; PSSupprt.01688442
0168151C |. 33C0 |xor eax, eax
0168151E |. 66:8B044A |mov ax, word ptr [edx+ecx*2]
01681522 |. 83E0 04 |and eax, 4
01681525 |> 85C0 |test eax, eax
01681527 |. 75 3D |jnz short 01681566
01681529 |. 392D 44866801 |cmp dword ptr [1688644], ebp
0168152F |. 7E 18 |jle short 01681549
01681531 |. 0FBFC3 |movsx eax, bx
01681534 |. 0FBE4C04 14 |movsx ecx, byte ptr [esp+eax+14]
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 [esp+eax+14]
01681551 |. 8B15 38846801 |mov edx, dword ptr [1688438] ; PSSupprt.01688442
01681557 |. 33C0 |xor eax, eax
01681559 |. 66:8B044A |mov ax, word ptr [edx+ecx*2]
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 [esp+14]
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 10 mov ax, word ptr [esp+10]
01681596 |. 8D8C24 940000>lea ecx, dword ptr [esp+94]
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 [1686000], 0
016815B6 |> 66:33FF xor di, di
016815B9 |. 8D8424 940000>lea eax, dword ptr [esp+94]
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 [1688644], ebp
016815DE |. 7E 18 |jle short 016815F8
016815E0 |. 0FBFC7 |movsx eax, di
016815E3 |. 0FBE8C04 9400>|movsx ecx, byte ptr [esp+eax+94]
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 [esp+eax+94]///依次取序列号“654321”
01681603 |. 8B0D 38846801 |mov ecx, dword ptr [1688438] ; PSSupprt.01688442
01681609 |. 33C0 |xor eax, eax
0168160B |. 66:8B0451 |mov ax, word ptr [ecx+edx*2]
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 [esp+94]
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 [168629C], eax
01681636 |. 8D8424 940100>lea eax, dword ptr [esp+194]
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 [esp+10]
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 [edi+esi], 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 [esi]
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中文版。
|
免费评分
-
查看全部评分
|