VMProtect 与 ASProtect 在VC中的SDK编程.

VMProtect SDK使用日记 首先是看懂接口 #pragma once #if defined(__APPLE__) || defined(__unix__) #define VMP_IMPORT #define VMP_API #define VMP_WCHAR unsigned short #else #define VMP_IMPORT __declspec(dllimport) #define VMP_API __stdcall #define VMP_WCHAR wchar_t #ifdef _WIN64 #pragma 阅读详情
作 者: glucose
时 间: 2007-01-05,17:26
链 接: http://bbs.pediy.com/showthread.php?t=37477

最近想用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;
在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 等. 记得选上这些函数再进行保护。

    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 用仿真方式来改变这个函数的内容(如入口点保护), 所以将不可能恢复甚至于理解原来程序的工作原理。
    为了使用新的代码片段保护,你需要插入新型的标记,如下所示:

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

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

代码:
#include "include/aspr.h"  
MessageBox(0,"Begin","",0);  
#include "include/CppEnvelopeCheck.inc"  //可以在任何位置插入这一句话.
MessageBox(0,"End","",0);  
    方式 2 - 如果ASProtect外壳被移除,这种方式将会像函数一样工作,返回一个false值。如果是false你可以做一些邪恶的事情。

代码:
BOOL EnvelopeCheck()   //这个函数放在程序前面就行了。
{  
#include "include/CppEnvelopeCheckFunc.inc"  
}  

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

代码:

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

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

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


引用:
#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
有了上面的define,在需要加密的地方只需要两句话就行了,可以到处多插一点:

代码:
VMPBEGIN
//需要加密的代码片断
VMPEND
VM SDK开发思路及接口介绍(C++) VM推出了进行二次开发的SDK(Software Development Kit),VM SDK开发理念是以极少的代码实现图像算法的二次开发集成,从而降低视觉开发人员对视觉处理逻辑代码的维护成本。本文即介绍如何用VM SDK和C++进行联合开发。 ...... 阅读详情

相关推荐

VMP保护壳代码标记

VMP保护标记!达到隐藏字串的目的! VMP保护标记!达到隐藏字串的目的! VMP保护标记!达到隐藏字串的目的! VMP保护标记!达到隐藏字串的目的! VMP保护标记!达到隐藏字串的目的! VMP保护标记!达到隐藏字串的目的! VMP保护标记!达到隐藏字串的目的! VMP保护标记!达到隐藏字串的目的! VMP保护标记!达到隐藏字串的目的!

VMProtect 与 ASProtect 在VC中的SDK编程

转载 如何使用VMProtect和ASProtect 的SDK加密程序

john_h_h的博客 1021

c++加密压缩壳

简单加壳实现,代码段加密和压缩,适合新手练习!编写环境win10,vs2013.压缩引擎aplib

vmprotect

VMProtect使用说明 一.    接口说明 //开始保护处标记(对应于功能设置:反调试、内存保护等等) VMProtectBegin(const char *); //开始虚拟化代码处标记(包括保护设置) VMProtectBeginVirtualization(const char *); //开始变异代码处标记(包括保护设置) VMProtectBeginM

loooooooi1的博客 1492

4.无限共轭距柯克物镜设计——zemax学习笔记

无限共轭cooker物镜

fly_daerm的博客 1601

解密DS90UB983-Q1的汽车电子魔法:如何通过FPD-Link IV实现4K视频的无缝传输

本文深入解析了德州仪器DS90UB983-Q1串行器芯片如何通过FPD-Link IV技术在汽车电子中实现4K视频无缝传输。文章详细介绍了该技术的核心功能,包括多流传输(MST)模式、热插拔检测(Hot Plug Detect)机制以及电磁兼容性设计,为车载信息娱乐系统提供了高带宽、低延迟的可靠解决方案。

i3j4k5的博客 245

VMProtect使用教程(VC++MFC中使用)

需要注意的是,VMProtect是一种商业级别的代码保护工具,需要购买许可证才能使用。此外,使用VMProtect保护程序可能会影响程序的性能和稳定性,需要进行充分的测试和评估。在上面的代码中,我们使用VMProtectBegin宏开始保护,并传递一个字符串参数作为保护的名称。在需要保护的代码段结束处,我们使用VMProtectEnd宏结束保护。VMProtect是一种商业级别的代码保护工具,可以用于保护VC++ MFC程序。3. 编译和运行程序,VMProtect将保护程序的代码。

1444

SAP交货单过账避坑指南:序列号处理、Buffer清理与BAPI提交回滚的那些事儿

本文深入解析SAP交货单过账中的序列号处理、Buffer清理与BAPI提交回滚等关键问题,提供WS_DELIVERY_UPDATE和BAPI_OUTB_DELIVERY_CONFIRM_DEC的实战优化方案。通过详细的技术分析和最佳实践,帮助开发者避免常见陷阱,提升交货单处理的稳定性和效率。

weixin_31155097的博客 432

VMProtect 与 ASProtect 在VC中的SDK编程 (转)

最近想用VMProtect和ASProtect 的SDK加密一个程序,结果搞了半天没搞成,网上没看到在VC中如何使用VMProtect的SDK加密,于是琢磨了一下,总算成功了,最后有一点点心得,与大家共享,免得还有人跟我一样走弯路。    其实VMProtect和ASProtect的SDK编程都差不多,都是在编程时在语句里面插入一个标记(Marker),然后在加壳时,加壳程序就会认出这些标记,并

xuguruogu的专栏 666

【电源专题】LDO基础——热性能2

对于LDO散热而言,选择合适的元件并不是一件简单的任务。为了实现高效、尺寸得当并成本低的散热解决方案,我们在早期设计阶段就需要确保所有器件都可用并且已经考虑到元件和各种特性。

一点硬件 896

SAP 费用化采购订单简介

费用性采购的核心特点费用性采购的流程费用性采购的优势适用场景业务场景前台操作1、创建成本中心---KS012、创建采购订单---ME21N3、采购订单审批---ME29N4、采购订单收货---MIGO5、查看成本中心费用---S_ALR_870136116、控制费用化的采购订单自动带出科目和成本中心SAP费用性采购(Expense Procurement)指的是企业在采购过程中,直接将采购的物料或服务成本计入费用科目,而不是记入库存账户的采购行为。

我小时候很黑的博客 2016

VMProtect的使用

VMProtect 与 ASProtect 在VC中的SDK编程 (转)

曾是土木人 2622

【AI智能体】Codex 开发聚合搜索应用项目实战操作详解

Codex 开发聚合搜索应用项目实战操作详解

congge 3100

转:用VMProtect和ASProtect 的SDK加密应用程序

最近想用VMProtect和ASProtect 的SDK加密一个程序,结果搞了半天没搞成,网上没看到在VC中如何使用VMProtect的SDK加密,于是琢磨了一下,总算成功了,最后有一点点心得,与大家共享,免得还有人跟我一样走弯路。 其实VMProtect和ASProtect的SDK编程都差不多,都是在编程时在语句里面插入一个标记(Marker),然后在加壳时,加壳程序就会认出这些标记,并...

weixin_30639719的博客 269

块存储:AIO的直接写流程注释

提交io流程中aio_write之前函数的注释,可参考“块存储:AIO的直接读流程注释”。

yiyeguzhou100的专栏 1335

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

C++下 VMP加壳宏

#define VMP_BEGINV \ _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 \

IT男也疯狂 7115

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

c++学习笔记(vmp壳)摘要

#define VMP_BEGINV _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

qq_56466624的博客 1340

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

C++/MFC壳 加密压缩 VMP壳项目

本次加壳项目已实现的功能 加密,压缩所有区段,(可保存图标,版本信息) 加密IAT VMP部分指令 支持随机基址 支持TLS处理 若干花指令,混淆代码 反调试 源码分享:https://github.com/Mr-Hock/MyShell 加壳流程: 加载反汇编引擎 处理代码(VMCODE) 处理IAT(CALLCODE) 添加区段(壳数据,代码) 加密压缩数据 写出文件 IAT加密 IA...

qq_43572067的博客 3458
上一篇: 决战未解析的外部符号
下一篇: 还未结束就能把自身删除的程序
iiprogram
博客等级 码龄25年 1068粉丝 1515原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值