冷月孤心 发表于 2019-2-27 17:58

无源码给软件添加VMP硬件授权【伪原创】

本帖最后由 冷月孤心 于 2019-3-1 01:17 编辑

1.简介:
无源码给软件添加VMP授权 。思路与工具来自这里https://bbs.pediy.com/thread-204563.htm。参考了大神的思路。借用了这个文件的代码段。
用到函数如下,有部分函数文件里没有,那就全部添加了吧。也可以查软件里面包含哪个函数,如果都有的话,只添加VMProtectSDK32.dllVMProtectGetCurrentHWID   VMProtectSetSerialNumber两个就好。

用到函数如下 :VMProtectSDK32.VMPro>; VMProtec. VMProtectSetSerialNumber
VMProtectSDK32.VMPro>; VMProtec.VMProtectGetCurrentHWIDUSER32.CloseClipboar>; user32.CloseClipboarduser32.EmptyClipboar>; user32.EmptyClipboarduser32.MessageBoxA>] ; user32.MessageBoxAUSER32.OpenClipboard>; user32.OpenClipboarduser32.SetClipboardD>; user32.SetClipboardDatakernel32.ExitProcess>; kernel32.ExitProcesskernel32.GlobalAlloc>; kernel32.GlobalAllocKERNEL32.GlobalLock>>; kernel32.GlobalLockKERNEL32.GlobalUnloc>; kernel32.GlobalUnlock

2.注意事项:
测试发现,要先添加空区段再添加输入表函数,如果空区段添加在最后,各种问题就来了。如果仔细看就发现新的OEP了,需要修正的内存地址都注释了。
检测机器码的代码要写在检测授权文件代码之前。否则走完检测授权的代码后某个内存地址会被修改,从而导致出错。我是写在新添加的区段起始位置了。

也就是说要第二段要写在第一段之前。

3.开工吧!检测授权文件
第一段代码,读取注册文件及内容,有则跳向VMP壳授权校验代码,没有注册文件及内容则跳向下一段取硬件码。利用GetPrivateProfileStringA 取授权字符, VMProtectSetSerialNumber检测授权文件存在与否可以偷懒二进制粘贴上,再修改


第一段代码十六进制:

33 C9 64 A1 30 00 00 00 8B 40 0C 8B 70 1C 8B 46 08 8B 7E 20 8B 36 66 39 4F 18 75 F2 8B D0 8B 42

3C 8B 44 10 78 03 C2 8B 70 20 03 F2 68 73 73 00 00 68 64 64 72 65 68 72 6F 63 41 68 47 65 74 50

54 33 C9 8B 3E 03 FA 56 8B 74 24 04 51 B9 0F 00 00 00 F3 A6 74 0B 59 5E 83 C6 04 41 3B 48 18 72

E2 59 8B 70 24 03 F2 0F B7 0C 4E 8B 70 1C 03 F2 8B 34 8E 03 F2 8B FA 6A 00 68 61 72 79 41 68 4C

69 62 72 68 4C 6F 61 64 54 52 FF D6 E8 0D 00 00 00 6B 65 72 6E 65 6C 33 32 2E 64 6C 6C 00 5B 53

FF D0 E8 19 00 00 00 47 65 74 50 72 69 76 61 74 65 50 72 6F 66 69 6C 65 53 74 72 69 6E 67 41 00

5B 53 50 FF D6 E8 0A 00 00 00 2E 5C 4B 65 79 2E 64 61 74 00 5B 53 68 56 02 00 00 E8 00 00 00 00

5B 83 C3 50 53 6A 00 E8 04 00 00 00 4C 69 63 00 5B 53 E8 09 00 00 00 CA DA C8 A8 CE C4 BC FE 00

5B 53 FF D0 8B 44 24 F4 E8 07 00 00 00 90 FF 25 48 10 82 00 80 38 00 0F 84 5D FE FF FF 5B 50 FF

D3 68 BC 38 5C 00 C3
汇编代码如下:

0081E150 >/$33C9          xor ecx,ecx                                                                //新的OEP

0081E152|.64:A1 3000000>mov eax,dword ptr fs:

0081E158|.8B40 0C       mov eax,dword ptr ds:

0081E15B|.8B70 1C       mov esi,dword ptr ds:

0081E15E|>8B46 08       /mov eax,dword ptr ds:

0081E161|.8B7E 20       |mov edi,dword ptr ds:

0081E164|.8B36          |mov esi,dword ptr ds:

0081E166|.66:394F 18    |cmp word ptr ds:,cx

0081E16A|.^ 75 F2         \jnz short ZZZX.0081E15E

0081E16C|.8BD0          mov edx,eax

0081E16E|.8B42 3C       mov eax,dword ptr ds:

0081E171|.8B4410 78   mov eax,dword ptr ds:

0081E175|.03C2          add eax,edx

0081E177|.8B70 20       mov esi,dword ptr ds:

0081E17A|.03F2          add esi,edx

0081E17C|.68 73730000   push 0x7373

0081E181|.68 64647265   push 0x65726464

0081E186|.68 726F6341   push 0x41636F72

0081E18B|.68 47657450   push 0x50746547

0081E190|.54            push esp

0081E191|.33C9          xor ecx,ecx

0081E193|>8B3E          /mov edi,dword ptr ds:

0081E195|.03FA          |add edi,edx

0081E197|.56            |push esi

0081E198|.8B7424 04   |mov esi,dword ptr ss:

0081E19C|.51            |push ecx

0081E19D|.B9 0F000000   |mov ecx,0xF

0081E1A2|.F3:A6         |repe cmps byte ptr es:,byte ptr ds>

0081E1A4|.74 0B         |je short ZZZX.0081E1B1

0081E1A6|.59            |pop ecx

0081E1A7|.5E            |pop esi

0081E1A8|.83C6 04       |add esi,0x4

0081E1AB|.41            |inc ecx

0081E1AC|.3B48 18       |cmp ecx,dword ptr ds:

0081E1AF|.^ 72 E2         \jb short ZZZX.0081E193

0081E1B1|>59            pop ecx

0081E1B2|.8B70 24       mov esi,dword ptr ds:

0081E1B5|.03F2          add esi,edx

0081E1B7|.0FB70C4E      movzx ecx,word ptr ds:

0081E1BB|.8B70 1C       mov esi,dword ptr ds:

0081E1BE|.03F2          add esi,edx

0081E1C0|.8B348E      mov esi,dword ptr ds:

0081E1C3|.03F2          add esi,edx

0081E1C5|.8BFA          mov edi,edx

0081E1C7|.6A 00         push 0x0

0081E1C9|.68 61727941   push 0x41797261

0081E1CE|.68 4C696272   push 0x7262694C

0081E1D3|.68 4C6F6164   push 0x64616F4C

0081E1D8|.54            push esp

0081E1D9|.52            push edx

0081E1DA|.FFD6          call esi

0081E1DC|.E8 0D000000   call ZZZX.0081E1EE                     ;PUSH ASCII "kernel32.dll"

0081E1E1|.6B 65 72 6E 6>ascii "kernel32.dll",0

0081E1EE|>5B            pop ebx

0081E1EF|.53            push ebx

0081E1F0|.FFD0          call eax

0081E1F2|.E8 19000000   call ZZZX.0081E210                     ;PUSH ASCII "GetPrivateProfileStringA"

0081E1F7|.47 65 74 50 7>ascii "GetPrivateProfil"

0081E207|.65 53 74 72 6>ascii "eStringA",0

0081E210|>5B            pop ebx

0081E211|.53            push ebx

0081E212|.50            push eax

0081E213|.FFD6          call esi

0081E215|.E8 0A000000   call ZZZX.0081E224                     ;PUSH ASCII ".\Key.dat"

0081E21A|.2E 5C 4B 65 7>ascii ".\Key.dat",0

0081E224|>5B            pop ebx

0081E225|.53            push ebx

0081E226|.68 56020000   push 0x256

0081E22B|.E8 00000000   call ZZZX.0081E230

0081E230|$5B            pop ebx

0081E231|.83C3 50       add ebx,0x50

0081E234|.53            push ebx

0081E235|.6A 00         push 0x0

0081E237|.E8 04000000   call ZZZX.0081E240                     ;PUSH ASCII "Lic"

0081E23C|.4C 69 63 00   ascii "Lic",0

0081E240|>5B            pop ebx

0081E241|.53            push ebx

0081E242|.E8 09000000   call ZZZX.0081E250

0081E247\.CA DAC8       retf 0xC8DA

0081E24A      A8            db A8

0081E24B   .CE C4 BC FE 0>ascii "文件",0

0081E250   $5B            pop ebx                                  ;ZZZX.0081E247

0081E251   .53            push ebx

0081E252   .FFD0          call eax

0081E254   .8B4424 F4   mov eax,dword ptr ss:

0081E258   .E8 07000000   call ZZZX.0081E264

0081E25D   .90            nop

0081E25E   .- FF25 48108200 jmp dword ptr ds:[<&VMProtectSDK32.VMPro>;//修正此处 地址处call VMProtectSetSerialNumber

0081E264   $8038 00       cmp byte ptr ds:,0x0                                          //取授权文件字符串第一个字符比较,如果是零则下面跳向硬件码弹窗。

0081E267   .^ 0F84 5DFEFFFF je ZZZX.0081E0CA                                          // 跳向硬件码弹窗 jmp_硬件弹窗(MARK_4):

0081E26D   .5B            pop ebx

0081E26E   .50            push eax

0081E26F   .FFD3          call ebx

0081E271   .68 BC385C00   push ZZZX.00888888                                     // 返回软件原始OEP                           

0081E276   .C3            retn




4.获取硬件码:
第二段代码借鉴别人的,也可以自己编译。VMP帮助Step 1.9: Hardware lock有使用方法。编译好了把代码段取出来
VMProtectGetCurrentHWID
取的硬件码HWID: myhwid
偷懒一下,二进制粘贴也可以:8B 44 24 04 6A 00 C7 00 00 00 00 00 E8 19 01 00 00 85 C0 74 65 53 55 56 57 E8 00 01 00 00 8B 74

24 1C 83 C9 FF 33 C0 8B 3E F2 AE F7 D1 49 8B E9 45 55 6A 42 E8 03 01 00 00 8B D8 85 DB 74 32 8B

36 53 E8 FB 00 00 00 8B CD 8B F8 8B D1 53 C1 E9 02 F3 A5 8B CA 83 E1 03 F3 A4 E8 E9 00 00 00 53

6A 01 E8 C9 00 00 00 8B 44 24 14 C7 00 01 00 00 00 E8 A2 00 00 00 5F 5E 5D 5B C3 90 8D 44 24 08

83 EC 0C 50 FF 74 24 14 33 C0 89 44 24 08 89 44 24 0C 89 44 24 10 8D 54 24 08 52 FF D3 8B 44 24

0C 8B 54 24 10 8B 4C 24 14 83 C4 18 C3 55 8B EC 68 04 00 00 80 6A 00 FF 75 08 6A 01 BB 00 E0 81

00 E8 B6 FF FF FF C9 C2 04 00 6A 00 6A 00 E8 3F 00 00 00 83 F8 00 74 1F A3 B0 E4 81 00 FF 35 B0

E4 81 00 68 33 E3 81 00 E8 25 00 00 00 68 33 E3 81 00 E8 B6 FF FF FF 6A 00 68 66 E6 81 00 68 33

E3 81 00 6A 00 E8 1A 00 00 00 6A 00 E8 25 00 00 00 CC FF 25 4C 10 82 00 FF 25 E8 86 81 00 FF 25

8C 86 81 00 FF 25 C4 80 81 00 FF 25 1C 85 81 00 FF 25 CC 84 81 00 FF 25 7C 80 81 00 FF 25 C8 81

81 00 FF 25 B8 81 81 00 FF 25 A8 81 81 00


汇编代码如下:
MARK_1:

0081E000   .8B4424 04   mov eax,dword ptr ss:                                          //这段应该是 复制机器码到剪贴版。如果不对大神请指正。

0081E004   .6A 00         push 0x0                                 ; /hWnd = NULL

0081E006   .C700 00000000 mov dword ptr ds:,0x0               ; |

0081E00C   .E8 19010000   call <jmp.&user32.OpenClipboard>         ; \OpenClipboard //修正此处函数地址

0081E011   .85C0          test eax,eax

0081E013   .74 65         je short ZZZX.0081E07A

0081E015   .53            push ebx

0081E016   .55            push ebp

0081E017   .56            push esi

0081E018   .57            push edi

0081E019   .E8 00010000   call <jmp.&user32.EmptyClipboard>      ; [EmptyClipboard    //修正此处函数地址

0081E01E   .8B7424 1C   mov esi,dword ptr ss:

0081E022   .83C9 FF       or ecx,-0x1

0081E025   .33C0          xor eax,eax

0081E027   .8B3E          mov edi,dword ptr ds:

0081E029   .F2:AE         repne scas byte ptr es:

0081E02B   .F7D1          not ecx

0081E02D   .49            dec ecx

0081E02E   .8BE9          mov ebp,ecx

0081E030   .45            inc ebp

0081E031   .55            push ebp                                 ; /MemSize

0081E032   .6A 42         push 0x42                              ; |Flags = GHND

0081E034   .E8 03010000   call <jmp.&kernel32.GlobalAlloc>         ; \GlobalAlloc               //修正此处函数地址

0081E039   .8BD8          mov ebx,eax

0081E03B   .85DB          test ebx,ebx

0081E03D   .74 32         je short ZZZX.0081E071

0081E03F   .8B36          mov esi,dword ptr ds:

0081E041   .53            push ebx                                 ; /hMem

0081E042   .E8 FB000000   call <jmp.&kernel32.GlobalLock>          ; \GlobalLock               //修正此处函数地址

0081E047   .8BCD          mov ecx,ebp

0081E049   .8BF8          mov edi,eax

0081E04B   .8BD1          mov edx,ecx

0081E04D   .53            push ebx                                 ; /hMem

0081E04E   .C1E9 02       shr ecx,0x2                              ; |

0081E051   .F3:A5         rep movs dword ptr es:,dword ptr ds>; |

0081E053   .8BCA          mov ecx,edx                              ; |

0081E055   .83E1 03       and ecx,0x3                              ; |

0081E058   .F3:A4         rep movs byte ptr es:,byte ptr ds:[>; |

0081E05A   .E8 E9000000   call <jmp.&kernel32.GlobalUnlock>      ; \GlobalUnlock                   //修正此处函数地址

0081E05F   .53            push ebx                                 ; /hData

0081E060   .6A 01         push 0x1                                 ; |Format = CF_TEXT

0081E062   .E8 C9000000   call <jmp.&user32.SetClipboardData>      ; \SetClipboardData            //修正此处函数地址

0081E067   .8B4424 14   mov eax,dword ptr ss:

0081E06B   .C700 01000000 mov dword ptr ds:,0x1

0081E071   >E8 A2000000   call <jmp.&user32.CloseClipboard>      ; [CloseClipboard                  //修正此处函数地址

0081E076   .5F            pop edi

0081E077   .5E            pop esi

0081E078   .5D            pop ebp

0081E079   .5B            pop ebx

0081E07A   >C3            retn

---------------------------------------------------------------------------------------优雅分割线----------------------------------------------------------------------------------------------------

MARK_2:

0081E07B      90            nop

0081E07C/$8D4424 08   lea eax,dword ptr ss:

0081E080|.83EC 0C       sub esp,0xC

0081E083|.50            push eax

0081E084|.FF7424 14   push dword ptr ss:

0081E088|.33C0          xor eax,eax

0081E08A|.894424 08   mov dword ptr ss:,eax

0081E08E|.894424 0C   mov dword ptr ss:,eax

0081E092|.894424 10   mov dword ptr ss:,eax

0081E096|.8D5424 08   lea edx,dword ptr ss:

0081E09A|.52            push edx

0081E09B|.FFD3          call ebx                                                //EBX地址指向0081E000, MARK_1:            

0081E09D|.8B4424 0C   mov eax,dword ptr ss:

0081E0A1|.8B5424 10   mov edx,dword ptr ss:

0081E0A5|.8B4C24 14   mov ecx,dword ptr ss:

0081E0A9|.83C4 18       add esp,0x18

0081E0AC\.C3            retn

---------------------------------------------------------------------------------------优雅分割线----------------------------------------------------------------------------------------------------

MARK_3:

0081E0AD/$55            push ebp

0081E0AE|.8BEC          mov ebp,esp

0081E0B0|.68 04000080   push 0x80000004

0081E0B5|.6A 00         push 0x0

0081E0B7|.FF75 08       push

0081E0BA|.6A 01         push 0x1

0081E0BC|.BB 00E08100   mov ebx,ZZZX.0081E000                                             //修正此处地址指向 0081E000 也就是 MARK_1: 。

0081E0C1|.E8 B6FFFFFF   call ZZZX.0081E07C                                                   //修正此处地址指向 0081E07B   , CALL MARK_2:

0081E0C6|.C9            leave

0081E0C7\.C2 0400       retn 0x4

---------------------------------------------------------------------------------------优雅分割线----------------------------------------------------------------------------------------------------

硬件弹窗(MARK_4):

0081E0CA   >6A 00         push 0x0

0081E0CC   .6A 00         push 0x0

0081E0CE   .E8 3F000000   call <jmp.&VMProtectSDK32.VMProtectGetCu>                     //修正此处函数地址

0081E0D3   .83F8 00       cmp eax,0x0

0081E0D6   .74 1F         je short ZZZX.0081E0F7

0081E0D8   .A3 B0E48100   mov dword ptr ds:,eax                                              //此处内存指向零区,同时修正下面的常量也指向零区

0081E0DD   .FF35 B0E48100 push dword ptr ds:

0081E0E3   .68 33E38100   push ZZZX.0081E333                                                                  //修正此处地址批向零区,注意下面有三处是一样的VA此处标记为1
0081E0E8   .E8 25000000   call <jmp.&VMProtectSDK32.VMProtectGetCu>                        //修正此处函数地址

0081E0ED   .68 33E38100   push ZZZX.0081E333                                                                  //修正此处地址批向零区,注意下面有三处是一样的VA此处标记为2

0081E0F2   .E8 B6FFFFFF   call ZZZX.0081E0AD                                                                     //修正 地址调用 MARK_3:

0081E0F7   >6A 00         push 0x0                                 ; /Style = MB_OK|MB_APPLMODAL

0081E0F9   .68 66E68100   push ZZZX.0081E666                     ; |Title = "中国飘云阁"            //修正此处地址批向任意零区,弹窗标题内容,可以自定义

0081E0FE   .68 33E38100   push ZZZX.0081E333                     ; |Text = ""                              //修正此处地址批向零区,注意下面有三处是一样的VA此处标记为3

0081E103   .6A 00         push 0x0                                 ; |hOwner = NULL

0081E105   .E8 1A000000   call <jmp.&user32.MessageBoxA>         ; \MessageBoxA             //修正此处函数地址

0081E10A   .6A 00         push 0x0                                 ; /ExitCode = 0x0

0081E10C   .E8 25000000   call <jmp.&kernel32.ExitProcess>         ; \ExitProcess                  //修正此处函数地址

0081E111      CC            int3

0081E112   $- FF25 4C108200 jmp dword ptr ds:[<&VMProtectSDK32.VMPro>;VMProtec.VMProtectGetCurrentHWID   //修正此处函数地址

0081E118   $- FF25 E8868100 jmp dword ptr ds:[<&user32.CloseClipboar>;user32.CloseClipboard                                  //修正此处函数地址

0081E11E   $- FF25 8C868100 jmp dword ptr ds:[<&user32.EmptyClipboar>;user32.EmptyClipboard

0081E124   $- FF25 C4808100 jmp dword ptr ds:[<&user32.MessageBoxA>] ;user32.MessageBoxA                                 //修正此处函数地址

0081E12A   $- FF25 1C858100 jmp dword ptr ds:[<&user32.OpenClipboard>;user32.OpenClipboard                                  //修正此处函数地址

0081E130   $- FF25 CC848100 jmp dword ptr ds:[<&user32.SetClipboardD>;user32.SetClipboardData                              //修正此处函数地址

0081E136   .- FF25 7C808100 jmp dword ptr ds:[<&kernel32.ExitProcess>;kernel32.ExitProcess                                        //修正此处函数地址

0081E13C   $- FF25 C8818100 jmp dword ptr ds:[<&kernel32.GlobalAlloc>;kernel32.GlobalAlloc                                       //修正此处函数地址

0081E142   $- FF25 B8818100 jmp dword ptr ds:[<&kernel32.GlobalLock>>;kernel32.GlobalLock                                       //修正此处函数地址

0081E148   $- FF25 A8818100 jmp dword ptr ds:[<&kernel32.GlobalUnloc>;kernel32.GlobalUnlock                                       //修正此处函数地址
补充:取硬件码需要修复的位置太多了,修改了一下代码,实现自动修正内存地址注意:
不要随意调换代码顺序。检测授权的代码依旧就不重新编辑了。
下面这段代码写在新区段段首。做为第一段。
十六进制数据:8B 44 24 04 6A 00 C7 00 00 00 00 00 E8 AE 01 00 00 85 C0 74 65 53 55 56 57 E8 95 01 00 00 8B 74
24 1C 83 C9 FF 33 C0 8B 3E F2 AE F7 D1 49 8B E9 45 55 6A 42 E8 98 01 00 00 8B D8 85 DB 74 32 8B
36 53 E8 90 01 00 00 8B CD 8B F8 8B D1 53 C1 E9 02 F3 A5 8B CA 83 E1 03 F3 A4 E8 7E 01 00 00 53
6A 01 E8 5E 01 00 00 8B 44 24 14 C7 00 01 00 00 00 E8 37 01 00 00 5F 5E 5D 5B C3 90 8D 44 24 08
83 EC 0C 50 FF 74 24 14 33 C0 89 44 24 08 89 44 24 0C 89 44 24 10 8D 54 24 08 52 FF D3 8B 44 24
0C 8B 54 24 10 8B 4C 24 14 83 C4 18 C3 55 8B EC 68 04 00 00 80 6A 00 FF 75 08 6A 01 BB 00 E0 81
00 E8 B6 FF FF FF C9 C2 04 00 6A 00 6A 00 E8 D4 00 00 00 83 F8 00 0F 84 B0 00 00 00 60 9C 33 C9
43 41 83 3B 00 75 F9 81 F9 00 08 00 00 75 F1 E8 00 00 00 00 58 83 C0 7A 8D 8B 00 FF FF FF 89 08
83 C0 06 8D 8B 00 FF FF FF 89 08 83 C0 05 8D 8B 00 FE FF FF 89 08 83 C0 0A 8D 8B 00 FE FF FF 89
08 83 C0 11 8D 8B 00 FE FF FF 89 08 83 E8 05 8D 8B 00 FD FF FF 89 08 2D D2 00 00 00 8D 8B 24 F5
FF FF 89 08 05 1F 07 00 00 C7 00 D6 D0 B9 FA C7 40 04 C6 AE D4 C6 C7 40 08 B8 F3 A1 BE C7 40 0C
50 44 47 A1 C7 40 10 BF 00 00 00 9D 61 A3 CA C7 81 00 FF 35 CA C7 81 00 68 CA C6 81 00 E8 25 00
00 00 68 CA C6 81 00 E8 21 FF FF FF 6A 00 68 CA C5 81 00 68 CA C6 81 00 6A 00 E8 1A 00 00 00 6A
00 E8 25 00 00 00 CC FF 25 48 D0 81 00 FF 25 E8 76 5F 00 FF 25 8C 76 5F 00 FF 25 C4 70 5F 00 FF
25 1C 75 5F 00 FF 25 CC 74 5F 00 FF 25 7C 70 5F 00 FF 25 C8 71 5F 00 FF 25 B8 71 5F 00 FF 25 A8
71 5F 00
汇编代码如下:0081C000   .8B4424 04   mov eax,dword ptr ss:
0081C004   .6A 00         push 0x0                                 ; /hWnd = NULL
0081C006   .C700 00000000 mov dword ptr ds:,0x0               ; |
0081C00C   .E8 AE010000   call <jmp.&user32.OpenClipboard>         ; \OpenClipboard
0081C011   .85C0          test eax,eax
0081C013   .74 65         je short ZZZX添加.0081C07A
0081C015   .53            push ebx
0081C016   .55            push ebp
0081C017   .56            push esi
0081C018   .57            push edi
0081C019   .E8 95010000   call <jmp.&user32.EmptyClipboard>      ; [EmptyClipboard
0081C01E   .8B7424 1C   mov esi,dword ptr ss:
0081C022   .83C9 FF       or ecx,-0x1
0081C025   .33C0          xor eax,eax
0081C027   .8B3E          mov edi,dword ptr ds:
0081C029   .F2:AE         repne scas byte ptr es:
0081C02B   .F7D1          not ecx
0081C02D   .49            dec ecx
0081C02E   .8BE9          mov ebp,ecx
0081C030   .45            inc ebp
0081C031   .55            push ebp                                 ; /MemSize
0081C032   .6A 42         push 0x42                              ; |Flags = GHND
0081C034   .E8 98010000   call <jmp.&kernel32.GlobalAlloc>         ; \GlobalAlloc
0081C039   .8BD8          mov ebx,eax
0081C03B   .85DB          test ebx,ebx
0081C03D   .74 32         je short ZZZX添加.0081C071
0081C03F   .8B36          mov esi,dword ptr ds:
0081C041   .53            push ebx                                 ; /hMem
0081C042   .E8 90010000   call <jmp.&kernel32.GlobalLock>          ; \GlobalLock
0081C047   .8BCD          mov ecx,ebp
0081C049   .8BF8          mov edi,eax
0081C04B   .8BD1          mov edx,ecx
0081C04D   .53            push ebx                                 ; /hMem
0081C04E   .C1E9 02       shr ecx,0x2                              ; |
0081C051   .F3:A5         rep movs dword ptr es:,dword ptr ds>; |
0081C053   .8BCA          mov ecx,edx                              ; |
0081C055   .83E1 03       and ecx,0x3                              ; |
0081C058   .F3:A4         rep movs byte ptr es:,byte ptr ds:[>; |
0081C05A   .E8 7E010000   call <jmp.&kernel32.GlobalUnlock>      ; \GlobalUnlock
0081C05F   .53            push ebx                                 ; /hData
0081C060   .6A 01         push 0x1                                 ; |Format = CF_TEXT
0081C062   .E8 5E010000   call <jmp.&user32.SetClipboardData>      ; \SetClipboardData
0081C067   .8B4424 14   mov eax,dword ptr ss:
0081C06B   .C700 01000000 mov dword ptr ds:,0x1
0081C071   >E8 37010000   call <jmp.&user32.CloseClipboard>      ; [CloseClipboard
0081C076   .5F            pop edi
0081C077   .5E            pop esi
0081C078   .5D            pop ebp
0081C079   .5B            pop ebx
0081C07A   >C3            retn
0081C07B      90            nop
0081C07C/$8D4424 08   lea eax,dword ptr ss:
0081C080|.83EC 0C       sub esp,0xC
0081C083|.50            push eax
0081C084|.FF7424 14   push dword ptr ss:
0081C088|.33C0          xor eax,eax
0081C08A|.894424 08   mov dword ptr ss:,eax
0081C08E|.894424 0C   mov dword ptr ss:,eax
0081C092|.894424 10   mov dword ptr ss:,eax
0081C096|.8D5424 08   lea edx,dword ptr ss:
0081C09A|.52            push edx
0081C09B|.FFD3          call ebx
0081C09D|.8B4424 0C   mov eax,dword ptr ss:
0081C0A1|.8B5424 10   mov edx,dword ptr ss:
0081C0A5|.8B4C24 14   mov ecx,dword ptr ss:
0081C0A9|.83C4 18       add esp,0x18
0081C0AC\.C3            retn
0081C0AD/$55            push ebp
0081C0AE|.8BEC          mov ebp,esp
0081C0B0|.68 04000080   push 0x80000004
0081C0B5|.6A 00         push 0x0
0081C0B7|.FF75 08       push
0081C0BA|.6A 01         push 0x1
0081C0BC|.BB 00E08100   mov ebx,0x81E000
0081C0C1|.E8 B6FFFFFF   call ZZZX添加.0081C07C
0081C0C6|.C9            leave
0081C0C7\.C2 0400       retn 0x4
0081C0CA   >6A 00         push 0x0
0081C0CC   .6A 00         push 0x0
0081C0CE   .E8 D4000000   call <jmp.&VMProtectSDK32.VMProtectGetCu>
0081C0D3   .83F8 00       cmp eax,0x0
0081C0D6   .0F84 B0000000 je ZZZX添加.0081C18C
0081C0DC   .60            pushad                                                      //自动修正硬编码起始
0081C0DD   .9C            pushfd
0081C0DE   .33C9          xor ecx,ecx
0081C0E0   >43            inc ebx
0081C0E1   .41            inc ecx
0081C0E2   .833B 00       cmp dword ptr ds:,0x0
0081C0E5   .^ 75 F9         jnz short ZZZX添加.0081C0E0
0081C0E7   .81F9 00080000 cmp ecx,0x800
0081C0ED   .^ 75 F1         jnz short ZZZX添加.0081C0E0
0081C0EF   .E8 00000000   call ZZZX添加.0081C0F4
0081C0F4/$58            pop eax
0081C0F5|.83C0 7A       add eax,0x7A
0081C0F8|.8D8B 00FFFFFF lea ecx,dword ptr ds:
0081C0FE|.8908          mov dword ptr ds:,ecx
0081C100|.83C0 06       add eax,0x6
0081C103|.8D8B 00FFFFFF lea ecx,dword ptr ds:
0081C109|.8908          mov dword ptr ds:,ecx
0081C10B|.83C0 05       add eax,0x5
0081C10E|.8D8B 00FEFFFF lea ecx,dword ptr ds:
0081C114|.8908          mov dword ptr ds:,ecx
0081C116|.83C0 0A       add eax,0xA
0081C119|.8D8B 00FEFFFF lea ecx,dword ptr ds:
0081C11F|.8908          mov dword ptr ds:,ecx
0081C121|.83C0 11       add eax,0x11
0081C124|.8D8B 00FEFFFF lea ecx,dword ptr ds:
0081C12A|.8908          mov dword ptr ds:,ecx
0081C12C|.83E8 05       sub eax,0x5
0081C12F|.8D8B 00FDFFFF lea ecx,dword ptr ds:
0081C135|.8908          mov dword ptr ds:,ecx
0081C137|.2D D2000000   sub eax,0xD2
0081C13C|.8D8B 24F5FFFF lea ecx,dword ptr ds:
0081C142|.8908          mov dword ptr ds:,ecx
0081C144|.05 1F070000   add eax,0x71F
0081C149|.C700 D6D0B9FA mov dword ptr ds:,0xFAB9D0D6                              //自定义弹窗文字。
0081C14F|.C740 04 C6AED>mov dword ptr ds:,0xC6D4AEC6                      //自定义弹窗文字。
0081C156|.C740 08 B8F3A>mov dword ptr ds:,0xBEA1F3B8                     //自定义弹窗文字。
0081C15D|.C740 0C 50444>mov dword ptr ds:,0xA1474450                        //自定义弹窗文字。
0081C164|.C740 10 BF000>mov dword ptr ds:,0xBF                              //自定义弹窗文字。
0081C16B|.9D            popfd
0081C16C|.61            popad                                                                                  //自动修正硬编码结束
0081C16D|.A3 CAC78100   mov dword ptr ds:,eax
0081C172|.FF35 CAC78100 push dword ptr ds:
0081C178|.68 CAC68100   push ZZZX添加.0081C6CA
0081C17D|.E8 25000000   call <jmp.&VMProtectSDK32.VMProtectGetCu>
0081C182|.68 CAC68100   push ZZZX添加.0081C6CA
0081C187|.E8 21FFFFFF   call ZZZX添加.0081C0AD
0081C18C|>6A 00         push 0x0                                 ; /Style = MB_OK|MB_APPLMODAL
0081C18E|.68 CAC58100   push ZZZX添加.0081C5CA                     ; |Title = ""
0081C193|.68 CAC68100   push ZZZX添加.0081C6CA                     ; |Text = ""
0081C198|.6A 00         push 0x0                                 ; |hOwner = NULL
0081C19A|.E8 1A000000   call <jmp.&user32.MessageBoxA>         ; \MessageBoxA
0081C19F|.6A 00         push 0x0                                 ; /ExitCode = 0x0
0081C1A1\.E8 25000000   call <jmp.&kernel32.ExitProcess>         ; \ExitProcess
0081C1A6      CC            int3
0081C1A7   $- FF25 48D08100 jmp dword ptr ds:[<&VMProtectSDK32.VMPro>;VMProtec.VMProtectGetCurrentHWID
0081C1AD   $- FF25 E8765F00 jmp dword ptr ds:[<&user32.CloseClipboar>;user32.CloseClipboard
0081C1B3   $- FF25 8C765F00 jmp dword ptr ds:[<&user32.EmptyClipboar>;user32.EmptyClipboard
0081C1B9   $- FF25 C4705F00 jmp dword ptr ds:[<&user32.MessageBoxA>] ;user32.MessageBoxA
0081C1BF   $- FF25 1C755F00 jmp dword ptr ds:[<&user32.OpenClipboard>;user32.OpenClipboard
0081C1C5   $- FF25 CC745F00 jmp dword ptr ds:[<&user32.SetClipboardD>;user32.SetClipboardData
0081C1CB   .- FF25 7C705F00 jmp dword ptr ds:[<&kernel32.ExitProcess>;kernel32.ExitProcess
0081C1D1   $- FF25 C8715F00 jmp dword ptr ds:[<&kernel32.GlobalAlloc>;kernel32.GlobalAlloc
0081C1D7   $- FF25 B8715F00 jmp dword ptr ds:[<&kernel32.GlobalLock>>;kernel32.GlobalLock
0081C1DD   $- FF25 A8715F00 jmp dword ptr ds:[<&kernel32.GlobalUnloc>;kernel32.GlobalUnlock
可能有人会怀疑强度,虽然比不上源码编译的强度,但也差不了太多。前题是你会用VMP加壳。完整版附件及使用方法视频:
链接: https://pan.baidu.com/s/14PPsOH_dZm_qftI9aTQ27g 提取码: 7q4v

冷月孤心 发表于 2019-6-5 21:46

冥界3大法王 发表于 2019-3-15 08:33
@冷月孤心
这软件用过,生成一机一码貌似没有这功能吧?

你可以试试看

赫伦堡的鬼 发表于 2019-2-27 18:17

谢谢分享

跌宕起伏 发表于 2019-2-27 18:23

其实我没看懂标题

c00144 发表于 2019-2-27 19:01


谢谢分享

3683057 发表于 2019-2-27 21:49

谢谢分享

月光下の馨枫 发表于 2019-2-27 22:54

谢谢分享

冰海浮云 发表于 2019-2-28 07:48

感谢楼主分享!

wanghualina 发表于 2019-2-28 09:17

感谢楼主分享

云胡不喜di 发表于 2019-2-28 10:44

谢谢分享

markfinad 发表于 2019-2-28 16:14

感谢分享,学习学习!
页: [1] 2
查看完整版本: 无源码给软件添加VMP硬件授权【伪原创】