天马阁

 找回密码
 立即注册
                                        →→→→→→→→→→→→ 1点击查看所有VIP教程目录长列表(总教程数269个) 2办理VIP详情进入 ←←←←←←←←←←←←
1 x64CE与x64dbg入门基础教程 7课 已完结 2 x64汇编语言基础教程 16课 已完结 3 x64辅助入门基础教程 9课 已完结 4 C++x64内存辅助实战技术教程 149课 已完结
5 C++x64内存检测与过检测技术教程 10课 已完结 6 C+x64二叉树分析遍历与LUA自动登陆教程 19课已完结 7 C++BT功能原理与x64实战教程 29课 已完结 8 C+FPS框透视与自瞄x64实现原理及防护思路 30课完结
64驱?封? 9 64反驱? 10 64位V? 11 绝? 12 ???课?
13 64透 ? 14 64U ? 15 64Q ? 16 64功 ?
17 64U ? 18 64模 ? 19 64多 ? 20 64网 ?
21 64注 ? 22 64火 ? 23 64棋 ? 24 64自二链L?
25 64破 ? VIP会员办理QQ: 89986068   
【请先加好友,然后到好友列表双击联系客服办理,不然可能无法接受到信息。】
27 加入2000人交流群637034024 3 28 免责声明?
查看: 1429|回复: 0

认识与Hook SYSENTER 加源码

[复制链接]

11

主题

0

回帖

13

积分

编程入门

Rank: 1

天马币
22
发表于 2024-3-6 09:23:10 | 显示全部楼层 |阅读模式
其实所有的HOOK,都基本是一样道理。就是勾住你的目标函数,实现你自己的功能。只要你掌握了,HOOK的原理。剩下的就是寻找目标函数了。

     今天回忆一下 HOOK SYSENTER。

一:认识SYSENTER

   SYSENTER是一个东西?大家都知道调用门,陷阱门,任务门(这里没有照片!_!).。通过他们我们可以从R3到达R0。简单的说SYSENTER就是他们的替代品。SYSENTER是一个入的

过程,SYSEXIT是他的反过程。

我们以OpenProcess为例,看看他是怎么从R3-R0

kernel32!OpenProcess -> ntdll!ZwOpenProcess -> ntdll!KiFastSystemCall -> sysenter -> nt!KiFastCallEntry -> nt!NtOpenProcess -> nt!KiFastCallEntry> nt!

KiServiceExit -> sysexit -> ntdll!KiFastSystemCallRet -> kernel32!OpenProcess

现在来看看SYSENTER是怎么样处理的。

R3-R0需要把相关的工作交给R0层的。包括:设置CS,IP,SS,SP。SYSENTER有三个特殊的寄存器(MSR)来帮助我们完成。

SYSENTER_CS_MSR

SYSENTER_ESP_MSR

SYSENTER_EIP_MSR

他们的地址分别是:0x174,0x175,0x176。我们可以通过指令rdmsr/wrmsr。来读写这三个寄存器。相关代码如下:

_asm
{
    mov ecx,0x176
    rdmsr
    mov OldKiFastCallEntry,eax
}

我们来看看SYSENTER的工作流程。


1. 装载SYSENTER_CS_MSR 到CS 寄存器,设置目标代码段
2. 装载SYSENTER_EIP_MSR到 EIP寄存器,设置目标指令
3. SYSENTER_CS_MSR+8 装载到SS寄存器 ,设置栈段
4. 装载SYSENTER_ESP_MSR 到ESP寄存器,设置栈帧
5. 切换RING0.
6. 清除 EFLAGS的 VM标志
7. 执行RING0例程

SYSEXIT的工作流程

1. SYSENTER_CS_MSR+16装载到 CS寄存器
2. 将EDX的值送入EIP
3. SYSENTER_CS_MSR+24 装载到SS寄存器
4. 将ECX的值送入ESP
5. 切换回RING3
6. 执行EIP处的RING3指令

这样就完成了R3-RO-R3的过程。


二:相关代码

//////////////////////////////////////////////////
// Hook SysEnter.cpp文件


extern "C"
{
#include <ntddk.h>
}


VOID UnloadDriver(PDRIVER_OBJECT pDriverObj);


ULONG OldKiFastCallEntry;


VOID NewKiFastCallEntry()
{
DbgPrint("一个系统调用...\n");
_asm
{
   jmp DWORD PTR[OldKiFastCallEntry]

}
}

// 驱动程序加载时调用DriverEntry例程
NTSTATUS DriverEntry(PDRIVER_OBJECT pDriverObj, PUNICODE_STRING pRegistryString)
{
pDriverObj->DriverUnload = UnloadDriver;
//
_asm
{
   mov ecx,0x176
   rdmsr
   mov OldKiFastCallEntry,eax
   mov eax,NewKiFastCallEntry
   wrmsr
}

// 请视情况返回DriverEntry例程执行结果
return STATUS_SUCCESS;
}


VOID UnloadDriver(PDRIVER_OBJECT pDriverObj)
{
_asm
{
   mov ecx,0x176
   xor edx,edx
   mov eax,OldKiFastCallEntry
   wrmsr
}
}

回复

使用道具 举报

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

本版积分规则

天马阁|C/C++辅助教程|安卓逆向安全| 论坛导航|免责申明|Archiver||网站地图
拒绝任何人以任何形式在本论坛发表与中华人民共和国法律相抵触的言论,本站内容均为会员发表,并不代表天马阁立场!
任何人不得以任何方式翻录、盗版或出售本站视频,一经发现我们将追究其相关责任!
我们一直在努力成为最好的编程论坛!
Copyright© 2010-2021 All Right Reserved.
快速回复 返回顶部 返回列表