最近想用VMProtect和ASProtect 的SDK加密一个程序,结果搞了半天没搞成,网上没看到在VC中如何使用VMProtect的SDK加密,于是琢磨了一下,总算成功了,最后有一点点心得,与大家共享,免得还有人跟我一样走弯路。
其实VMProtect和ASProtect的SDK编程都差不多,都是在编程时在语句里面插入一个标记(Marker),然后在加壳时,加壳程序就会认出这些标记,并在有标记的地方进行保护。 我觉得这就是最基本的所谓加壳程序SDK编程吧。
1. VMProtect
新版的VMProtect没看到好用的,所以这里用的VMProtect v1.2。 (有新的好用的请说一声). 编译环境 VS.Net 2003. 主要参考了文章. VMProtect SDK+ASProtect SDK混合编程[代码演示] 作 者: Anskya 链 接: http://bbs.pediy.com/showthread.php?threadid=20317
1.1 保护内部函数
Delphi需要设置Map文件,那VS.Net 2003也需要设置一下,以便产生Map文件,使VMProtect能够识别内部函数,如果没Map文件,VMProtect只能识别导出函数,到时就要自己加函数的地址了.
VS.Net 2003中,打开 "项目 -> project1属性(假设项目名为project1) -> 链接器 -> 调试 -> 生成映射文件", 改成 "是(/MAP)",这样生成程序时会同时生成project1.map文件。 将project1.exe与project1.map 都拷贝到VMProtect程序夹,用VMProtect加密时,添加新的函数时能够列出很多内部函数,这时只需要选择想加密的内部函数就行了。 如果没Map,只有个输入函数地址的输入筐,没有内部函数列表。
这里可以省去有些朋友为了加密某个函数,还要用Ollydbg分析程序,找到函数入口地址,然后输入到VMProtect里面来保护的麻烦。
1.2 保护任意位置代码
在Anskya和那个俄国作者的主页上都只说了Delphi在程序中加入SDK标记。在Delphi 中的标记模式为:
asm db $EB,$10,'VMProtect begin',0 //标记开始处. end; //想保护的程序代码 asm db $EB,$0E,'VMProtect end',0 //标记结束处. end;
__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 }
#include "include\aspr.h" VOID Test { USER_POLYBUFFER // some code }
do { USER_POLYBUFFER // some code } while(); // some code
#include "include\aspr.h" MessageBox(0,"Begin","",0); #include "include\CppEnvelopeCheck.inc" //可以在任何位置插入这一句话. MessageBox(0,"End","",0);
BOOL EnvelopeCheck() //这个函数放在程序前面就行了。 { #include "include\CppEnvelopeCheckFunc.inc" } if ( !EnvelopeCheck() ) // .. 邪恶的事情
#include "include\aspr.h" #include "include\cppCrcBegin.inc" // some code #include "include\cppCrcEnd.inc"
#include "include\aspr.h" #include "include\cppCrcBegin.inc" // some code #include "include\cppCrcBegin.inc" // some code #include "include\cppCrcEnd.inc" // some code #include "include\cppCrcEnd.inc"
引用: #define VMPBEGIN \ __asm _emit 0xEB \ __asm _emit 0x10 \ __asm _emit 0x56 \ __asm _emit 0x4D \ __asm _emit 0x50 \ __asm _emit 0x72 \ __asm _emit 0x6F \ __asm _emit 0x74 \ __asm _emit 0x65 \ __asm _emit 0x63 \ __asm _emit 0x74 \ __asm _emit 0x20 \ __asm _emit 0x62 \ __asm _emit 0x65 \ __asm _emit 0x67 \ __asm _emit 0x69 \ __asm _emit 0x6E \ __asm _emit 0x00 #define VMPEND \ __asm _emit 0xEB \ __asm _emit 0x0E \ __asm _emit 0x56 \ __asm _emit 0x4D \ __asm _emit 0x50 \ __asm _emit 0x72 \ __asm _emit 0x6F \ __asm _emit 0x74 \ __asm _emit 0x65 \ __asm _emit 0x63 \ __asm _emit 0x74 \ __asm _emit 0x20 \ __asm _emit 0x65 \ __asm _emit 0x6E \ __asm _emit 0x64 \ __asm _emit 0x00
VMPBEGIN //需要加密的代码片断 VMPEND