当前位置: 首页 > ds >正文

转vmp3.0.9全保护拆分解析

以下为了避免插件干扰,故采用x64dbg原版进行分析。

首先我通过检测到调试器的弹窗进行栈回溯,定位到该关键点:
CALL eax

由于才接触Vmp,所以是把各个保护拆分开来进行的分析,会比较简单一些,不过全保护其实也就是凑在一起罢了,只要注意顺序就行啦。

本帖只是分析基础保护反调试反虚拟机等,不涉及还原VM和分析VM代码的部分。属于新手贴一类,适合萌新观看,大佬轻喷,有错漏之处,敬请指正,谢谢。

EverEdit编辑器是加的一个vmp的壳子,虽然特征和这里分析的不太一致,但是反调试路子大致一样的,而且虽然是vmp但是通过trace跟踪和分析也是可以暴力破解的,可以拿来练手,这里推荐一下。

一、反调试保护

1.调用IsDebuggerPresent,判断返回值eax==1被调试,eax==0没有调试。

 

2.CheckRemoteDebuggerPresent,判断buffer返回值是0还是1,1被调试,0没有调试。

3.NtQueryInformationProcess,ProcessInfoClass=0x1E来获取调试句柄,判断是否被调试,调试句柄返回0且eax的返回值是0xC0000353

4.NtSetInformationThread,ThreadInfoClass=0x11,这个不是检测调试,而是设置不把调试信息发送到调试器,可以直接把0x11修改为0x3或者其它数值就可以了。

5.ZwQuerySystemInformation,SystemInfoClass=0x23(MACRO:SystemKernelDebuggerInformation),返回值是2字节的bool值,设置为0即可。

6.ZwQuerySystemInformation,SystemInfoClass=0xB(MACRO:SystemModuleInformation),会去遍历内核模块,然后进行判断,第一次是获取需要存储的buffer长度,第二次才是真正获取信息,只要把buffer都置为0,就检测不到调试了,至于buffer的位置会在第一次调用后使用LocalAlloc申请空间来存储

 

 

7.CloseHandle反调试,如果被调试了,那么KiRaiseUserExceptionDispatcher函数会被调用,走异常处理流程;如果是不被调试的状态,不会走向异常流程。

8.检测硬件断点,是通过SEH异常来处理的
首先在SEH链中对当前模块的SEH头下一个软件断点

然后把图示中的Dr0、Dr1、Dr2、Dr3、Dr6、Dr7调试寄存器都修改为0

然后F9再次到CALL eax的时候如果是GetpRrocessAffinityMask函数调用,说明反调试已经顺利通过。
PS:上面对CALL eax下的是硬件断点,注意不要下软件断点,因为前面ZwSetInformationThread后(User-mode反调试)或者第三次最后一次NtQuerySystemInformation后(Kernel-mode)反调试会有如下图所示的软件断点检测,其实vmp的内存保护一部分的原理和这个一致,代码特征几乎都一样,取出来的HEX字节也是存放在esi寄存器中。所以为了方便,最好下硬件断点,因为硬件断点检查触发的时机都是在SEH函数中,很好拦截。

 

二、反虚拟机

1.CPUID判断ECX最高位31位是否为1,如果是1那么就是在虚拟机中,如果是0那就是在宿主机上。我自己加壳的这个样本有两个CPUID检测点,等它执行后修改ecx最高位为0就行。
不过下面的贴图演示的是使用修改虚拟机的.vmx配置文件的方式,更加方便。

2.使用GetSystemFirewareTable获取系统固件信息,判断其中有无下列字符串:VMware、VirtualBox、Parallels。注意大小写,只需要等GetSystemFirewareTable执行完成后对内存搜索VMware字符串(因为我用的VMware虚拟机),然后填充为0就可以过虚拟机检测了。下面我会贴一个脚本配合OD+StrondOD+DrxProtect使用的,主要就是填充VMware字符串。

三、IAT解密

1.我没有分析它是如何加密的,只是简单的分析了调用函数的解密过程,其实十分简单:进入解密函数后单步f7,当看到类似:lea register,dword ptr[register+imm](register:寄存器,imm:立即数)的语句,在执行完成后register中就是函数,再跟踪几步通过ret一类的就去执行真正的函数了
2.不知有无遗漏。。。

四、内存保护

1.内存保护和上面分析的软件断点几乎一样,对你修改的内存下硬件访问断点,就可以看到在取HEX字节然后运算,不再贴图了,只要把取出来的esi的数值替换为原来的数值就行了
2.不知有无遗漏。。

 

 

 

本文转自:https://bbs.pediy.com/thread-226455.htm

http://www.xdnf.cn/news/11914.html

相关文章:

  • htc G10刷机教程
  • VC 界面库皮肤库
  • 植物大战僵尸:逆向分析阳光
  • 手把手教你搭建自己的个人博客(图文教程)
  • 【零基础从入门到精通】程序、C语言
  • 千渡互通 (1000du2) V1.0 客户端 http://down.hotlife.cn/html/download/2006/6/06/1149565794.shtml
  • ASP网站漏洞解析及黑客入侵防范方法
  • 在linux用utorrent下载文件,在Ubuntu 10.04下使用uTorrent下载六维空间资源
  • 中国最好的博客网站
  • 防守地图隐藏英雄密码全集
  • Android开发——Dialog对话框
  • Hack games
  • 免费电子书籍下载站点大全
  • 获取myeclipse 7.5 注册码的方法
  • 什么是站内搜索引擎?如何在网站中加入站内搜索功能?
  • Microsoft Office2003sp2_5in1 迷你第7版(最终完美版)
  • gridview删除
  • Android下修改hosts文件
  • Red5的使用--使用日志
  • php抽奖算法
  • 推荐几个好的粉碎文件的软件?这3款软件让你彻底摆脱无法删除文件的烦恼
  • 团体程序设计天梯赛(L3-008 喊山 (30 分))
  • 利用IPv6看清晰流畅的网络电视
  • 【验】Postfix+Dovecot+MySQL搭建邮件服务器
  • ARM入门
  • skype安卓手机版_水晶直播app最新手机版-水晶直播app安卓免费版
  • 这10款数据恢复工具你知道吗?快快收藏以备不时之需!
  • 使用asp.net从零开始制作设计一个网站之一
  • 从需求变更唤醒植物人程序员说开去
  • catia中的螺旋伞齿轮画法_聚焦:螺旋伞齿轮画法要领