获取SSDT,SSSDT原始函数地址

本文介绍了在x64环境下获取SSDT(System Service Dispatch Table)和SSSDT(System Service Descriptor Table)原始地址的新方法。重点讲述了通过符号解析来确定SSDT名称,并提供了代码示例来查看SSDT原始函数地址。同时,文章提到了在没有dbghelp.dll和symsrv.dll的情况下,如何配置环境变量_NT_SYMBOL_PATH以从微软服务器下载pdb符号表文件。
摘要由CSDN通过智能技术生成

SSSDT的原始地址新的获取方法

时至今日发现我x64 下win32k.sys中W32pServiceTable是导出的... 一直没注意...


SSDT

当前函数地址 = KiSeviceTable + *(KiServiceTalbe + index * 4);
TableRVA = KiSeviceTable - 内核真实加载地址 ;
ImageBase = 0x140000000;(理想加载地址)
ImageKiSeviceTable = ImageBase + TableRVA;
LoadDLLBase = LoadLibrary("内核文件");


x64下 如果内核文件是以理想地址加载(0x140000000)的话那么在KiServiceTable里面的的地址就是理想函数地址
比如:NtReadFile 它在KiServiceTable下的0x18处(index = 4) 那么这个KiserviectTable+0x18位置处存储的就是NtReadFile地址,只不过它是理想地址
思路:我们首先得到基于PE镜像基址的KiServieTalbe的RVA
我们程序直接加载内核文件到进程(LoadLibrary或者映射文件),这个时候我们得到加载到进程的内核Base
这个Base + RVA 就是进程内存中的KiServieTable的地址
我们读这个地址的值(得到了基于理想地址的函数地址) 然后减去理想加载地址就得到了函数与内核加载地址的RVA
这个RVA在跟真实的内核加载地址相加就得到了原始的函数地址

这上面是SSDT--SSSDT一致 需要注意的是相对文件偏移和相对内存偏移

我这里使用符号获取SSSDT名

关于符号解析请看我上一篇文章

代码实现 查看SSSDT原始函数地址

一次显示100个 一共有837个

#include <windows.h>  
#include <stdio.h>  
#include <Dbghelp.h>  
#include <psapi.h>
  
#pragma comment(lib, "Dbghelp.lib")  
#pragma comment(lib, "Imagehlp.lib")  
 
//去除警告
PLOADED_IMAGE  
    IMAGEAPI  
    ImageLoad(  
    PCSTR DllName,  
    PCSTR DllPath  
    );  
  
  BOOL   
    IMAGEAPI   
    ImageUnload(  
    PLOADED_IMAGE LoadedImage    
    );  

  BOOL MapAndLoad(
    PSTR          ImageName,
    PSTR          DllPath,
    PLOADED_IMAGE LoadedImage,
    BOOL          DotDll,
    BOOL          ReadOnly
);

  BOOL UnMapAndLoad(
    PLOADED_IMAGE LoadedImage
);
 
  //SSSDT函数地址
ULONGLONG   sssdt[827] = {0};
ULONGLONG	g_w32pServiceTable = 0;
ULONGLONG		K = 0;
ULONG64		 ulBaseDll = 0; 
PLOADED_IMAGE  ploadImage = {0}; 
int  i = 0;

typedef struct _SHADOWFUNC  
{  
  CHAR FuncName[100];  
  ULONG64 FuncAddr;  
  
}SHA
本实例由VS2008开发,在提供了一套驱动开发框架的同时,又演示了如何获取Shadow SSDT表函数原始地址的办法。 主要函数:ULONG GetShadowSSDT_Function_OriAddr(ULONG index); 原理说明: 根据特征码搜索导出函数KeAddSystemServiceTable来获取Shadow SSDT基址,以及通过ZwQuerySystemInformation()函数获取win32k.sys基址,然后解析PE定位到Shadow SSDT在win32k.sys的偏移地址,并通过进一步计算来得到Shadow SSDT表函数原始地址。 这里只测试了三个函数:(460)NtUserMessageCall、(475)NtUserPostMessage和(502)NtUserSendInput,具体使用时可以举一反三,网上完整的源代码实例并不太多,希望可以帮到真正有需要的朋友。 系统环境: 在WinXP SP3系统 + 瑞星杀毒软件 打印输出: [ LemonInfo : Loading Shadow SSDT Original Address Driver... ] [ LemonInfo : 创建“设备”值为:0 ] [ LemonInfo : 创建“设备”成功... ] [ LemonInfo : 创建“符号链接”状态值为:0 ] [ LemonInfo : 创建“符号链接”成功... ] [ LemonInfo : 驱动加载成功... ] [ LemonInfo : 派遣函数(DispatchRoutine) IRP 开始... ] [ LemonInfo : 派遣函数(DispatchRoutine) IRP Enter IRP_MJ_DEVICE_CONTROL... ] [ LemonInfo : 获取ShadowSSDT表 (460)NtUserMessageCall 函数的“当前地址”为:0xB83ECFC4,“起源地址”为:0xBF80EE6B ] [ LemonInfo : 获取ShadowSSDT表 (475)NtUserPostMessage 函数的“当前地址”为:0xB83ECFA3,“起源地址”为:0xBF8089B4 ] [ LemonInfo : 获取ShadowSSDT表 (502)NtUserSendInput 函数的“当前地址”为:0xBF8C31E7,“起源地址”为:0xBF8C31E7 ] [ LemonInfo : 派遣函数(DispatchRoutine) IRP_MJ_DEVICE_CONTROL 成功执行... ] [ LemonInfo : 派遣函数(DispatchRoutine) IRP 结束... ] [ LemonInfo : UnLoading Shadow SSDT Original Address Driver... ] [ LemonInfo : 删除“符号链接”成功... ] [ LemonInfo : 删除“设备”成功... ] [ LemonInfo : 驱动卸载成功... ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值