APP下载

SYSENTER-HOOK 技术分析

消息来源:baojiabao.com 作者: 发布时间:2026-05-14

报价宝综合消息SYSENTER-HOOK 技术分析

示例是对核心层进行 SYSENTER-HOOK 实现保护程序的功能。

SYSENTER-HOOK 也成称为 KiFastCallEntry-Hook,它相当于是核心层的Inline-Hook,通过修改SYSENTER_EIP_MSR 暂存器使其指向我们自己的函式,那么我们就可以在自己的的函式中对所有来自3环的函式呼叫进行第一手过滤。

一会儿会用到的 API 是 OpenProcess,在3环也就是使用者层呼叫此 API 它储存一些资讯传入到0环核心层后实际呼叫的是 ZwOpenProcess 函式,所以先使用OD随意开启一个 .exe 可执行程式。

然后在kernel32模组里面查询 OpenProcess 函式,经过2个 jmp 后进入下一层,找到一个call进入其中便是 ZwOpenProcess 的呼叫。

下面呼叫 API 程式码才是我们需要注意的,每个 API 函式呼叫时在进入关键函式之前都有:

一句汇编程式码 mov eax,0xXX,这是用 eax 储存一个呼叫号。

mov edx,0x7ffe0300,这用 edx 储存的是 KiFastSystemCall 函式。

呼叫号呼叫号的作用就相当于给函式指定一个序号,通过这个序号就能在核心层中找到我们要呼叫的函式。进入0环时呼叫号是 eax 传递的,但这个呼叫号并不只是一个普通的数字作为索引序号,系统会把他用32位资料表示,拆分成19:1:12的格式,如下:

其中0-11这低12位组成一个真正的索引号,第12位表示服务表号,13-31位没有使用。

KiFastSystemCall函式而 0x7ffe0300 储存的 KiFastSystemCall 函式的地址,因为下一条指令 SYSENTER 就是进入核心层,由于每个执行绪都有一套执行绪上下文,都有一个独立的栈。进入到核心后,核心也会使用自己的核心栈,所以这里先用 edx 储存栈顶 esp。

那么就要关注一个最重要的问题,SYSENTER 执行之后就进入到核心层,那到底进入到核心层的哪个地址?要想弄明白这个问题就需要了解执行 SYSENTER 指令系统到底做了些什么。

首先,SYSENTER 执行的时候,会读取三个特殊暂存器,从这三个特殊暂存器中取出核心栈的栈顶(esp),核心程式码段段选择子(cs),以及程式码的首地址(eip),储存这三个值得暂存器是MSR暂存器组。

这组暂存器没有名字,只有编号,由于没有名字,无法通过正常的汇编指令来存取值,Intel提供了两条指令来读写这些暂存器:

rdmsr 读取MSR暂存器。其中高32位存放在EDX,低32位存放在EAX(64位和32位是一样,只是64位时rdx和rcx的高32位会被清零),使用 ECX 传递暂存器编号。

wrmsr 写入 MSR 暂存器,和读取一样写入时是用EDX表示高32位,,EAX表示低32位,使用 ECX 传递暂存器编号。

也就是说,Windows在启动,进行初始化的时候会将核心栈栈顶,核心CS段选择子,以及程式码段地址(KiFastCallEntry 函式)的地址一一存放到MSR暂存器组的这几个编号的暂存器中。

当 SYSENTER 被执行,CPU 就直接使用这些暂存器的值来初始化真正的CS 、EIP、ESP 暂存器。因此,SYSENTER 执行之后,就跑到核心的 KiFastCallEntry 函式中执行程式码了。

而进行 SYSENTER-HOOK 时我们只需要关注程式码的地址(SYSENTER_EIP_MSR)即可,它的编号是0x176。

用类似于3环的 Inline-Hook 的方法,直接把该地址改为 jmp xxx,而xxx是我们自己的函式地址,这样就能实现 HOOK 了。具体用法如下:

安装钩子//安装钩子

void__declspec(naked) InstallHook

{

__asm

{

pusheax;

pushecx;

pushedx;

//储存原始函式

movecx, 0x176;//KiFastCallEntry函式地址的所在编号暂存器

rdmsr; //读取编号暂存器中的值到edx:eax

mov[g_OldKiFastCallEntry],eax;//储存

//替换自己的函式

moveax, MyKiFastCallEntry;

xoredx, edx;

wrmsr;//把自己的函式地址写入进入

popedx;

popecx;

popeax;

ret;

}

}

自己的函式//Hook关键程式码

void_declspec(naked) MyKiFastCallEntry

{

__asm

{

cmpeax, 0xbe;//对比是否是NtOpenProcess的呼叫号

jne_End; //不是则不处理

pusheax; //储存暂存器

moveax, [edx + 0x14];//获取第4个引数PCLIENT_ID

moveax, [eax];//获取PCLIENT_ID第一个字段PID

//PCLIENT_ID->UniqueProcess的值

cmpeax, g_Pid;//判断是否是要保护的程序

popeax;

jne_End;

cmp[edx + 0xc], 1;//判断是否是关闭操作

jne_End;

mov[edx + 0xc], 0;//是就把访问许可权设为无

_End:

jmpg_OldKiFastCallEntry;//呼叫原来的函式

}

}

编译生成.sys档案后使用工具安装驱动服务,然后开启工作管理员,关闭被保护的程序,就可以看到拒绝访问,到此保护程序就成功了。

在学习SYSENTER-HOOK 时,我们用3环的 Inline-Hook 对比著学习,这样可以加快对这种 HOOK 方法的理解。

核心层完整程式码如下:

#include

//原来的KiFastCallEntry

ULONG_PTR g_OldKiFastCallEntry = 0;

//要保护程序的ID

ULONG g_Pid = 5616;

ULONG g_Access = 1;//关闭许可权的宏PROCESS_TERMINATE

//安装钩子

voidInstallHook;

//解除安装钩子

voidUninstallHook;

//Hook关键程式码

voidMyKiFastCallEntry;

voidOutLoad(DRIVER_OBJECT* obj)

{

obj;

//解除安装钩子

UninstallHook;

}

//驱动入口主函式

NTSTATUS DriverEntry(DRIVER_OBJECT* driver, UNICODE_STRING* path)

{

path;

KdPrint(("驱动启动成功!\\n"));

DbgBreakPoint;

//安装钩子

InstallHook;

driver->DriverUnload = OutLoad;

return STATUS_SUCCESS;

}

//安装钩子

void __declspec(naked) InstallHook

{

__asm

{

push eax;

push ecx;

push edx;

//储存原始函式

mov ecx, 0x176;//KiFastCallEntry函式地址的所在编号暂存器

rdmsr; //读取编号暂存器中的值到edx:eax

mov [g_OldKiFastCallEntry],eax;//储存

//替换自己的函式

mov eax, MyKiFastCallEntry;

xor edx, edx;

wrmsr;//把自己的函式地址写入进入

pop edx;

pop ecx;

pop eax;

ret;

}

}

//解除安装钩子

voidUninstallHook

{

__asm

{

push eax;

push ecx;

push edx;

//还原原来的函式地址

mov ecx, 0x176;

mov eax, [g_OldKiFastCallEntry];

xor edx, edx;

wrmsr;

pop edx;

pop ecx;

pop eax;

}

}

//Hook关键程式码

void _declspec(naked) MyKiFastCallEntry

{

__asm

{

cmp eax, 0xbe;//对比是否是NtOpenProcess的呼叫号

jne _End; //不是则不处理

push eax; //储存暂存器

mov eax, [edx + 0x14];//获取第4个引数PCLIENT_ID

mov eax, [eax];//获取PCLIENT_ID第一个字段PID

//PCLIENT_ID->UniqueProcess的值

cmp eax, g_Pid;//判断是否是要保护的程序

pop eax;

jne _End;

cmp[edx + 0xc], 1;//判断是否是关闭操作

jne _End;

mov[edx + 0xc], 0;//是就把访问许可权设为无

_End:

jmp g_OldKiFastCallEntry;//呼叫原来的函式

}

}- End -

看雪ID:九阳道人

本文由看雪论坛 九阳道人 原创

转载请注明来自看雪社群

2019 看雪安全开发者峰会门票正在热售中!

长按识别下方二维码,即可享受 2.5折 优惠!

往期热门回顾

公众号ID:ikanxue

官方微博:看雪安全

商务合作:[email protected]

↙点选下方“阅读原文”,检视更多干货

2020-01-19 22:50:00

相关文章