IoGetCurrentProcess 反汇编分析

本文通过WinDbg反汇编IoGetCurrentProcess函数,详细解析了其内部实现原理,展示了如何从KPCR获取当前线程信息,并最终返回当前进程的EPROCESS结构。

希望高手们飘过,小弟只是把学习心得记一下,以备以后查找,

用WINDBG反汇编IoGetCurrentProcess

如下:

kd> uf IoGetCurrentProcess
nt!PsGetCurrentProcess:
804ef4f2 64a124010000    mov     eax,dword ptr fs:[00000124h]
804ef4f8 8b4044          mov     eax,dword ptr [eax+44h]
804ef4fb c3              ret

可见 IoGetCurrentProcess- 实际调用->PsCetCurrentProcess

 

在WDK 文档中了解到PsGetCurrentProcess

如下:

PEPROCESS 
  PsGetCurrentProcess(
    VOID
    );

看来返回的是一个EPROCESS 的指针

 

从反汇编中返回的是EAX

mov     eax,dword ptr fs:[00000124h]
在内核模式下FS指向的是KPCR(Kernel's Processor Control Region)结构而不是RING3 下PEB

至于KPCR结构的作用我还不了解至知道与线程调度有关,好像每个CPU都有系统给他分配的一个KPCR结构 用于调度线程,

以后再分析

看一下KPCR结构

kd> dt _KPCR
nt!_KPCR
   +0x000 NtTib            : _NT_TIB
   +0x01c SelfPcr          : Ptr32 _KPCR
   +0x020 Prcb             : Ptr32 _KPRCB
   +0x024 Irql             : UChar
   +0x028 IRR              : Uint4B
   +0x02c IrrActive        : Uint4B
   +0x030 IDR              : Uint4B
   +0x034 KdVersionBlock   : Ptr32 Void
   +0x038 IDT              : Ptr32 _KIDTENTRY
   +0x03c GDT              : Ptr32 _KGDTENTRY
   +0x040 TSS              : Ptr32 _KTSS
   +0x044 MajorVersion     : Uint2B
   +0x046 MinorVersion     : Uint2B
   +0x048 SetMember        : Uint4B
   +0x04c StallScaleFactor : Uint4B
   +0x050 DebugActive      : UChar
   +0x051 Number           : UChar
   +0x052 Spare0           : UChar
   +0x053 SecondLevelCacheAssociativity : UChar
   +0x054 VdmAlert         : Uint4B
   +0x058 KernelReserved   : [14] Uint4B
   +0x090 SecondLevelCacheSize : Uint4B
   +0x094 HalReserved      : [16] Uint4B
   +0x0d4 InterruptMode    : Uint4B
   +0x0d8 Spare1           : UChar
   +0x0dc KernelReserved2  : [17] Uint4B
   +0x120 PrcbData         : _KPRCB
既然FS:[0]指向KPCR

那么,eax,dword ptr fs:[00000124h]
是KPCR 120处 KPRCB(内核进程控制快在内中而EPROCESS 在执行层的进程信息快,两者不同)偏移4的一个至给了EAX

 

接下来看一下KPRCB结构

 

nt!_KPRCB
   +0x000 MinorVersion     : Uint2B
   +0x002 MajorVersion     : Uint2B
   +0x004 CurrentThread    : Ptr32 _KTHREAD
   +0x008 NextThread       : Ptr32 _KTHREAD
   +0x00c IdleThread       : Ptr32 _KTHREAD
   ..................................结构太大了就不全部列出来了

他的004偏移处就是指向_KTHREAD(内核线程)指针

那么PsGetCurrentProcess

第一句返汇编就出来了

 

804ef4f2 64a124010000    mov     eax,dword ptr fs:[00000124h] eax=KPCR(fs:[120])->KPRCB偏移4处的地址( CurrentThread    : Ptr32 _KTHREAD

得到EAX就是当前线程的KTHREAD结构

 

查看KTHREAD结构以展开的形式

kd> dt _KTHREAD -v -r
nt!_KTHREAD
struct _KTHREAD, 74 elements, 0x1c0 bytes
   +0x000 Header           : struct _DISPATCHER_HEADER, 6 elements, 0x10 bytes
      +0x000 Type             : UChar
      +0x001 Absolute         : UChar
      +0x002 Size             : UChar
      +0x003 Inserted         : UChar
      +0x004 SignalState      : Int4B
      +0x008 WaitListHead     : struct _LIST_ENTRY, 2 elements, 0x8 bytes
         +0x000 Flink            : Ptr32 to struct _LIST_ENTRY, 2 elements, 0x8 bytes
         +0x004 Blink            : Ptr32 to struct _LIST_ENTRY, 2 elements, 0x8 bytes
   +0x010 MutantListHead   : struct _LIST_ENTRY, 2 elements, 0x8 bytes
      +0x000 Flink            : Ptr32 to struct _LIST_ENTRY, 2 elements, 0x8 bytes
         +0x000 Flink            : Ptr32 to struct _LIST_ENTRY, 2 elements, 0x8 bytes
         +0x004 Blink            : Ptr32 to struct _LIST_ENTRY, 2 elements, 0x8 bytes
      +0x004 Blink            : Ptr32 to struct _LIST_ENTRY, 2 elements, 0x8 bytes
         +0x000 Flink            : Ptr32 to struct _LIST_ENTRY, 2 elements, 0x8 bytes
         +0x004 Blink            : Ptr32 to struct _LIST_ENTRY, 2 elements, 0x8 bytes
   +0x018 InitialStack     : Ptr32 to Void
   +0x01c StackLimit       : Ptr32 to Void
   +0x020 Teb              : Ptr32 to Void
   +0x024 TlsArray         : Ptr32 to Void
   +0x028 KernelStack      : Ptr32 to Void
   +0x02c DebugActive      : UChar
   +0x02d State            : UChar
   +0x02e Alerted          : [2] UChar
   +0x030 Iopl             : UChar
   +0x031 NpxState         : UChar
   +0x032 Saturation       : Char
   +0x033 Priority         : Char
   +0x034 ApcState         : struct _KAPC_STATE, 5 elements, 0x18 bytes
      +0x000 ApcListHead      : [2] struct _LIST_ENTRY, 2 elements, 0x8 bytes
         +0x000 Flink            : Ptr32 to struct _LIST_ENTRY, 2 elements, 0x8 bytes
         +0x004 Blink            : Ptr32 to struct _LIST_ENTRY, 2 elements, 0x8 bytes
      +0x010 Process          : Ptr32 to struct _KPROCESS, 29 elements, 0x6c bytes

第二句反汇编:804ef4f8 8b4044          mov     eax,dword ptr [eax+44h]
既然已经知道EAX->KTHREAD结构那么 这里的EAX=KTHREAD 44偏移处的内容

从上结构得到 44处  +0x010 Process          : Ptr32 to struct _KPROCESS, 29 elements, 0x6c bytes

所以此时EAX=KPROCESS结构的地址,

到此为之 PsGetCurrentProcess 就返回了 RET  那就想不是WDK帮助中不是说返回EPROCESS 的指针吗?这里怎么返回

了KPROCESS PCB的指针地址呢,,纳闷啊,我想了半天才明白,

原因是EPROCESS 的第一项就只KPROCESS PCB 既然得到了EPROCESS第一项的地址,也就可以说得到了EPROCESS的地址啊,

所以说PsGetCurrentProcess 既返回了当前进程的KPROCESS PCB 结构又返回了执行体的EPROCESS结构

 

EPROCESS 如下:

kd> dt _EPROCESS
nt!_EPROCESS
   +0x000 Pcb              : _KPROCESS
   +0x06c ProcessLock      : _EX_PUSH_LOCK
   +0x070 CreateTime       : _LARGE_INTEGER
   +0x078 ExitTime         : _LARGE_INTEGER
.........................

 

大部分从网上学习而来,我也在不断探索中,希望对大家有帮助,这样的文摘网上多的是,我也是为了自己学习留下笔记,

有什么错误大家指出,我们共同进步,,谢谢,

 

******************************************************************************* nt!DbgBreakPointWithStatus: fffff805`7affd0b0 cc int 3 kd> ed nt!Kd_DEFAULT_Mask 0xFFFFFFFF kd> ed nt!Kd_IHVDRIVER_Mask 0xFFFFFFFF kd> g [+] [DriverEntry] 驱动加载开始 [+] [DriverEntry] 驱动加载成功 [+] [ProcessNotifyCallback] 目标进程 oxygen.exe 创建 (PID: 2852) [+] [ProcessNotifyCallback] 工作线程已创建 [+] Worker thread started for hook installation [+] [InstallHook] 找到目标函数地址: FFFFF8057B2EFB60 [PTE_HOOK] 写入前内存 (0xFFFFCF812E591000): F5 55 75 FF 77 F5 DF F7 FD F5 75 5D 7F 75 [PTE_HOOK] 写入后内存 (0xFFFFCF812E591000): FF 25 00 00 00 00 E0 14 2B 80 05 F8 FF FF [PTE_HOOK] 跳板指令写入成功: 0xFFFFCF812E591000 -> 0xFFFFF805802B14E0 [PTE_HOOK] Hook安装成功!跳板指令: jmp [0xFFFFCF812E591006] -> 0xFFFFF805802B14E0 [+] [InstallHook] Hook 成功安装. 跳板地址: FFFFCF812E591000 Break instruction exception - code 80000003 (first chance) obpcallback!InstallHook+0xf6: fffff805`802b1396 cc int 3 kd> g Break instruction exception - code 80000003 (first chance) ******************************************************************************* * * * You are seeing this message because you pressed either * * CTRL+C (if you run console kernel debugger) or, * * CTRL+BREAK (if you run GUI kernel debugger), * * on your debugger machine's keyboard. * * * * THIS IS NOT A BUG OR A SYSTEM CRASH * * * * If you did not intend to break into the debugger, press the "g" key, then * * press the "Enter" key now. This message might immediately reappear. If it * * does, press "g" and "Enter" again. * * * ******************************************************************************* nt!DbgBreakPointWithStatus: fffff805`7affd0b0 cc int 3 kd> u FFFFCF812E591000 ffffcf81`2e591000 ff2500000000 jmp qword ptr [ffffcf81`2e591006] ffffcf81`2e591006 e014 loopne ffffcf81`2e59101c ffffcf81`2e591008 2b8005f8ffff sub eax,dword ptr [rax-7FBh] ffffcf81`2e59100e ffd5 call rbp ffffcf81`2e591010 fd std ffffcf81`2e591011 5f pop rdi ffffcf81`2e591012 dd75f5 fnsave [rbp-0Bh] ffffcf81`2e591015 5d pop rbp kd> dq 0xFFFFCF812E591000 ffffcf81`2e591000 14e00000`000025ff d5ffffff`f805802b ffffcf81`2e591010 f77d5df5`75dd5ffd f5f57d75`5f755777 ffffcf81`2e591020 7555555f`d5555d5d 55f5555d`7d555555 ffffcf81`2e591030 55555555`55555555 55555555`55555555 ffffcf81`2e591040 55555555`55555555 55555555`55555555 ffffcf81`2e591050 55555555`55555555 55555555`55555555 ffffcf81`2e591060 55555555`55555555 55555555`55555555 ffffcf81`2e591070 55555555`55555555 55555555`55555555 kd> u FFFFF805802B14E0 obpcallback!MyObReferenceObjectByHandleWithTag [C:\Users\17116\source\repos\obpcallback\obpcallback\源.cpp @ 1003]: fffff805`802b14e0 44884c2420 mov byte ptr [rsp+20h],r9b fffff805`802b14e5 4c89442418 mov qword ptr [rsp+18h],r8 fffff805`802b14ea 89542410 mov dword ptr [rsp+10h],edx fffff805`802b14ee 48894c2408 mov qword ptr [rsp+8],rcx fffff805`802b14f3 4883ec68 sub rsp,68h fffff805`802b14f7 ff15fb2b0000 call qword ptr [obpcallback!_imp_IoGetCurrentProcess (fffff805`802b40f8)] fffff805`802b14fd 4889442448 mov qword ptr [rsp+48h],rax fffff805`802b1502 488b4c2448 mov rcx,qword ptr [rsp+48h] kd> u FFFFF805802B14E0 obpcallback!MyObReferenceObjectByHandleWithTag [C:\Users\17116\source\repos\obpcallback\obpcallback\源.cpp @ 1003]: fffff805`802b14e0 44884c2420 mov byte ptr [rsp+20h],r9b fffff805`802b14e5 4c89442418 mov qword ptr [rsp+18h],r8 fffff805`802b14ea 89542410 mov dword ptr [rsp+10h],edx fffff805`802b14ee 48894c2408 mov qword ptr [rsp+8],rcx fffff805`802b14f3 4883ec68 sub rsp,68h fffff805`802b14f7 ff15fb2b0000 call qword ptr [obpcallback!_imp_IoGetCurrentProcess (fffff805`802b40f8)] fffff805`802b14fd 4889442448 mov qword ptr [rsp+48h],rax fffff805`802b1502 488b4c2448 mov rcx,qword ptr [rsp+48h] 检测打印结果,看看是什么原因导致hook没效果
最新发布
06-25
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值