彩票走势图

VMProtect SDK加壳方法汇总

原创|其它|编辑:郝浩|2012-11-06 16:47:33.000|阅读 6325 次

概述:为了保护自己的软件不轻易被他人“借鉴”,有必要对软件进行一些加密保护,而这方面目前己有成熟的专业加密软件可选择。但不要太依赖壳的保护,大多数壳是可以被攻破的,还是在自身保护上下些功夫。加密软件比较多,VMProtect v2.12就是其中的佼佼者。

# 慧都年终大促·界面/图表报表/文档/IDE等千款热门软控件火热促销中 >>

代码保护利器VMProtect在线订购315特惠,个人授权专享折扣立即购买>>

所谓的VMProtect的SDK使用就是在编程时在语句里面插入一个标记(Marker),然后在加壳时,加壳程序就会认出这些标记,并在有标记的地方进行保护。接下来就向大家介绍最基本的加壳程序SDK编程。

编译环境

对于新版VMProtect,VMPsoft公司已经发布了新的版本VMProtect v2.12下面是试用版的下载链接:VMProtect v2.12

编译环境 VS。

使用VMProtect的SDK加密

  • 保护内部函数

Delphi需要设置Map文件,那VS也需要设置一下,以便产生Map文件,使VMProtect能够识别内部函数,如果没Map文件,VMProtect只能识别导出函数,到时就要自己加函数的地址了. VS中,打开 "项目 ->; project1属性(假设项目名为project1) -> 链接器 -> 调试 -> 生成映射文件", 改成 "是(/MAP)",这样生成程序时会同时生成project1.map文件。  将project1.exe与project1.map 都拷贝到VMProtect程序夹,用VMProtect加密时,添加新的函数时能够列出很多内部函数,这时只需要选择想加密的内部函数就行了。  如果没Map,只有个输入函数地址的输入筐,没有内部函数列表。

  • 保护任意位置代码

在Delphi 中的标记模式代码为:

 

asm 
db $EB,$10,'VMProtect begin',0 //标记开始处.
end;
//想保护的程序代码
asm
db $EB,$0E,'VMProtect end',0 //标记结束处.
end;

在Delphi中可以直接用这种类似MASM的汇编语言,比较方便,但是在VC中不支持 db 语句,只支持插入单个字节的 _emit 语句。 我琢磨出了一个比较麻烦的方法,就是全部插入16进制字节码,不晓得还有更好的方法没。此方法学自ASProtect的sdk例子里面的aspr.h。 
在VC中的标记模式为:

 

__asm    //标记开始处.
     {  
       _emit 0xEB
       _emit 0x10  //jmp 0x10
       _emit 0x56  //ascii "VMProtect begin",0
       _emit 0x4D  
       _emit 0x50 
       _emit 0x72 
       _emit 0x6F 
       _emit 0x74 
       _emit 0x65 
       _emit 0x63 
       _emit 0x74 
       _emit 0x20 
       _emit 0x62 
       _emit 0x65 
       _emit 0x67 
       _emit 0x69 
       _emit 0x6E 
       _emit 0x00
     }
     //想保护的程序代码
     __asm  //标记结束处.
     {  
       _emit 0xEB
       _emit 0x0E   //jmp 0x0e
       _emit 0x56   //ascii "VMProtect end",0
       _emit 0x4D   
       _emit 0x50 
       _emit 0x72 
       _emit 0x6F 
       _emit 0x74 
       _emit 0x65 
       _emit 0x63 
       _emit 0x74 
       _emit 0x20 
       _emit 0x65 
       _emit 0x6E 
       _emit 0x64 
       _emit 0x00
     } 

将这一对标记插入到任何想保护的程序代码处就行了。 这种方法能够深入函数内部,精确的保护想要保护的某一段代码。在插入成功后,你可以在VMProtect加壳时选择内部函数的地方找到这种函数 "VMProtectMarker1", 这就是使用了标记的地方,有多处保护的话这些函数数字会递增,如 VMProtectMarker2, VMProtectMarker3 等. 记得选上这些函数再进行保护。

VMProtect的SDK标志如果用得多的话最好define一下,精简一点。 如下:

有了上面的define,在需要加密的地方只需要两句话就行了,可以到处多插一点:

代码:

 

VMPBEGIN
待加密的代码段
VMPEND

 

然后用向导模式打开加了标签的程序,这样会显示要加密的段,选中加密段加密就行了。具体方法如下:

VMProtect配合PESpin的SDK加密

(在工程编译选项中:Project->Options->Linker 选项卡中的 Map File 选项中,将单选框选择Detailed,然后在VMProtect添加保护代码中会看到函数地址)配合PESpin的SDK实施保护。

方法过程如下:

  1. 使用delphi打开Project1.DPR文件,然后点击delphi的Project菜单下的Options...选项,在弹出的对话窗口中点击Linker页面,在该页面中选择Map file下的Detailed这一项,以便打开同时生成完全MAP文件的这一功能,因为在VMProtect中要使用MAP文件与对应的eXe文件做比较,以方便VMProtect对其进行加密。
  2. 完成上面的操作后,便按F9键进行编译,在目录下便生成了eXe及Map文件;使用DeDe对该eXe文件进行反汇编。
  3. 用VMProtect打开生成的这个eXe文件后,点击“Project”菜单下的“New procedure”或者是 点击工具栏中的“New procedure”按钮,在弹出的添加地址窗口中
    找到:TForm1.Button1Click 这一行,然后点击“OK”按钮,
    找到:TForm1.FormCreate   这一行,然后点击“OK”按钮,
    找到:TForm1.Image1Click  这一行,然后点击“OK”按钮,
    在VMProtect左边的窗口中便会列出以这三处为开始地址,可以被VMProtect保护的这三段相关代码有哪些。
  4. 在VMProtect中,点击左边窗口中的 TForm1.FormCreate 这一行后,配合DeDe对eXe文件的反汇编,看到其相应的代码和虚拟地址为:

     

    00443A04   EB24                   jmp     00443A2A       //这个JMP命令的机器码 EB24 便是
    00443A06   FB                     sti                    //PESpin的 Crypt markers 的 SDK {$I clear_start.inc}
    00443A07   FB                     sti                    //的开始标志
    00443A08   FB                     sti                    //
    00443A09   FB                     sti                    //
    00443A0A   FB                     sti                    //
    00443A0B   FB                     sti                    //
    00443A0C   FB                     sti                    //
    00443A0D   FB                     sti                    //
    00443A0E   FB                     sti                    //
    00443A0F   FB                     sti                    //
    00443A10   FB                     sti                    //
    00443A11   FB                     sti                    //
    00443A12   FB                     sti                    //
    00443A13   FB                     sti                    //
    00443A14   FB                     sti                    //
    00443A15   FB                     sti                    //
    00443A16   FB                     sti                    //
    00443A17   FB                     sti                    //
    00443A18   FB                     sti                    //
    00443A19   FB                     sti                    //
    00443A1A   FB                     sti                    //
    00443A1B   FB                     sti                    //
    00443A1C   FB                     sti                    //
    00443A1D   FB                     sti                    //
    00443A1E   FB                     sti                    //
    00443A1F   FB                     sti                    //
    00443A20   FB                     sti                    //
    00443A21   FB                     sti                    //
    00443A22   FB                     sti                    //
    00443A23   FB                     sti                    //
    00443A24   FB                     sti                    //
    00443A25   FB                     sti                    //PESpin的 Crypt markers 的 SDK {$I clear_start.inc}
    00443A26   66BD0000               mov     bp, $0000      //的结束标志
    
    * Possible String Reference to: 'PESpin Markers Test'
    |
    00443A2A   BA743A4400             mov     edx, $00443A74       //× 准备在此处 ×开始× VMProtect的保护 ×//详见【4A】
    
    * Reference to: controls.TControl.SetText(TControl;TCaption);
    |
    00443A2F   E89C02FEFF             call    00423CD0             //× 准备在此处 ×结束× VMProtect的保护 ×//详见【4B】
    00443A34   EB33                   jmp     00443A69       //这个JMP命令的机器码 EB33 便是
    00443A36   FA                     cli                    //PESpin的 Crypt markers 的 SDK {$I clear_end.inc}
    00443A37   FA                     cli                    //的开始标志
    00443A38   FA                     cli                    //
    00443A39   FA                     cli                    //
    00443A3A   FA                     cli                    //
    00443A3B   FA                     cli                    //
    00443A3C   FA                     cli                    //
    00443A3D   FA                     cli                    //
    00443A3E   FA                     cli                    //
    00443A3F   FA                     cli                    //
    00443A40   FA                     cli                    //
    00443A41   FA                     cli                    //
    00443A42   FA                     cli                    //
    00443A43   FA                     cli                    //
    00443A44   FA                     cli                    //
    00443A45   FA                     cli                    //
    00443A46   FA                     cli                    //
    00443A47   FA                     cli                    //
    00443A48   FA                     cli                    //
    00443A49   FA                     cli                    //
    00443A4A   FA                     cli                    //
    00443A4B   FA                     cli                    //
    00443A4C   FA                     cli                    //
    00443A4D   FA                     cli                    //
    00443A4E   FA                     cli                    //
    00443A4F   FA                     cli                    //
    00443A50   FA                     cli                    //
    00443A51   FA                     cli                    //
    00443A52   FA                     cli                    //
    00443A53   FA                     cli                    //
    00443A54   FA                     cli                    //
    00443A55   FA                     cli                    //
    00443A56   FA                     cli                    //
    00443A57   FA                     cli                    //
    00443A58   FA                     cli                    //
    00443A59   FA                     cli                    //
    00443A5A   FA                     cli                    //
    00443A5B   FA                     cli                    //
    00443A5C   FA                     cli                    //
    00443A5D   FA                     cli                    //
    00443A5E   FA                     cli                    //
    00443A5F   FA                     cli                    //
    00443A60   FA                     cli                    //
    00443A61   FA                     cli                    //
    00443A62   FA                     cli                    //
    00443A63   FA                     cli                    //
    00443A64   FA                     cli                    //PESpin的 Crypt markers 的 SDK {$I clear_end.inc}
    00443A65   66BD0000               mov     bp, $0000      //的结束标志
    00443A69   C3                     ret
    • 点击“Project”菜单下的“New procedure”或者是点击工具栏中的“New procedure”按钮,在弹出的添加地址窗口中输入 00443A2A 后,点击“OK”按钮,VMProtect便又会自动列出虚拟地址:00443A2A 后面的代码;
    • 在操作了【4A】之后,VMProtect左边窗口中便多了一个以 00443A2A 这处为开始地址,可以被VMProtect保护的这段相关代码有哪些。点击这行后又发现,在列出的可被保护代码中,虚拟地址:00443A34 这一行的代码并不想被VMProtect保护;因此,在右边窗口列出的可被保护代码中,找到并选定:“00443A34   EB33                   jmp     00443A69” 这一行,单击鼠标右键,在弹出的菜单中选择:“End of procedure”或是 按:Ctrl+B 键; 这时虚拟地址:00443A34 以及它后面的代码都变成了灰色; 表示这些灰色代码不再被VMProtect保护;因此,TForm1.FormCreate 事件被分成了三块,其中,中间将要被PeSpin的SDK所保护的这一块,先被VMProtect保护了。
  5. 在VMProtect中点击左边窗口中的 TForm1.Button1Click 这一行后,配合DeDe对eXe文件的反汇编,看到其相应的代码和虚拟地址为:

     

    00443A88   55                     push    ebp
    00443A89   8BEC                   mov     ebp, esp
    00443A8B   6A00                   push    $00
    00443A8D   6A00                   push    $00
    00443A8F   6A00                   push    $00
    00443A91   53                     push    ebx
    00443A92   56                     push    esi
    00443A93   57                     push    edi
    00443A94   8BF8                   mov     edi, eax
    00443A96   33C0                   xor     eax, eax
    00443A98   55                     push    ebp
    
    * Possible String Reference to: '殪鼷腚_^[嬪]?
    |
    00443A99   68873B4400             push    $00443B87
    
    ***** TRY
    |
    00443A9E   64FF30                 push    dword ptr fs:[eax]
    00443AA1   648920                 mov     fs:[eax], esp
    00443AA4   8D55FC                 lea     edx, [ebp-$04]
    00443AA7   8B87D4020000           mov     eax, [edi+$02D4]
    
    * Reference to: controls.TControl.GetText(TControl):TCaption;
    |
    00443AAD   E8EE01FEFF             call    00423CA0
    00443AB2   8B45FC                 mov     eax, [ebp-$04]
    
    * Reference to: system.@LStrLen:Integer;
    |           or: system.@DynArrayLength;
    |           or: system.DynArraySize(Pointer):Integer;
    |
    00443AB5   E8A600FCFF             call    00403B60
    00443ABA   85C0                   test    eax, eax
    00443ABC   0F84AA000000           jz      00443B6C
    00443AC2   EB08                   jmp     00443ACC  //这个JMP命令的机器码 EB08 便是
    00443AC4   FC                     cld               //PESpin的 Crypt markers 的 SDK {$I crypt_start.inc} 
    00443AC5   FC                     cld               //的开始标志
    00443AC6   FC                     cld               //
    00443AC7   FC                     cld               //
    00443AC8   FC                     cld               //
    00443AC9   FC                     cld               //
    00443ACA   27                     daa               //PESpin的 Crypt markers 的 SDK {$I crypt_start.inc} 
    00443ACB   54                     push    esp       //的结束标志
    00443ACC   33DB                   xor     ebx, ebx        //× 准备在此处 ×开始× VMProtect的保护 ×//详见【5A】
    00443ACE   33F6                   xor     esi, esi
    00443AD0   43                     inc     ebx
    00443AD1   8D55F8                 lea     edx, [ebp-$08]
    00443AD4   8B87D4020000           mov     eax, [edi+$02D4]
    
    * Reference to: controls.TControl.GetText(TControl):TCaption;
    |
    00443ADA   E8C101FEFF             call    00423CA0
    00443ADF   8B45F8                 mov     eax, [ebp-$08]
    00443AE2   0FB64418FF             movzx   eax, byte ptr [eax+ebx-$01]
    00443AE7   03F0                   add     esi, eax
    00443AE9   8D55F4                 lea     edx, [ebp-$0C]
    00443AEC   8B87D4020000           mov     eax, [edi+$02D4]
    
    * Reference to: controls.TControl.GetText(TControl):TCaption;
    |
    00443AF2   E8A901FEFF             call    00423CA0
    00443AF7   8B45F4                 mov     eax, [ebp-$0C]
    
    * Reference to: system.@LStrLen:Integer;
    |           or: system.@DynArrayLength;
    |           or: system.DynArraySize(Pointer):Integer;
    |
    00443AFA   E86100FCFF             call    00403B60
    00443AFF   3BD8                   cmp     ebx, eax
    00443B01   7CCD                   jl      00443AD0
    00443B03   83EE43                 sub     esi, +$43
    00443B06   83C610                 add     esi, +$10
    00443B09   81F69A020000           xor     esi, $0000029A
    00443B0F   81F609030000           xor     esi, $00000309
    00443B15   C1E602                 shl     esi, $02
    00443B18   33DB                   xor     ebx, ebx
    00443B1A   43                     inc     ebx
    00443B1B   8BC3                   mov     eax, ebx
    00443B1D   03C0                   add     eax, eax
    00443B1F   33C3                   xor     eax, ebx
    00443B21   F7EE                   imul    esi 
    00443B23   8BF0                   mov     esi, eax
    00443B25   83FB06                 cmp     ebx, +$06
    00443B28   7CF0                   jl      00443B1A        //× 准备在此处 ×结束× VMProtect的保护 ×//详见【5B】
    00443B2A   EB08                   jmp     00443B34  //这个JMP命令的机器码 EB08 便是
    00443B2C   FD                     std               //PESpin的 Crypt markers 的 SDK {$I crypt_end.inc}
    00443B2D   FD                     std               //的开始标志
    00443B2E   FD                     std               //
    00443B2F   FD                     std               //
    00443B30   FD                     std               //
    00443B31   FD                     std               //
    00443B32   54                     push    esp       //PESpin的 Crypt markers 的 SDK {$I crypt_end.inc}
    00443B33   37                     aaa               //的结束标志
    00443B34   81FEC0884904           cmp     esi, $044988C0
    00443B3A   7408                   jz      00443B44
    00443B3C   81FEC0884904           cmp     esi, $044988C0
    00443B42   7515                   jnz     00443B59
    00443B44   6A00                   push    $00
    
    * Possible String Reference to: 'Example Markers'
    |
    00443B46   68983B4400             push    $00443B98
    
    * Possible String Reference to: 'Good pass :D'
    |
    00443B4B   68A83B4400             push    $00443BA8
    00443B50   6A00                   push    $00
    
    * Reference to: user32.MessageBoxA()
    |
    00443B52   E8192BFCFF             call    00406670
    00443B57   EB13                   jmp     00443B6C
    00443B59   6A00                   push    $00
    
    * Possible String Reference to: 'Example Markers'
    |
    00443B5B   68983B4400             push    $00443B98
    
    * Possible String Reference to: 'Bad password. Try: PESpin'
    |
    00443B60   68B83B4400             push    $00443BB8
    00443B65   6A00                   push    $00
    
    * Reference to: user32.MessageBoxA()
    |
    00443B67   E8042BFCFF             call    00406670
    00443B6C   33C0                   xor     eax, eax
    00443B6E   5A                     pop     edx
    00443B6F   59                     pop     ecx
    00443B70   59                     pop     ecx
    00443B71   648910                 mov     fs:[eax], edx
    
    ****** FINALLY
    |
    
    * Possible String Reference to: '_^[嬪]?
    |
    00443B74   688E3B4400             push    $00443B8E
    00443B79   8D45F4                 lea     eax, [ebp-$0C]
    00443B7C   BA03000000             mov     edx, $00000003
    
    * Reference to: system.@LStrArrayClr;
    |
    00443B81   E87EFDFBFF             call    00403904
    00443B86   C3                     ret
    
    
    * Reference to: system.@HandleFinally;
    |
    00443B87   E9ECF7FBFF             jmp     00403378
    00443B8C   EBEB                   jmp     00443B79
    
    ****** END
    |
    00443B8E   5F                     pop     edi
    00443B8F   5E                     pop     esi
    00443B90   5B                     pop     ebx
    00443B91   8BE5                   mov     esp, ebp
    00443B93   5D                     pop     ebp
    00443B94   C3                     ret
    • 点击“Project”菜单下的“New procedure”或者是点击工具栏中的“New procedure”按钮,在弹出的添加地址窗口中输入 00443ACC 后,点击“OK”按钮,VMProtect便又会自动列出虚拟地址:00443ACC 后面的代码;
    • 在操作了【5A】之后,VMProtect左边窗口中便多了一个以 00443ACC 这处为开始地址,可以被VMProtect保护的这段相关代码有哪些。点击这行后又发现,在列出的可被保护代码中,虚拟地址:00443B2A 这一行及后面的代码并不想被VMProtect保护;因此,在右边窗口列出的可被保护代码中,找到并选定:“00443B2A EB08 jmp 00443B34” 这一行,单击鼠标右键,在弹出的菜单中选择:“End of procedure”或是 按:Ctrl+B 键; 这时虚拟地址:00443B2A 以及它后面的代码都变成了灰色; 表示这些灰色代码不再被VMProtect保护;
  6. 在VMProtect中点击左边窗口中的 TForm1.Image1Click 这一行后,配合DeDe对eXe文件的反汇编,看到其相应的代码和虚拟地址为:

     

    00443BD4 53 push ebx
    00443BD5 8BD8 mov ebx, eax
    00443BD7 EB08 jmp 00443BE1 //这个JMP命令的机器码 EB08 便是
    00443BD9 FC cld //PESpin的 Crypt markers 的 SDK {$I crypt_start.inc} 
    00443BDA FC cld //的开始标志
    00443BDB FC cld //
    00443BDC FC cld //
    00443BDD FC cld //
    00443BDE FC cld //
    00443BDF 27 daa //PESpin的 Crypt markers 的 SDK {$I crypt_start.inc}
    00443BE0 54 push esp //的结束标志
    00443BE1 6A00 push $00 //× 准备在此处 ×开始× VMProtect的保护 ×//详见【6A】
    
    * Possible String Reference to: 'Example Markers...'
    |
    00443BE3 68083C4400 push $00443C08
    
    * Possible String Reference to: 'Example in Delphi by reywen^htb'
    |
    00443BE8 681C3C4400 push $00443C1C
    00443BED 8BC3 mov eax, ebx
    
    * Reference to: controls.TWinControl.GetHandle(TWinControl):HWND;
    |
    00443BEF E87C61FEFF call 00429D70
    00443BF4 50 push eax
    
    * Reference to: user32.MessageBoxA()
    |
    00443BF5 E8762AFCFF call 00406670 //× 准备在此处 ×结束× VMProtect的保护 ×//详见【6B】
    00443BFA EB08 jmp 00443C04 //这个JMP命令的机器码 EB08 便是
    00443BFC FD std //PESpin的 Crypt markers 的 SDK {$I crypt_end.inc}
    00443BFD FD std //的开始标志
    00443BFE FD std //
    00443BFF FD std //
    00443C00 FD std //
    00443C01 FD std //
    00443C02 54 push esp //PESpin的 Crypt markers 的 SDK {$I crypt_end.inc}
    00443C03 37 aaa //的结束标志
    00443C04 5B pop ebx
    00443C05 C3 ret
    • 点击“Project”菜单下的“New procedure”或者是点击工具栏中的“New procedure”按钮,在弹出的添加地址窗口中输入 00443BE1 后,点击“OK”按钮,VMProtect便又会自动列出虚拟地址:00443BE1 后面的代码;
    • 在操作了【6A】之后,VMProtect左边窗口中便多了一个以 00443BE1 这处为开始地址,可以被VMProtect保护的这段相关代码有哪些。点击这行后又发现,在列出的可被保护代码中,虚拟地址:00443BFA 这一行的代码并不想被VMProtect保护;因此,在右边窗口列出的可被保护代码中,找到并选定:“00443BFA EB08 jmp 00443C04” 这一行,单击鼠标右键,在弹出的菜单中选择:“End of procedure”或是 按:Ctrl+B 键;这时虚拟地址:00443BFA 以及它后面的代码都变成了灰色; 表示这些灰色代码不再被VMProtect保护;
  7. 然后在VMProtect的“Options”窗口中设置相应的选项,最后点击工具栏中的“Compilation (F9)”按钮,便可!
  8. 再用PESpin打开被VMProtect保护了的eXe文件,对该eXe文件进行加密,即可!

 

 

代码保护利器VMProtect在线订购315特惠,个人授权专享折扣立即购买>>


标签:

本站文章除注明转载外,均为本站原创或翻译。欢迎任何形式的转载,但请务必注明出处、不得修改原文相关链接,如果存在内容上的异议请邮件反馈至chenjj@pclwef.cn


为你推荐

  • 推荐视频
  • 推荐活动
  • 推荐产品
  • 推荐文章
  • 慧都慧问
扫码咨询


添加微信 立即咨询

电话咨询

客服热线
023-68661681

TOP