我习惯先讲废话 不想看废话的往下拉
事情是这样的 我呢 理论应该上大二了 但是因为玉米证 和 叫驴 就喜欢研究这些东西玩(现在高三 但是在家自学 准备上个大专算了 摆烂 可能也不准备上过学 去送外卖也可以)
哎 扯多了 上面不重要
有一天 我的朋友发来一张聊天截图
这陌生的UI界面 一看就是T某G啊
哦 这不重要 这真是我朋友奥 我没有tg...
哦这也不重要
一开始我看到他说VT为所欲为 我就知道 不过是EPT HOOK了内核拷贝内存的函数 这不两年前就有人这么做了吗 [原创]逆向分析某VT加持的无畏契约纯内核挂-软件逆向-看雪论坛-安全社区|非营利性质技术交流社区直到我看到后面 我朋友的朋友说 是傀儡在ace-base上的..我单走一个6
讲真我听了这个效果 我一下就知道怎么搞了 抄作业这一块我还是很在行的哈哈哈./
不保证次外挂的思路和我的思路一样 因为是朋友的朋友我不好意思要样本 要来了我也不想分析 分析了我也不知道怎么贴图 然后他这个是有映射驱动的 所以我觉得好麻烦 反正也有思路 直接写吧 写完发看雪 还能给各位当茶余饭后的乐子看 哈哈哈
我的实现方法那可太简单了/."写完了回来备注一下 以下说的vt驱动 代表整个主要驱动 不单止vt部分代码"
周之所众 今年腾讯游戏安全大赛的决赛就用了 intel的vt ept技术// 然后当时研究了一下 vt(我没报名奥 我逆向能力不到位)
Extended Page Table这个东西吧 主打一个 眼见为虚 执行为实
如果第一次听到这个词 不要慌 我们只需要知道 三 件事 1.开启ept后 你可以单独去设置pte的内存属性 2.当GUEST要执行这个页的时候 但是此时他的 执行属性x=0 那就会触发ept 违规 读写同理3.违规后你可以修改属性
是不是很简单
好了 你已经学会ept hook了
把大象塞进冰箱分三步 那 ept hook也分三步创建一个连续的物理页(不连续咋办 不连续上转转回收了 然后用MmAllocateContiguousMemorySpecifyCache申请) 然后正常写入jmp 或者int3 或者 别的指令修改read=1;write=1; execute=0;当ept执行违规的时候 把page_frame_number改成我们申请出来并且做了jmp的页表上 再把执行放开 读写关闭 读写违规的时候把执行关闭 读写放开 pfn改原来的页 是不是巨简单
那无痕隐藏驱动不过只是epthook的进阶罢了
那我来说说我的实现思路
首先 你需要一个rapper 啊不 mapper 说错了 然后对这个mapper(我直接拿GS那个开源的驱动改奥 懒得写)改造一下
先暂停掉傀儡驱动的检测 避免他线程的执行影响到我们的执行 (如果你能找一个傀儡驱动 没用回调没用线程 或者把你的驱动程序最小化 塞到他加载完毕之后就没有再执行的区域的话 就可以不用操作这一步 ) 可能那个wg不是这么干的 我不知道 但我懒得去找合适的本体了 我就也用axe-base吧(找了一圈没找到合适的 发现就这个wg用的axe很合适 因为比较大.. 我就喜欢大的 哈哈哈 我只是学习 tx别搞我 我啥也没干 我就一个臭打yj的)
// 遍历所有线程并挂起符合条件的线程
NTSTATUS
EnumerateAndSuspendDriverThreads(
PVOID DriverBase,
ULONG DriverSize
NTSTATUS status;
PVOID buffer = NULL;
ULONG bufferSize = 0;
PSYSTEM_PROCESS_INFORMATION pProcInfo;
ULONG needed;
// 第一遍获取缓冲区大小
status = ZwQuerySystemInformation(
SystemProcessInformation,
NULL,
&needed
if (status != STATUS_INFO_LENGTH_MISMATCH) {
return status;
bufferSize = needed + 0x1000; // 给点额外空间
buffer = ExAllocatePoolWithTag(NonPagedPoolNx, bufferSize, 'pstG');
if (!buffer) {
return STATUS_INSUFFICIENT_RESOURCES;
status = ZwQuerySystemInformation(
SystemProcessInformation,
buffer,
bufferSize,
&needed
if (!NT_SUCCESS(status)) {
ExFreePoolWithTag(buffer, 'pstG');
return status;
// 遍历所有进程、线程
pProcInfo = (PSYSTEM_PROCESS_INFORMATION)buffer;
while (TRUE) {
ULONG threadCount = pProcInfo->NumberOfThreads;
PSYSTEM_THREAD_INFORMATION pThreadInfo = pProcInfo->Threads;
for (ULONG i = 0; i < threadCount; i++, pThreadInfo++) {
//DbgPrint("Thread ID: %d\n", pThreadInfo->ClientId.UniqueThread);
PVOID startAddr = pThreadInfo->StartAddress;
// 判断该线程入口地址是否在 1.sys 驱动的地址区间内
if ((ULONG_PTR)startAddr >= (ULONG_PTR)DriverBase &&
(ULONG_PTR)startAddr < (ULONG_PTR)DriverBase + DriverSize)
// 找到“属于该驱动”的线程
HANDLE hThread = NULL;
PETHREAD eThread = NULL;
CLIENT_ID cid = pThreadInfo->ClientId;
// 1) 通过线程 ID 找到内核的线程对象
status = PsLookupThreadByThreadId(cid.UniqueT
...(已截断)
---
来源: 看雪论坛
原文链接: https://bbs.kanxue.com/thread-288886.htm
[推荐]windows VT层内存隐藏 让反作弊驱动当傀儡(附实现和检测思路)
448 浏览
10 回复
啊 我忘了说检测思路了 就正常检测vt被 还有用那个https://bbs.kanxue.com/thread-287911.htm 这个去检测 可能也有点吃性能 但是最好的做法就是 反作弊的开发者 提前去把vt的坑位占了 嗯对! 就这样 我睡觉了 受不了了
感谢分享
目前我是双开vtd,然后是双击转换(类似双机内存),你这个思路不知道能不能过掉a某e的部分检测!现在A某e对我下发云加密后在杀的猛一点就会被t1-3-7天随机!不知道用了你这个之后会不会好
感谢分享
若言
目前我是双开vtd,然后是双击转换(类似双机内存),你这个思路不知道能不能过掉a某e的部分检测!现在A某e对我下发云加密后在杀的猛一点就会被t1-3-7天随机!不知道用了你这个之后会不会好
目前我是双开vtd,然后是双击转换(类似双机内存),你这个思路不知道能不能过掉a某e的部分检测!现在A某e对我下发云加密后在杀的猛一点就会被t1-3-7天随机!不知道用了你这个之后会不会好
帖子没什么意思人倒是有点意思 可以私我进群 顺便一提 这思路存在有点时间了 而且不需要虚拟化 具体原因成功进来后去群里问吧
章鱼C
帖子没什么意思人倒是有点意思 可以私我进群 顺便一提 这思路存在有点时间了 而且不需要虚拟化 具体原因成功进来后去群里问吧
不用虚拟化怎么实现的 别的地方来读取的时候返回傀儡驱动内存呢
帖子没什么意思人倒是有点意思 可以私我进群 顺便一提 这思路存在有点时间了 而且不需要虚拟化 具体原因成功进来后去群里问吧
不用虚拟化怎么实现的 别的地方来读取的时候返回傀儡驱动内存呢
mark
vt驱动卸载了handler还能在吗,还是是把vt驱动映射到acebase上了
你这个思路有一个大问题: 反作弊驱动本身没有运行,意味着跟游戏进程的心跳通信也没有了,会被马上发现