最近想用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 中的标记模式为:
代码:

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

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

  1. __asm    //标记开始处.
  2. {
  3. _emit 0xEB
  4. _emit 0x10  //jmp 0x10
  5. _emit 0x56  //ascii "VMProtect begin",0
  6. _emit 0x4D
  7. _emit 0x50
  8. _emit 0x72
  9. _emit 0x6F
  10. _emit 0x74
  11. _emit 0x65
  12. _emit 0x63
  13. _emit 0x74
  14. _emit 0x20
  15. _emit 0x62
  16. _emit 0x65
  17. _emit 0x67
  18. _emit 0x69
  19. _emit 0x6E
  20. _emit 0x00
  21. }
  22. //想保护的程序代码
  23. __asm  //标记结束处.
  24. {
  25. _emit 0xEB
  26. _emit 0x0E   //jmp 0x0e
  27. _emit 0x56   //ascii "VMProtect end",0
  28. _emit 0x4D
  29. _emit 0x50
  30. _emit 0x72
  31. _emit 0x6F
  32. _emit 0x74
  33. _emit 0x65
  34. _emit 0x63
  35. _emit 0x74
  36. _emit 0x20
  37. _emit 0x65
  38. _emit 0x6E
  39. _emit 0x64
  40. _emit 0x00
  41. }

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

2. ASProtect
   
ASProtect的sdk编程相对来说比较好学,因为它带了一个很详细的说明文件ASProtect.chm。这里我相当于翻译了一下这个文件的一部分。我使用的
ASProtect SKE 2.2 Release build 0425
这个版本,安装后不但有说明文档,还有不少例子,其实看这些例子就能学会了,很简单.
    
    2.1 怎么使用 ASProtect 标记  
    最近版本的ASProtect 支持在以下编程语言中的使用标记: Delphi, C/C++ 和 Visual Basic. 需要注意的是这些标记宏不能支持.NET语言和用PCode模式编译的Visual Basic.  
限制:
   为了成功的将ASProtect标记插入到你的程序中,需要满足以下几个条件:
 § 多态变形标记(Polymorphic) 不能位于循环语句内,如 for, do while 等,  
 § CRC检查标记不能嵌套, 即不能在CRC标记内部又放一个CRC标记,   
 § 位于registered sections(注册区段) 和CRC检查标记内的代码至少需要5个字节大小.  
 
 C/C++ 形式的标记是通过 include(*.h or *.inc files) 文件夹来定义的,并在编译后将会体现为一些特殊序列的汇编代码,这些汇编代码将会在加壳时被ASProtect自动侦测到.  
 你可以在ASProtect的安装文件夹内找到怎么使用标记的例子.

2.2  多态变形标记(Polymorphic Markers)
    可以用多态变形标记保护程序内任意位置的代码. 为了使用多态变形标记, 需要在你想保护的函数内部的任意位置插入一个变形标记实例。
例如:在函数内代码的顶部放置多态变形标记。 从这个标记到函数结尾的所有代码片断都将被抹去,并被替换为多态变形模拟体。 ASProtect
用仿真方式来改变这个函数的内容(如入口点保护), 所以将不可能恢复甚至于理解原来程序的工作原理。
    为了使用新的代码片段保护,你需要插入新型的标记,如下所示:
代码:

  1. #include "include\aspr.h"
  2. VOID Test
  3. {
  4. USER_POLYBUFFER
  5. // some code
  6. }

注意!   为了避开那些在多态变形标记前改变程序逻辑的操作符,这个版本不支持在循环语句内使用标记,所以,请将这些标记放在循环体外面,不要使用类似下面的代码:  
代码:

  1. do {
  2. USER_POLYBUFFER
  3. // some code
  4. } while();
  5. // some code

2.3  外壳完整性检查(Envelope Checks)
   ASProtect直接将程序包裹在一个安全外壳内保护起来,这外壳包含所有的保护选项。所以检查这个外壳是否存在或者检查这外壳是否有被试图手动移除,对于保护程序非常重要。 为了使用外壳检查,需要插入两种外壳检查标记中的任一种,如下所示:
    方式 1 - 如果ASProtect外壳被移除,它将会产生一个异常,你可以处理这个异常并在此时做一些邪恶的事情。 @-@
代码:

  1. #include "include\aspr.h"
  2. MessageBox(0,"Begin","",0);
  3. #include "include\CppEnvelopeCheck.inc"  //可以在任何位置插入这一句话.
  4. MessageBox(0,"End","",0);

方式 2 - 如果ASProtect外壳被移除,这种方式将会像函数一样工作,返回一个false值。如果是false你可以做一些邪恶的事情。
代码:

  1. BOOL EnvelopeCheck()   //这个函数放在程序前面就行了。
  2. {
  3. #include "include\CppEnvelopeCheckFunc.inc"
  4. }
  5. if ( !EnvelopeCheck() ) // .. 邪恶的事情

2.4 CRC 检查
   这一章只应用于可执行程序。 代码区段的CRC检查对于对抗加载程序(loaders)非常有效。所以如果你想设定一些额外的代码片段的CRC检查,只需要在代码片段的开头与结尾放置CRC检查的标记,如下所示:
代码:

  1. #include "include\aspr.h"
  2. #include "include\cppCrcBegin.inc"
  3. // some code
  4. #include "include\cppCrcEnd.inc"

注意! 这个版本不支持嵌套的标记,所以不要使用下面的代码方式:  
代码:

  1. #include "include\aspr.h"
  2. #include "include\cppCrcBegin.inc"
  3. // some code
  4. #include "include\cppCrcBegin.inc"
  5. // some code
  6. #include "include\cppCrcEnd.inc"
  7. // some code
  8. #include "include\cppCrcEnd.inc"

还有各种注册,过期时间的加密方式需要用到ASProtect的API方式,在那个帮助文档里面都有,想用的就看看吧,这部分我还没用到,所以没翻译了。以上的程序编译好后,用ASProtect加壳会自动识别标记,在加壳过程中可以看到提示。

以上的SDK加密方式掌握后,就可以将ASProtect与VMProtect 随便乱混合加密了(先用VMProtect,再用ASProtect),加密的强度应该蛮高的吧。 不过最好能让你的程序能运行。
值得注意的是有些标记完全由字节码组成,加壳时有可能某个标记被其他标记的保护破坏了就会出问题。 所以同一个代码片断不要用很多标记一起搞,这些都要试验的。
还有,有时候SDK编程出来的可执行文件不能直接运行,加过壳后才能运行。

补充:前面的VMProtect的SDK标志如果用得不多还好,用得多的话最好define一下,精简一点。 如下:

引用:

  1. #define  VMPBEGIN __asm\
  2. {                   \
  3. __asm _emit 0xEB \
  4. __asm _emit 0x10 \
  5. __asm _emit 0x56 \
  6. __asm _emit 0x4D \
  7. __asm _emit 0x50 \
  8. __asm _emit 0x72 \
  9. __asm _emit 0x6F \
  10. __asm _emit 0x74 \
  11. __asm _emit 0x65 \
  12. __asm _emit 0x63 \
  13. __asm _emit 0x74 \
  14. __asm _emit 0x20 \
  15. __asm _emit 0x62 \
  16. __asm _emit 0x65 \
  17. __asm _emit 0x67 \
  18. __asm _emit 0x69 \
  19. __asm _emit 0x6E \
  20. __asm _emit 0x00\
  21. }
  22. #define  VMPEND __asm\
  23. {                   \
  24. __asm _emit 0xEB \
  25. __asm _emit 0x0E \
  26. __asm _emit 0x56 \
  27. __asm _emit 0x4D \
  28. __asm _emit 0x50 \
  29. __asm _emit 0x72 \
  30. __asm _emit 0x6F \
  31. __asm _emit 0x74 \
  32. __asm _emit 0x65 \
  33. __asm _emit 0x63 \
  34. __asm _emit 0x74 \
  35. __asm _emit 0x20 \
  36. __asm _emit 0x65 \
  37. __asm _emit 0x6E \
  38. __asm _emit 0x64 \
  39. __asm _emit 0x00 \
  40. }

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

代码:

  1. VMPBEGIN
  2. //需要加密的代码片断
  3. VMPEND

VMProtect选项介绍

其中各项的解释:(具体参见使用说明,这里只做粗略的解释)

(1)内存保护:检测实体的完整性,如果运行时发现不完整,将停止运行
(2)输入表保护:这个选项将把程序中使用的API隐藏起来。
(3)压缩输出文件:如果只是用VMProtect进行保护,可以将这项勾选,如果还会使用ASProtect进行保护,可以将这项去掉。(注意:如果ASProtect和  VMProtect一同使用,先使用VMProtect在使用ASProtect保护)
(4)检测调试器:这个选项将组织调试器对程序的监控,在进入保护段的程序时,如果检测到调试器将显示信息并结束程序运行
(5)虚拟工具:当程序运行在虚拟环境总是,将显示ixnxi并结束程序运行
(6)VM区段,是在用PE Explore查看资源时的显示,将默认的“.vmp”更改为“.upx”是为了迷惑一下使用的保护工具。
(7)调试模式:在VMProtect执行保护程序的编译时,会检查程序中保护段的添加是够正确,如果存在问题,会给出提示。
(8)检查虚拟机对象:在程序运行时,将检测虚拟区段表的完整性和VMProtect的插入点,的完整性,如果不完整也不会给出提示,但是会将程序引入到错误的地址,从而导致程序错误甚至崩溃。
(9)离开虚拟机时加密寄存器:将把VMProtect的输出结果进行加密。
(10)隐藏常量:将阻止通过地址去查询变量或者通过地址去找到一个call方法的地址,但是此选项对于字符串没有作用。
(11)移除固定元素:像delphi这样的编译器,将会产生一个固定元素的列表,但是这些元素对于操作系统执行程序来说是不会用到的,VMProtect将根据这个列表进行处理,只把在保护过程中需要的列表保存下来。
(12)挪动资源到文件尾部:将资源文件放到尾部,例如图片资源。

转储——如果在VMProtect的使用中存在嵌套使用的情况,在这个面板中,可以通过查找“Unpaire”来定位。
    完成编译——点击编译按钮,完成编译。之后会在*.exe旁边生成*.vmp和*.vms文件,(如果添加了脚本才会生成*.vms文件)

转:用VMProtect和ASProtect 的SDK加密应用程序的更多相关文章

  1. ABAP 加密解密程序

    用于对字符串的加密和解密: DATA: o_encryptor TYPE REF TO cl_hard_wired_encryptor, o_cx_encrypt_error TYPE REF TO ...

  2. 阿里云OSS NET SDK 引用示范程序

    1.引入SDK bin文件,下载地址:https://docs-aliyun.cn-hangzhou.oss.aliyun-inc.com/internal/oss/0.0.4/assets/sdk/ ...

  3. 使用Dotfuscator加密混淆程序以及如何脱壳反编译

    混淆演示 首先介绍如何使用Dotfuscator对.net程序加密码混淆/加壳 C#或vb.net编写的应用程序或DLL. 这里随便创建了一个C#的命令行控制台程序.程序很简单,对当前的时间进行了AE ...

  4. Zedboard(二)使用Vivado+SDK开发嵌入式应用程序——实例一

    本次介绍用Vivado构建Zedboard开发板的硬件平台+SDK开发应用程序(Zedboard裸机开发) 过程如下: 一.运行Vivado,建立新工程 指定好工程路径,下一步,选择RTL Proje ...

  5. application.properties多环境配置文件、jar包外部配置文件、配置项加密、程序中配置使用

    一.简介 spring boot项目application.properties文件存放及使用介绍 二.方法一多环境配置文件 我们一般都会有多个应用环境,开发环境.测试环境.生产环境,各个环境的配置会 ...

  6. C# 之TripleDESCryptoServiceProvider类加密/解密程序

    这篇博文的编写基于以下博客地址提供的知识: TripleDESCryptoServiceProvider 加密解密 基于该博客,我的毕业设计中密码存储加密字符串这一问题得到解决.

  7. Netty入门(七)使用SSL/TLS加密Netty程序

    为了支持 SSL/TLS,Java 提供了 javax.net.ssl API 的类 SslContext 和 SslEngine 使它相对简单的实现解密和加密.Netty 利用该 API 实现了 C ...

  8. 探寻不同版本号的SDK对iOS程序的影响

    PDF版本号:http://pan.baidu.com/s/1eQ8DVdo 结论: 同样的代码.使用不同版本号的SDK来编译.会影响MachO头中的值, 从而使程序表现出不同的外观. 代码: - ( ...

  9. 使用Android SDK卸载厂家程序

    ADB下载: 官网翻墙比较慢,这里推荐使用国内网站:https://www.androiddevtools.cn/ 下载  SDK Tools  和  SDK Platform-Tools: 两者分别 ...

随机推荐

  1. 协议 - OSI七层网络协议模型

    摘自:https://www.cnblogs.com/oneplace/p/5611094.html 互联网协议 本文全文转载阮一峰老师的两篇文章,自己做了一些添加内容 参考:互联网协议入门(一) 互 ...

  2. oauth2.0协议接口-第一篇-api逻辑

    开放平台是支持OAuth2.0和RESTful协议的资源分享平台,经过授权的合作伙伴可以读取和写入资讯.用户.文件.数据库等资源. 1.创建数据库表结构 CMSSyncClient(数据同步客户端) ...

  3. Spark Streaming 交互 Kafka的两种方式

    一.Spark Streaming连Kafka(重点) 方式一:Receiver方式连:走磁盘 使用High Level API(高阶API)实现Offset自动管理,灵活性差,处理数据时,如果某一时 ...

  4. Python全栈day 05

    Python全栈day 05 一.数据类型补充 1. int py2和py3的2种区别 py2有int和long,int的取值范围为-2^31~2^31-1,超出范围自动转为long,长整型. py2 ...

  5. stark组件(7):增加分页功能

    效果图: 分页部分代码: # 1.分页处理 all_count = self.model_class.objects.all().count() query_params = request.GET. ...

  6. pycharm中文乱码问题 总结

    前言: 这几天刚刚开始学习python,然后就安装了pycharm,但是那个中文乱码的问题真是让人心烦,在网上找了好久,都写得好乱,今天终于让我解决了,在这里总结一下经验,希望可以帮到你们 问题:如下 ...

  7. POJ:3259-Wormholes(最短路判断负环)

    Wormholes Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 58153 Accepted: 21747 Descripti ...

  8. spark练习--统计xxx大学的各个少数名族的情况

    最近,有一份数据,是关于学校的数据,这个里面有所有学生的信息,今天闲来没事,我就想用spark的方式来读取文件,并且来统计这个学校的各个民族的情况,以前我用hadoop中mapReduce来计算,不得 ...

  9. TP5 中出现 No input file specified

    之前用php5.4 更新至php7之后原tp5项目出现 No input file specified 修改方法: 打开public目录下的.htaccess文件,把:RewriteRule ^(.* ...

  10. hash算法和常见的hash函数 [转]

       Hash,就是把任意长度的输入,通过散列算法,变换成固定长度的输出,该输出就是散列值. 这种转换是一种压缩映射,也就是,散列值的空间通常远小于输入的空间,不同的输入可能 会散列成相同的输出,而不 ...