首页
论坛
课程
招聘
combojiang
雪    币: 108
活跃值: 活跃值 (20)
能力值: ( LV13,RANK:1050 )
在线值:
发帖
44
回帖
766
粉丝
8

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

2008-2-26 12:25 36842

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

2008-2-26 12:25
36842
呵呵,今天这篇内容少,比较简单。

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个寄存器。步骤如下:

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例程


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,如图:


后面贴上一篇堕落天才写的文章链接:http://bbs.pediy.com/showthread.php?t=42705,
他inline hook 了KiFastCallEntry,采用detour方式,写得很不错。

[看雪官方培训]《安卓高级研修班(网课)》9月班开始招生!挑战极限、工资翻倍!

上传的附件:
最新回复 (25)
bzhkl
雪    币: 400
活跃值: 活跃值 (16)
能力值: ( LV12,RANK:240 )
在线值:
发帖
47
回帖
404
粉丝
0
bzhkl 活跃值 5 2008-2-26 12:31
2
0
昨天收到当当网的 ROOTKITS——Windows内核的安全防护 31.25RMB  开始看驱动了 这篇学习+收藏= =
安摧
雪    币: 212
活跃值: 活跃值 (10)
能力值: ( LV7,RANK:100 )
在线值:
发帖
22
回帖
348
粉丝
0
安摧 活跃值 2 2008-3-8 10:01
3
0
好帖需要我们这种菜鸟 顶起来!!!
NWMonster
雪    币: 100
活跃值: 活跃值 (12)
能力值: ( LV5,RANK:60 )
在线值:
发帖
26
回帖
458
粉丝
2
NWMonster 活跃值 1 2008-3-8 11:08
4
0
很强,我那本书在新华书店买的原价。
zhuwg
雪    币: 278
活跃值: 活跃值 (15)
能力值: ( LV12,RANK:470 )
在线值:
发帖
40
回帖
739
粉丝
1
zhuwg 活跃值 11 2008-3-9 11:00
5
0
学习...膜拜
stopfan
雪    币: 200
活跃值: 活跃值 (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
0
回帖
2
粉丝
0
stopfan 活跃值 2008-5-11 17:53
6
0
不顶枉为人啊
icqking
雪    币: 3
活跃值: 活跃值 (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
88
回帖
139
粉丝
0
icqking 活跃值 2008-5-11 19:33
7
0
强贴留名收藏.
水中雁
雪    币: 110
活跃值: 活跃值 (10)
能力值: ( LV6,RANK:90 )
在线值:
发帖
3
回帖
36
粉丝
0
水中雁 活跃值 2 2008-7-9 17:43
8
0
好贴,收藏了。
myyv
雪    币: 41
活跃值: 活跃值 (10)
能力值: ( LV3,RANK:20 )
在线值:
发帖
121
回帖
645
粉丝
0
myyv 活跃值 2008-7-9 17:57
9
0
hhhhhhhhhhhhhhhhhhhh
刘国华
雪    币: 119
活跃值: 活跃值 (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
1
回帖
235
粉丝
0
刘国华 活跃值 2008-7-16 08:53
10
0
强,膜拜楼主
玩命
雪    币: 6796
能力值: (RANK:1290 )
在线值:
发帖
61
回帖
454
粉丝
10
玩命 活跃值 31 2008-7-16 10:00
11
0
狂顶,,, 认真学习。。。
zeal
雪    币: 201
活跃值: 活跃值 (10)
能力值: ( LV9,RANK:250 )
在线值:
发帖
31
回帖
122
粉丝
0
zeal 活跃值 6 2008-7-16 23:57
12
0
轻轻的顶一下,楼主不介意吧
qpSmallBoy
雪    币: 0
活跃值: 活跃值 (10)
能力值: ( LV4,RANK:50 )
在线值:
发帖
12
回帖
34
粉丝
0
qpSmallBoy 活跃值 1 2008-7-17 16:51
13
0
汗!代码有眼熟哦!推翻WIndows内核一书的!!
mhxueshan
雪    币: 165
活跃值: 活跃值 (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
12
回帖
45
粉丝
0
mhxueshan 活跃值 2008-7-22 16:42
14
0
我能问一下
mov ecx,0x176
的作用吗?自己想了下没想出来
TGOS
雪    币: 200
活跃值: 活跃值 (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
3
回帖
69
粉丝
0
TGOS 活跃值 2008-7-22 21:09
15
0
不错的东西,学习学习
ahpho
雪    币: 202
活跃值: 活跃值 (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
0
回帖
3
粉丝
0
ahpho 活跃值 2008-7-24 11:34
16
0
象linux,unix会用到这指令吗?
vrowang123
雪    币: 212
活跃值: 活跃值 (10)
能力值: ( LV5,RANK:60 )
在线值:
发帖
75
回帖
586
粉丝
0
vrowang123 活跃值 1 2008-7-27 10:34
17
0
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
yooohk
雪    币: 201
活跃值: 活跃值 (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
4
回帖
8
粉丝
0
yooohk 活跃值 2008-11-29 03:54
18
0
mov d_origKiFastCallEntry, eax          //要保存入口,所以eax中是入口,这个先
2. 装载SYSENTER_EIP_MSR到 EIP寄存器,设置目标指令 //这个后,mov EIP,eax   //这里eax就是SYSENTER_EIP_MSR吗?是这样?
alexwe
雪    币: 200
活跃值: 活跃值 (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
0
回帖
4
粉丝
0
alexwe 活跃值 2009-1-10 16:28
19
0
拿走学习了!~~~~~~~~~
panderfly
雪    币: 411
活跃值: 活跃值 (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
0
回帖
30
粉丝
0
panderfly 活跃值 2010-9-21 13:58
20
0
研究 学习 再开发
panderfly
雪    币: 411
活跃值: 活跃值 (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
0
回帖
30
粉丝
0
panderfly 活跃值 2010-9-22 02:21
21
0
学习了
hyjxiaobia
雪    币: 2115
活跃值: 活跃值 (10)
能力值: ( LV7,RANK:110 )
在线值:
发帖
18
回帖
44
粉丝
1
hyjxiaobia 活跃值 2011-6-8 16:02
22
0
不错不错
,顶一下
hyjxiaobia
雪    币: 2115
活跃值: 活跃值 (10)
能力值: ( LV7,RANK:110 )
在线值:
发帖
18
回帖
44
粉丝
1
hyjxiaobia 活跃值 2011-6-9 19:57
23
0
顶一下下~~
hyjxiaobia
雪    币: 2115
活跃值: 活跃值 (10)
能力值: ( LV7,RANK:110 )
在线值:
发帖
18
回帖
44
粉丝
1
hyjxiaobia 活跃值 2011-6-10 15:29
24
0
请问,能不能在__declspec(naked) MyKiFastCallEntry()
{
  __asm {
    jmp [d_origKiFastCallEntry]
  }
}里加一些输出,能在dbgview里观察到
JuniorSun
雪    币: 2
活跃值: 活跃值 (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
0
回帖
3
粉丝
0
JuniorSun 活跃值 2012-8-15 13:33
25
0
经典啊经典,拜读
xgxzyb
雪    币: 36
活跃值: 活跃值 (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
0
回帖
7
粉丝
0
xgxzyb 活跃值 2014-5-9 15:49
26
0
好文章学习了
游客
登录 | 注册 方可回帖
返回