rootkit hook之[六] -- sysenter Hook

另类HOOK 以KiFastSystemCall为例 标题的另类并非什么高新技术, 说白了仍是满大街的inline hook, 只不过它为解决可patch空间不足提供了一种有限的解决方案, 本文以早期32位windows系统的以KiFastSystemCall为例. 阅读详情
作 者: combojiang
时 间: 2008-02-26,12:25
链 接: 
http://bbs.pediy.com/showthread.php?t=60247

呵呵,今天这篇内容少,比较简单。

SYSENETER是一条汇编指令,它是在Pentium® II 处理器及以上处理器中提供的,是快速系统调用的一部分。SYSENTER/SYSEXIT这对指令专门用于实现快速调用。在这之前是采用INT 0x2E来实现的。INT 0x2E在系统调用的时候,需要进行栈切换的工作。由于Interrupt/Exception Handler的调用都是通过 call/trap/task这一类的gate来实现的,这种方式会进行栈切换,并且系统栈的地址等信息由TSS提供。这种方式可能会引起多次内存访问 (来获取这些切换信息),因此,从PentiumII开始,IA-32引入了新指令:SYSENTER/SYSEXIT。 有了这两条指令,
从用户级到特权级的堆栈以及指令指针的转换,可以通过这一条指令来实现,并且,需要切换到的新堆栈的地址,以及相应过程的第一条指令的位置,都有一组特殊寄存器来实现,这类特殊寄存器在IA-32中称为MSR(Model Specific Register)。这里牵涉到3个特殊寄存器: 
SYSENTER_CS_MSR: New code segment selector   0x174 
SYSENTER_ESP_MSR: New Stack Pointer                0x175 
SYSENTER_EIP_MSR: New Instruction Pointer        0x176 
这里标出的3个16进制数分别对应这3个寄存器的地址,该地址用于Kernel debug时,通过rdmsr/wrmsr指令来读/写这3个寄存器。步骤如下:
名称:  10.JPG
查看次数: 674
文件大小:  8.0 KB
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例程 

名称:  11.JPG
查看次数: 669
文件大小:  7.0 KB
1. SYSENTER_CS_MSR+16装载到 CS寄存器 
2. 将EDX的值送入EIP 
3. SYSENTER_CS_MSR+24 装载到SS寄存器 
4. 将ECX的值送入ESP 
5. 切换回RING3 
6. 执行EIP处的RING3指令 

我们在windbg中可以看看这个三个寄存器的情况,这个是我机器里的情况。
lkd> rdmsr 176
msr[176] = 00000000`8053dad0
lkd> rdmsr 175
msr[175] = 00000000`ba4e0000
lkd> rdmsr 174
msr[174] = 00000000`00000008

可以看到,我的机器里面当前SYSENTER_EIP_MSR,SYSENTER_ESP_MSR,SYSENTER_CS_MSR这三个寄存器的值。

我们在微软公开的内核WRK中发现关于这三个寄存器的设置,其中SYSENTER_EIP_MSR设置的值是KiFastCallEntry。
代码如下:
VOID
KiLoadFastSyscallMachineSpecificRegisters(
    IN PLONG Context
    )

/*++

Routine Description:

    Load MSRs used to support Fast Syscall/return.  This routine is
    run on all processors.

Arguments:

    None.

Return Value:

    None.

--*/

{
    PKPRCB Prcb;

    UNREFERENCED_PARAMETER (Context);

    if (KiFastSystemCallIsIA32) {

        Prcb = KeGetCurrentPrcb();

        //
        // Use Intel defined way of doing this.
        //

        WRMSR(MSR_SYSENTER_CS,  KGDT_R0_CODE);
        WRMSR(MSR_SYSENTER_EIP, (ULONGLONG)(ULONG)KiFastCallEntry);
        WRMSR(MSR_SYSENTER_ESP, (ULONGLONG)(ULONG)Prcb->DpcStack);

    }
}

看看我电脑的情况如下:
lkd> rdmsr 176
msr[176] = 00000000`8053dad0
lkd> u 8053dad0
nt!KiFastCallEntry:
8053dad0 b923000000      mov     ecx,23h
8053dad5 6a30            push    30h
8053dad7 0fa1            pop     fs
8053dad9 8ed9            mov     ds,cx
8053dadb 8ec1            mov     es,cx
8053dadd 8b0d40f0dfff    mov     ecx,dword ptr ds:[0FFDFF040h]
8053dae3 8b6104          mov     esp,dword ptr [ecx+4]
8053dae6 6a23            push    23h

下面是rootkit.com上的一个例子,这个例子有点不厚道,在你卸载的时候会bsod.我简单修改了下,贴代码如下:
#include "ntddk.h"

ULONG d_origKiFastCallEntry; // Original value of ntoskrnl!KiFastCallEntry

VOID OnUnload( IN PDRIVER_OBJECT DriverObject )
{
    _asm
    {
          mov ecx, 0x176
        xor edx,edx
        mov eax, d_origKiFastCallEntry     // Hook function address
        wrmsr                        // Write to the IA32_SYSENTER_EIP register
      }
}

// Hook function
__declspec(naked) MyKiFastCallEntry()
{
  __asm {
    jmp [d_origKiFastCallEntry]
  }
}

NTSTATUS DriverEntry( IN PDRIVER_OBJECT theDriverObject, IN PUNICODE_STRING theRegistryPath )
{
  theDriverObject->DriverUnload  = OnUnload; 

  __asm {
            mov ecx, 0x176
        rdmsr                 // read the value of the IA32_SYSENTER_EIP register
        mov d_origKiFastCallEntry, eax
        mov eax, MyKiFastCallEntry     // Hook function address
        wrmsr                        // Write to the IA32_SYSENTER_EIP register
  }

  return STATUS_SUCCESS;
}

注意一点,大家用windbg的时候,配置symbol path,如图:
名称:  9.JPG
查看次数: 676
文件大小:  17.0 KB

后面贴上一篇堕落天才写的文章链接:http://bbs.pediy.com/showthread.php?t=42705,
他inline hook 了KiFastCallEntry,采用detour方式,写得很不错。
 
 
 
上传的附件
文件类型: rarSysEnterHook.rar (2008-02-26 12:25, 973 字节, 245 次下载)
修改MSR对syscall指令HOOK 修改MSR(lstar)对syscall指令HOOK. 本身在win7 x64 sp1使用VS2013开发。 立即下载

相关推荐

支持x64,反一切R3下的常规Hook,完全基于Baby大佬的KiFastSystemCall-易语言

前言 本程序完全基于Baby大佬的Kernel,保留Baby大佬的一切权限! 原理部分介绍: 以“OpenProcess”这个大家熟悉的API为例子: 程序若其中任意一步被Hook,则相当于“OpenProcess”被Hook了 但是,这也启发了我们一些东西,假如我们去直接用SSDT编号调用Api的话,是不是相当于接近了内核,那么直接Hook“OpenProcess”或者“ZwOpenProcess”是也无效了?(理论上,这个方法可以绕过R3下一切的常规Hook,我们根本没有调用“ZwOpenProcess”,IAT,EAT钩子理论上全部失效!) 程序例子: 首先先编写好代码:没有Hook下直接调用ZwSuspendProcess: 有Hook的情况下: 这时调用KiSuspendProcess: 你会发现,Hook根本对它没有效果,程序任然按照计划执行的 最后声明 本程序完全基于Baby大佬的Kernel,保留Baby大佬的一切权限!

Rootkit---HOOK内核驱动

当插入一个内核驱动时,一般会使用工具insmod,该工具实际上调用了系统调用init_module,在该系统调用函数中,首先调用 load_module,把用户空间传入的整个内核模块文件创建成一个内核模块,返回一个struct module结构体。内核中便以这个结构体代表这个内核模块。 init_module系统调用定义,可以看到主要是调用了load_module。 在load_module中,主要prepare_coming_module,准备将内核模块进行加载。 prepare_coming_mo

q759451733的博客 1785

Rootkit端口隐藏技术_rootkithook_hook_rootkit_creature2ka_隐藏驱动

ROOTKIT 利用hook技术可以隐藏指定的端口 需要以驱动加载的形式把hook加载进内核 这里利用了insdrv工具

VT Msr Hook Syscall

VT Hook Syscall

小烟的博客 1396

liquibase介绍

1、Liquibase还是Flyway Flyway和Liquibase都支持专业数据库重构和版本控制所需的所有功能,因此您将始终知道要处理的数据库模式的版本以及它是否与软件版本匹配。两种工具都集成在Maven或Gradle构建脚本中以及Spring Boot生态系统中,因此您可以完全自动化数据库重构。 Flyway使用SQL定义数据库更改,因此您可以定制SQL脚本,使其与基础数据库技术(例如Oracle或PostgreSQL)良好地配合使用。另一方面,使用Liquibase,您可以通过使用XML,YA

赶路人儿 7534

解决UNITE数据库注释高unassigned率:手把手教你训练专属真菌分类器(含预训练模型分享)

本文针对使用UNITE数据库进行真菌ITS序列注释时出现的高未分配率问题,提供了详细的实战解决方案。通过对比vsearch直接注释与Naive Bayes分类器的原理差异,文章手把手指导读者在QIIME 2环境中训练专属分类器,包括数据准备、模型训练、参数优化及效果验证,并分享了预训练模型,旨在显著提升真菌群落分析的注释准确性和数据利用率。

weixin_29214199的博客 338

Rootkit之HOOK小结

目前接触的HOOK总结,学习HOOK只是为了让我对内核更加熟悉,我对那些毛的病毒木马没毛兴趣。 Windows平台上HOOK: 应用层HOOK:1.消息HOOK:局部钩子、全局钩子、全局低级键盘钩子之类2.IAT HOOK:通过修改IAT(导入表)表中的地址 过程就是先取DOS头,再取PE头偏移,再获取导入信息,其中的FirstThunk就是IAT偏移,再遍历,这样就找到了IAT表3.EAT...

weixin_33729196的博客 302

数字逻辑设计大程——以撒的结合(Verilog语言)

前言 在大二学习数字逻辑设计课程(即计算机组成课程的前引课)时,期末大程题目我和同组的github成员lwaekfjlk 决定写一款基于Verilog语言的游戏。原型是我们两人都非常喜爱的一款游戏——The Binding of Isaac: Rebirth。在三天三夜的奋战后,基本完成了预期目标。由于亲自编写了其中种种,我们深知新手初期使用Verilog语言有多困难。而可悲的是,这又是之后计算机组成课程和体系结构课程所需的!因此,我们将top部分源码放在这里,供同袍们参考。若想引用还请注明出处。 代码部分

LuvLucifer的博客 1386

【原创】rootkit hook之[六] -- sysenter Hook

标 题: 【原创】rootkit hook之[六] -- sysenter Hook 作 者: combojiang 时 间: 2008-02-26,12:25:40 链 接: http://bbs.pediy.com/showthread.php?t=60247 呵呵,今天这篇内容少,比较简单。 SYSENETER是一条汇编指令,它是在Pentium® II 处理器及以上处理器

多媒体编程、网络编程、系统编程、网络安全编程、驱动编程 1347

电动汽车远程监控与诊断软件:BMW ConnectedDrive EV远程监控二次开发_7.数据安全与隐私保护

数据加密是保护数据安全的重要手段之一。在电动汽车远程监控与诊断软件中,加密技术可以确保数据在传输过程中的安全性和完整性。常见的加密技术包括对称加密和非对称加密。

zhubeibei168的博客 886

【MATLAB例程】三维下的IMM(交互式多模型),模型使用CV(匀速)和CA(匀加速),滤波使用EKF。附完整代码

CV模型:状态包含位置、速度和零加速度(9维状态),状态转移矩阵忽略加速度项CA模型:完整包含位置、速度和加速度(9维状态),状态转移矩阵包含二次项过程噪声矩阵Q分别根据两种模型的运动特性推导。

985工科博士毕业,专攻定位、导航和滤波等算法研究。从业10年,主要使用MATLAB 561

另一种sysenter hook方法(绕过绝大多数的rootkit检测工具的检测)

标 题: 【原创】另一种sysenter hook方法(绕过绝大多数的rootkit检测工具的检测)作 者: 堕落天才时 间: 2007-04-14,11:09链 接: http://bbs.pediy.com/showthread.php?t=42705************************************************************************

yaneng的专栏 1196

computer planetary——全球生物多样性信息机构 (GBIF)

正如npartitions所表明的,这个Parquet数据集是由许多单独的parquet文件组成的。(GBIF) 是一个由世界各国政府资助的国际网络和数据基础设施,提供记录物种发生的全球数据。重新处理数据的原因有多种,包括主干分类的更改,因此该日期不一定是发生记录最后更改的日期。GBIF 发生数据集结合了来自广泛来源的数据,包括来自自然历史博物馆的标本相关数据、来自公民科学网络的观察和自动环境调查。为了了解最常观察到的物种,我们将对数据集进行分组,并获得每个物种的计数。大多数字段名称对应于。

此星光明博客 1636

必备绝技——hook大法(中)

 【文章标题】: 必备绝技——hook大法( 中 )【文章作者】: LvG【作者邮箱】: LvG2008@gmail.com【作者声明】: 只是感兴趣,没有其他目的。失误之处敬请诸位大侠赐教!--------------------------------------------------------------------------------【详细过程】  这次主要说说核心层的hook。包

1678

【ComfyUI】Flux 图像扩展

本文介绍了一个基于Flux扩图技术的ComfyUI工作流,能够智能扩展图像尺寸并保持内容连贯性。该流程通过扩散模型与条件编码的结合,对图像边缘进行语义填充生成,适用于艺术创作、海报设计等场景。工作流包含图像加载、外扩填充、文本编码、扩散采样等核心节点,采用Flux1-fill-dev等专业模型确保生成质量。演示效果显示,系统能自然延伸原图内容,保持风格统一。该技术可广泛应用于插画扩展、摄影增强、游戏场景构建等领域,显著提升创意工作效率。

Mr数据杨 930

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

转30行Hook KiFastCallEntry

膜拜一下 #include ULONG d_origKiFastCallEntry; // Original value of ntoskrnl!KiFastCallEntry VOID OnUnload( IN PDRIVER_OBJECT DriverObject ) { DbgPrint("ROOTKIT: OnUnload called\n"); } __decl

XboxMicro 979

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

SSDT HOOK

文章标题】: 必备绝技——hook大法( 中 ) 【文章作者】: LvG 【作者邮箱】: LvG2008@gmail.com 【作者声明】: 只是感兴趣,没有其他目的。失误之处敬请诸位大侠赐教! --------------------------------------

whispermemory的专栏 4073

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

必备绝技——hook大法( 中 )

2010-06-19 05:34 必备绝技——hook大法( 中 ) 【文章标题】: 必备绝技——hook大法( 中 ) 【文章作者】: LvG 【作者邮箱】: LvG2008@gmail.com 【作者声明】: 只是感兴趣,没有其他目的。失误之处敬请诸位大侠赐教! -------------------------------------------------------

xuankuwa的专栏 798
上一篇: 游戏修改的常用方法之一——远程读写内存(asm源码详注)
下一篇: 机器狗0625技术剖析(驱动读写磁盘扇区
iiprogram
博客等级 码龄25年 1068粉丝 1515原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值