UltraDebug

 找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
热搜: A C D R G Y M Z X S P
公益项目,接受捐赠
查看: 2373|回复: 2
收起左侧

[原创] vmp 3.8.1反调试分析与手动绕过

[复制链接]
yuwenming

主题

0

回帖

UD

新手上路

UID
37
积分
22
注册时间
2022-5-15
最后登录
1970-1-1
2023-9-14 19:31:51 | 显示全部楼层 |阅读模式

环境:

vmp版本:3.8.1 professional  为了方便分析,只勾选反调试选项(user-mode+kernel-mode)
待分析样本: x32 编译环境vs2022
系统环境:windows 11 cpu:amd
用到的调试器 OllyDbg, windbg
本人水平有限,如果哪里有不对请指出 :)

初始化工作:

首先vmp会调用RtlAllocateHeap
然后通过peb取到ldr链来获取ntdll的模块基址(图中高亮行),接着使用二分查找通过解析导出表获取ZwQueryInformationProcess的地址,然后调用他
vmp 3.8.1反调试分析与手动绕过 - yuwenming_UltraDebug

vmp会判断0xcc断点,不要在函数头下断,可以用硬件断点
vmp 3.8.1反调试分析与手动绕过 - yuwenming_UltraDebug

参数0x1a(ProcessWow64Information)表示查询进程是否运行在wow64下(影响后续反调试流程,本文仅分析当前流程下vmp走的反调试流程)
接着通过遍历ntdll的资源信息来判断电脑系统版本
vmp 3.8.1反调试分析与手动绕过 - yuwenming_UltraDebug

然后调用ZwOpenSectionZwMapViewOfSection copy 一份 ntdll,通过特征码0xb8获取函数的服务号
完成之后接着调用ZwUnmapViewOfSectionZwClose
在OD中观察程序刚加载时的esp的上方可以发现一些数据(标红即被修改的)
vmp 3.8.1反调试分析与手动绕过 - yuwenming_UltraDebug

左边不难猜测是vmp用来进行直接系统调用的服务号,0xD  ZwSetInformationThread印象深刻...右边则有一些有趣的函数的地址
分析到这忽然想起前段时间vmp源码(据说是3.5版本?)泄露了部分,我对照着看了一下,目前的流程不能说是相似,简直一模一样
vmp 3.8.1反调试分析与手动绕过 - yuwenming_UltraDebug

开始进行反调试:

紧接着,根据以下条件进行不同的反调试。

  1. 是否是wow64环境(前面有提到)
  2. 系统的版本(fs:[zxsq-anti-bbcode-0x30]+0x0a4 OSMajorVersion   : Uint4B)下图高亮行
  3. 处理器类型(KUSER_SHARED_DATA + 0x26a NativeProcessorArchitecture : Uint2B)下图高亮行的下一行
    vmp 3.8.1反调试分析与手动绕过 - yuwenming_UltraDebug

如图,在当前环境下,vmp用“天堂之门”将代码切换到x64执行。然后我就干瞪眼了半天,OD没法调试x64的代码
与此同时我注意到切换到x64之后的代码似乎仍然是在虚拟机里执行的,所以我选择先对程序进行了一些黑盒测试
在我的系统是win11,程序运行在wow64的前提下,似乎只有NativeProcessorArchitecture为amd时vmp才会用“天堂之门”将代码切换至x64继续执行。尝试修改读取到的NativeProcessorArchitecture, 其余都是直接走x32的,我也不是很清楚具体原因。

除此之外我在jmp far 和返回地址00C7CE2A处分别下硬件执行断点,然后F9运行几次,发现经过两次x32到x64切换之后,vmp似乎已经检测出调试器,使用NtRaiseHardError来弹窗提示然后退出。然后我通过观察堆栈,发现有一处红色变动的值0xFFFFFFFF,我尝试将其置0,发现流程继续下去到了第三个jmp far,之后再弹窗退出。此时很明显已经干预了一处反调试的结果。
vmp 3.8.1反调试分析与手动绕过 - yuwenming_UltraDebug

因为od、x32dbg、x64dbg都没办法在切换成x64后调试,所以我就用unicorn模拟执行和windbg来继续分析x64代码(吐槽一下,切换x64之后还是在虚拟机里执行代码,好恶心啊)

可以发现在切换到x64代码后,vmp进行直接系统调用(rax=0x1c ZwSetInformationProcess)来disable InstrumentationCallback参数 ProcessInformationClass = 0x28
vmp 3.8.1反调试分析与手动绕过 - yuwenming_UltraDebug

然后我尝试对syscall下断,发现程序直接异常退出或者断不下来
这是有两个原因,第一个原因是vmp检测了0xCC断点
另一个原因是:vmp通过指令rdtsc的返回值,从多个不同但结果相同的路径中随机选择一个路径执行,尝试修改rdtsc返回值,会发现模拟到不同的路径。这也就是为什么实际执行和模拟的结果不同(可以通过patch rdtsc返回值让他实际走的流程跟模拟流程一致)

既然在切换到x64之后仍然是进行直接系统调用,并且他没有访问一些其他内存(或者做其他一些操作),而且我发现他前2次x32切换到x64都是走这个jmp far,我就有了个大胆的想法。它应该是有个类似的封装好的函数可以走x64系统调用,想象中的几句伪代码如下

x64_code:

​        (可能是一些准备工作)

​        syscall

​        (将结果保存等等)

​        retf

function MakeX64DirectSystemCall (服务号,参数1,参数2,...,返回值):

​                

​                push cs

​                push ret_addr

​        &nbs
还有更多的精彩内容,作者设置为付费后可见
UltraDebug免责声明
✅以上内容均来自网友转发或原创,如存在侵权请发送到站方邮件9003554@qq.com处理。
✅The above content is forwarded or original by netizens. If there is infringement, please send the email to the destination 9003554@qq.com handle.
回复 打印

使用道具 举报

tebnieew2

主题

0

回帖

UD

新手上路

UID
44
积分
35
注册时间
2022-5-18
最后登录
1970-1-1
2023-9-14 21:04:48 | 显示全部楼层
学习起来,,
回复 打印

使用道具 举报

applecloudcom

主题

0

回帖

UD

新手上路

UID
21
积分
33
注册时间
2022-2-12
最后登录
1970-1-1
2023-9-15 13:26:50 | 显示全部楼层
ProcessWow64Information看下进程有没有杀
回复 打印

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|Archiver|站点地图|UltraDebug ( 滇ICP备2022002049号-2 滇公网安备 53032102000034号)

GMT+8, 2025-6-21 01:01 , Processed in 0.042166 second(s), 13 queries , Redis On.

Powered by Discuz X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表