HOOK钩子技术4 SSDT HOOK

本文深入探讨了Windows系统中的SSDT(System Service Dispatch Table)Hook技术,详细介绍了API调用过程,从RING3到RING0的转换,并通过示例展示了如何在SSDT中找到并替换原始API函数地址,以实现Hook。内容涵盖了SSDT技术原理、Ring3和Ring0的调试方法以及Hook的实战应用。
摘要由CSDN通过智能技术生成

API 调用过程

以一个demo测试为例,本测试查看OpenProcessR3-R0 下的调用。

// test.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"
#include <windows.h>
#include <stdio.h>


int main(int argc, char* argv[])
{
//  __asm int 3
    HANDLE handle = OpenProcess(PROCESS_ALL_ACCESS,FALSE,2548);
    printf("handle=%08x",handle);
    return 0;
}

RING3

载入OD具体分析调用。

ring3 application space
00401028  |.  8BF4          mov esi, esp
0040102A  |.  68 F4090000   push 0x9F4       ; /ProcessId = 9F4
0040102F  |.  6A 00         push 0x0         ; |Inheritable = FALSE
00401031  |.  68 FF0F1F00   push 0x1F0FFF    ; |Access = PROCESS_ALL_ACCESS
00401036  |.  FF15 4CA14200 call dword ptr ds:[<&KERNEL32.OpenProcess>]  ; \OpenProcess

此时由测试进程模块 进入到kernel32 模块

--kernel32.dll (OpenProcess)
7C830A0B    8975 E8         mov dword ptr ss:[ebp-0x18], esi
7C830A0E    8975 F0         mov dword ptr ss:[ebp-0x10], esi
7C830A11    8975 F4         mov dword ptr ss:[ebp-0xC], esi
7C830A14    FF15 1C11807C   call dword ptr ds:[<&ntdll.NtOpenProcess>]; ntdll.ZwOpenProcess

----ntdll.dll(NtOpenProcess (or ZWOpenProcess))
7C92D5E0 >  B8 7A000000     mov eax, 0x7A
7C92D5E5    BA 0003FE7F     mov edx, 0x7FFE0300
7C92D5EA    FF12            call dword ptr ds:[edx]                            ; ntdll.KiFastSystemCall

7C92E4F0 >  8BD4            mov edx, esp
7C92E4F2    0F34            sysenter                                           ; ring3->ring0
7C92E4F4 >  C3              retn

在R3下的函数调用过程:本地模块->kernel32(openprocess)->ntdll(zwOpenProcess)->ntdll(sysenter)

ring3级别的函数调用栈回朔
地址       堆栈       函数过程 / 参数                       调用来自                      结构
........   ........        sysenter                          ntdll.KiFastSystemCall+0xC(7C92E4F2) ...
0012FEE0   7C92D5EC   包含ntdll.KiFastSystemCall              ntdll.7C92D5EA                0012FF1C
0012FEE4   7C830A1A   ntdll.ZwOpenProcess                   kernel32.7C830A14             0012FF1C
0012FF20   0040103C   kernel32.OpenProcess                  test.00401036                 0012FF1C
0012FF24   001F0FFF     Access = PROCESS_ALL_ACCESS
0012FF28   00000000     Inheritable = FALSE
0012FF2C   000009F4     ProcessId = 9F4
0012FF84   00401239   test.00401005                         test.<模块入口点>+0E4              0012FF80

也可以用windbg 去查看,更简单,但是调试就不能是local kernel 模式了,往windbg 中拖拽一个可执行文件后,查看结构

0:000> u kernel32!openprocess l30            //l30表示取30条指令,只求多,不求少
kernel32!OpenProcess:
7c8309d1 8bff            mov     edi,edi
7c8309d3 55              push    ebp
7c8309d4 8bec            mov     ebp,esp
7c8309d6 83ec20          sub     esp,20h
7c8309d9 8b4510          mov     eax,dword ptr [ebp+10h]
7c8309dc 8945f8          mov     dword ptr [ebp-8],eax
7c8309df 8b450c          <
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值