吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 2691|回复: 7
收起左侧

[C&C++ 原创] 简易玩具VT框架-以SyscallHook作为例子

[复制链接]
oxygen1a1 发表于 2023-1-9 15:21
本帖最后由 oxygen1a1 于 2023-1-9 16:43 编辑

==玩具VT,简易框架,VMX开启支持Win10,==

==SysCallHook不支持装了KPTI补丁(双Cr3)的操作系统==

==理论支持win7-win10 21h2==

参考:

https://hbxiaock.bk-free01.com/ADDD/8ee4

https://github.com/huoji120?tab=repositories

https://revers.engineering/patchguard-detection-of-hypervisor-based-instrospection-p1/

==测试系统==

版本        Windows 10 专业版
版本号        21H2
安装日期        ‎2022/‎8/‎9
操作系统内部版本        19044.2075
体验        Windows Feature Experience Pack 120.2212.4180.0

==测试效果 Hook NtOpenProcess==
win10_21H2_Test.png

SyscallHook::GetInsctance()->fn_syshook_init(0xfffff800832018c0, 0xfffff8008280aa90, 0xfffff800827f9630, 0xfffff8008280bbc0,FALSE);
SyscallHook::GetInsctance()->fn_add_hook_by_index(0x26, (UINT64)MyOpenProcess);
NTSTATUS MyOpenProcess(        _Out_ PHANDLE ProcessHandle,
        _In_ ACCESS_MASK DesiredAccess,
        _In_ POBJECT_ATTRIBUTES ObjectAttributes,
        _In_opt_ PCLIENT_ID ClientId) {
        asm_stac();
        DbgPrintEx(77, 0, "[+]NtOpenProcess catched\r\n");
        DbgPrintEx(77, 0, "[+]Process Handle 0%llx DesiredAccess %x ClinetId %llx\r\n",ProcessHandle,DesiredAccess,ClientId);

        return NtOpenProcess(ProcessHandle, DesiredAccess, ObjectAttributes, ClientId);
}

0X3 基于VMM的syscallHook

0x3-1 Hook思路

拦截C0000082的读写调用

读则返回原先的值,写则禁止写入,实际上通过修改MSR的LSTAR,来进行syscallHook;

从而达到,外部读MSR的SyscallRip没有问题,但是实际syscall调用是直接调用到的修改过的MSR上的。

因为涉及到修改IA32_LSTAR,所以自己需要重写一份KiSyscall64(Shadow),在逻辑中进行判断是否是需要Hook的SSDT Index;

0x3-2 PG的检测

值得一提的是,PG会检测IA32_LSTAR的修改。检测手段如下:

KiErrata704Present proc near           

mov     ecx, 0C0000084h
rdmsr
push    rdx
push    rax
and     eax, 0FFFFFEFFh ; MSR_FMASK的TF位置位
wrmsr
pushfq
or      [rsp+18h+var_18], 100h ; 置位TF
popfq
syscall                 ; TF置位,FMASK不屏蔽 syscall异常
mov     r10, rcx
mov     ecx, 0C0000084h
pop     rax
pop     rdx
wrmsr
mov     rax, r10
retn

简而言之,通过设置IA32_FMASK,去掉TF单步位,从而导致syscall的时候产生异常,此时进入#DB异常,RIP在堆栈,PG检测RIP和原先的KiSyscall64是否一样,不一样则PG;

0x3-2-1 攻击方法(猜想)

  • 拦截IA32_FMASK的读写
  • 拦截TF异常,比较堆栈RIP是否是自己的Hook的KiSystemCall64,是则直接返回


GitHub地址:https://github.com/Oxygen1a1/trashed-vt-syscallhook
image.png

免费评分

参与人数 1威望 +1 吾爱币 +15 热心值 +1 收起 理由
苏紫方璇 + 1 + 15 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!

查看全部评分

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

zdw77 发表于 2023-1-9 16:23
这个开了是干嘛用的,求科普?
宿命棋局 发表于 2023-1-9 16:35
 楼主| oxygen1a1 发表于 2023-1-9 16:42
 楼主| oxygen1a1 发表于 2023-1-9 16:44
zdw77 发表于 2023-1-9 16:23
这个开了是干嘛用的,求科普?

用来Hook syscall这条指令
MIAIONE 发表于 2023-1-9 18:22
zdw77 发表于 2023-1-9 16:23
这个开了是干嘛用的,求科普?

HOOK内核里的系统调用的, 因为要修改IA32_LSTAR得重写SYSCALL64, 而PG会检查RIP和原先SYSCALL64是否一样, 为了不触发bsod, 也要通过拦截IA32_FMASK的读写/TF异常, 然后自己判断是不是自己的SYSCALL64, 是就PASS, 最后绕过PG来hook, 64 位系统微软不让随便hook了, 而是推荐内核回调, 所以比较麻烦

免费评分

参与人数 1吾爱币 +1 收起 理由
oxygen1a1 + 1 热心回复!

查看全部评分

562411486 发表于 2023-1-9 19:12
感谢分析 》。。。推荐内核回调,
luodaoyi 发表于 2024-3-27 02:11
可以啊 感受下
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-11-24 15:50

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

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