过VMP加壳程序的自效验
VMP加壳的选项中,有个内存效验选项,默认是勾上的,于是,默认的加壳后的程序,只要修改1个字节,程序就会报错。比如,我把加了VMP2.06后的记事本程序,用Hexworkshop打开,把最后一个字节,修改成90,如图: 然后保存后,打开程序,就会报如下错: 下面就来分析下,如何过这个效验。 VMP中,进行效验,都是由handler VM_CRC来进行的,大致的过程可以描述如下: if(VM_CRC(dwCheckStartAddr,dwLen)==Orien_hash) 于是,过这个效验的方法就是: 法1.把修改后文件的效验值patch成原始的,也就是未修改程序的值 法2,强行修改跳转 下面先来看下VM_CRC: Address Thread Command ; Registers and comments ...... 01050E02 Main pushfd 从这条handler里,可以得到如下关键的信息: 1.效验的起始地址:CheckStartAddr 2.效验的长度:Len 3.计算后的效验值:CrcValue 说明:对于VM_CRC这条handler的获取,其实很简单,脱过VMP壳的应该都遇到过: 下面,写个脚本,来记录下VMP外壳到底在效验哪些地方,脚本如下: var addr var GetAddr mov logfile,"log.txt" bphwcall ///配置,根据程序自行修改 mov GetAddr,010520ce //获取效验开始地址 bphws stop,"x" loop: run run info: eval "Check Addr:{addr}----{end} VM_CRC:{hash} ref:{ref}" Exit: 记录后的效果如下: Check Addr:84013C----840178 VM_CRC:6BE8626 ref:178 ....下面略 下面来分析下这份日志: 由于我修改的文件是文件最后个字节,offset=2E9FF,转化成RVA=2E9FF,日志的前几行地址为84XXXX,显然,这个地址是内存中新申请的,下个bp MapViewOfFile看看,返回后可知,eax=00840000,于是,修改的地址,在内存映射中的地址=lpBase+RVA=00840000+2E9FF=0086E9FF 然后看日志的第三行: Check Addr:8513E6----86EA00 VM_CRC:FCD461CC ref:EA00 发现,这行记录的信息正好是效验了我们修改的地方。于是,我们只要手动patch这个效验值,就能使程序正常的运行起来。但是如何要使保存后的程序也能正常运行呢?于是得找个地方,去放patch的代码。 最好的思路就是找个没在上面日志中的效验的范围内的handler内,但是这个值往往不好找,省事点,直接在CRC计算的出口处进行patch,这个地址: 01050E02 9C pushfd //这里patch 但是,这个地址也正好存在在效验的范围内,看日志: Check Addr:1050DA6----1051032 VM_CRC:D7A929AE ref:1032 01050E02正好在这个效验的范围内,于是,这次效验值,我们也得进行patch。 当然,VMP并未对程序的空白区进行效验,于是,可以在程序最后的空数据区,随便patch。 如何patch呢?这个就自由发挥,我也不知道如何patch最佳,提供一种自己的挫patch代码:(说明下,脚本中记录的ref值,是为了进行patch对照用的,也就是一个参照数) 01050E02 /E9 A6180000 jmp 修改.010526AD //放个跳转去进行patch 010526AD 66:81FA 00EA cmp dx,0EA00 如此patch后,保存文件,即可正常运行。 当然,你也可以修改跳转的地方,来到过效验的目的。方法就是HOOK VM_Add32,0和4互换,这个上次的文章中提过了,就不赘述了。 附件为试练品,patch后的,以及脚本跟日志 http://u.115.com/file/t040893ff3 |
过VMP加壳程序的自效验相关推荐
- 加壳软件测试,VMProtect2.04加壳程序从入门到精通
类型:加壳脱壳大小:13.5M语言:中文 评分:4.2 标签: 立即下载 第 7 页 虚拟执行环境与调试器检测 3.3.虚拟执行环境与调试器检测 在前面所有的节里面的内容全部都是贯穿的,没有一个地方遗 ...
- 第一课时(下):破解基础之常见加壳程序特征
文章目录 一.压缩壳 1.1 UPX 1.1.a 使用查壳工具 1.1.b 分析区段信息 1.2 ASPack 1.2.a 使用查壳工具 1.2.b 分析区段信息 1.2.c 分析入口特征 二.保护壳 ...
- 【Android 逆向】加壳技术识别 ( 函数抽取 与 Native 化加壳的区分 | VMP 加壳与 Dex2C 加壳的区分 )
文章目录 一.加壳特征识别 1.函数抽取 与 Native 化加壳的区分 2.VMP 加壳与 Dex2C 加壳的区分 一.加壳特征识别 1.函数抽取 与 Native 化加壳的区分 函数抽取 与 Na ...
- C#下的Windows服务通用壳程序(二)
配置文件 (1)配置文件必须是固定的名称,这是为了方便壳程序读取. 1 <?xml version="1.0" encoding="utf-8" ?> ...
- 【原创】Android VMP加壳 POC
介绍 这个壳的核心--字节码解释器,它参考了dalvik虚拟机的解释器.不需要hook.注入.目前只支持算数运算指令. 我个人把dalviki指令分为这么几类: 算数运算指令. 引用类指令.如cons ...
- 知物由学 | SO VMP 加壳与混淆,为移动应用提供函数级保护
导读:VMP 是一种用于软件保护的软件,对软件进行加壳,加固厂商都有自己的 VMP 方案,但值得注意的是,native 层的 VMP 方案并不成熟,兼容性只是其中一个影响因素,性能更是导致该方案无法普 ...
- Map根据Key值进行排序(升序加降序)
Map根据Key值进行排序 如果这篇文章对你有帮助的话,希望可以给博主点个赞,感谢!! 今天在写一个功能的时候,需要根据日期进行分组,于是我从数据库查找的时候就使用order by create_ti ...
- java 的 exe脱壳_[已解决]求教如何使用java编写加壳程序对PE文件进行加壳
20 2017-5-8 15:15 这个问题就需要来谈谈壳的架构问题了. 壳的三大架构 1.最早的壳几乎都是virus演化来的,大部分都是汇编直接写的. 好处就是直接可以把汇编代码复制出来当作壳的lo ...
- 代码保护壳的设计--(3生成壳程序 )
首先利用反汇编引擎解析并传入 壳数据 void PEProtecter::PushCode(unsigned va, unsigned len, unsigned _base) {char* buff ...
- 个人总结的一个VMP脱壳步骤
个人总结的一个VMP脱壳步骤 个人在学习脱VMP加壳的过程中总结的一个步骤.按照这个步骤,包括VMP1.6-2.0在内应该有70%-80%能脱壳.脱不了的也别问我,我也刚开始学习.我还想找人问 ...
最新文章
- ASP.NET实现身份模拟
- 手把手教你搭建智能合约测试环境、开发、编译、部署以及如何通过JS调用合约方法
- Ubuntu下Astro Pro配置openni踩坑小记
- TypeError: 'stepUp' called on an object that does not implement interface HTMLInputElement.
- PHP将excel文件中的数据批量导入到数据库中
- 基于Hyper-V3.0搭建XenDesktop7之九 部署虚拟应用之模板准备
- 解决通过vue-router打开tab页,下次进入还是上次history缓存的界面状态的问题
- msp430中如何连续对位进行取反_四元数数控:如何保养视觉对位平台?
- 大数据建模,eBay的一个牛人
- python整数运算定律_PHP 操作redis 详细讲解
- 华为软挑2019总结
- 韩顺平JAVA学习笔记(入门自用)
- 人工鱼群算法解决TSP问题
- 由入门C语言题目浅析gets()函数的用法
- JS new一个对象的过程
- 空降如何快速融入接管团队
- ubuntu系统开机显示BusyBox v1.22.1(Ubuntu 1:1.22.0-15ubuntu1) built-in shell(ash) 问题的解决办法
- [转]Java咖啡馆---叹咖啡
- 关于计算机合成图像的应用中,数字图像合成技术综述
- Java语言程序设计基础篇原书第十版第二章编程练习题答案