VC驿站

 找回密码
 加入驿站

QQ登录

只需一步,快速开始

搜索
查看: 160|回复: 6

[分享] 今日一贴!驱动下的SSDT基地址获取

[复制链接]
75_avatar_middle
最佳答案
10 
online_supermod 发表于 2020-2-27 00:22:31 | 显示全部楼层 |阅读模式
本帖最后由 wl1383838438 于 2020-2-27 12:14 编辑

#include <ntddk.h>//驱动的头文件

//-------------------------------------------------------------------该代码测试在x86平台,x64未经测试,,,,,,,,

//只是入门  入门 而已



#pragma  pack(1)//内存按1字节对齐
//typedef 是为一个复杂的申明定义一个简单的 (名称)定义

游客,如果您要查看本帖隐藏内容请回复

//__declspec用于指定所给定类型的实例的与Microsoft相关的存储方式
//dllimport导入一个函数     目的是将后面 KeServiceDescriptorTable导入,
// KeServiceDescriptorTable是Serivce_t的引用,
__declspec(dllimport)Serivce_t KeServiceDescriptorTable;//导出函数,  导出的函数不可自定义并且结构体的中参数类型不能变,必须和导出函数一样的
//卸载例程
void UnloadDriver(PDRIVER_OBJECT pdriver)//该函数必须显式写出,否则驱动无法卸载
{
       
        KdPrint(("卸载成功"));//函数内部什么都不干
}

/*在进入DriverEntry函数之前IO管理器会调用ioInvalid_Derver_Object地址填满MajorFuntion数组,
该数组在Driver_Object的函数指针数组里面的每一个地址相对应的IRP消息,我们可以通过简单的设置这个数组将其与IRP派遣函数相关联(详情IRP了解)

*///  PDRIVER_OBJECT是一个结构体,
/*该结构体如下
typedef struct _DRIVER_OBJECT {
CSHORT              Type;//类型
CSHORT              Size;大小
PDEVICE_OBJECT      DeviceObject;设备对象
ULONG               Flags;标志
PVOID               DriverStart;
ULONG               DriverSize;设备大小
PVOID               DriverSection;
PDRIVER_EXTENSION   DriverExtension;  扩展设备对象--------该参数也是一个结构体   
UNICODE_STRING      DriverName;设备名
PUNICODE_STRING     HardwareDatabase;
PFAST_IO_DISPATCH   FastIoDispatch;
PDRIVER_INITIALIZE  DriverInit;
PDRIVER_STARTIO     DriverStartIo;
PDRIVER_UNLOAD      DriverUnload;// 卸载函数指向
PDRIVER_DISPATCH    MajorFunction[IRP_MJ_MAXIMUM_FUNCTION + 1];
} DRIVER_OBJECT;
typedef struct _DRIVER_OBJECT *PDRIVER_OBJECT;

-------------------------------------------------------PDRIVER_EXTENSION   DriverExtension; 参数的结构体
typedef struct _DEVICE_EXTENSION
{
PDEVICE_OBJECT fdo;                     //功能层设备对象
PDEVICE_OBJECT NextStackDevice;          //底层设备对象
UNICODE_STRING interfaceName;           //设备接口
UNICODE_STRING devName;               //设备名

PKINTERRUPT InterruptObject;                    // address of interrupt object
BOOLEAN mappedport;                                       //如果为真需要做IO端口映射
PVOID MemBar0;                                                //内存基地址0
ULONG nMem0;                                           //基地址BAR0占用字节数
ULONG DmaChannel;                       //DMA通道
PDMA_ADAPTER  DmaAdapter;               //DMA Adapter 对象
PALLOCATE_COMMON_BUFFER allocateCommonBuffer;  //分配连续的物理内存
//DMA函数
PFREE_COMMON_BUFFER freeCommonBuffer;  //释放连续的物理内存DMA函数
PPUT_DMA_ADAPTER putDmaAdapter;              //释放DMA Adapter对象

PHYSICAL_ADDRESS RegsPhyBase;           //寄存器物理地址首地址
PVOID RegsBase;                         //寄存器虚拟地址首地址
PHBA_REGS pHBARegs;
ULONG DmaPort;                          //设备DMA物理端口


}  DEVICE_EXTENSION, *PDEVICE_EXTENSION;
注:该设备扩展的定义针对了PCI驱动

----------------------------------------------------以上结构只需了解目前暂时用不上,可以不记,知道就行-------------------------------------------*/
NTSTATUS DriverEntry(PDRIVER_OBJECT pdriver, PUNICODE_STRING str)//动态库入口
{
        LONG*SSDT_ADR, SSDT_ADDR, SSDT_Process;//创建了3个参数其中一个是指针   这三个变量将在后面的函数中被调用
       

        SSDT_ADDR = (LONG)KeServiceDescriptorTable.ServiceTableBase;//取出服务描述表的基地址并且将其转为long赋值给SSDT_ADDR

        KdPrint(("当前服务描述表的地址是=%x", SSDT_ADDR)); //打印出当前的服务描述表基地址
        //关键的一步
        SSDT_ADR = (PLONG)(SSDT_ADDR + 0x7a * 4);//0x表示16进制,16进制的7a的十进制是122,利用Kernel Detective工具能看到该函数NtProcess的编号,指针的地址是4所以这乘以4
        //才能获取当前的地址

        KdPrint(("当前的SSDT_ADR=%x", SSDT_ADR));//打印当前的地址

        SSDT_Process = *SSDT_ADR;//将当前的地址赋给  SSDT-process

        KdPrint(("ssdt_process=%x", SSDT_Process));//打印出该值

        pdriver->DriverUnload = UnloadDriver;//卸载例程--该函数就是在PDRIVER_OBJECT结构的倒数2个参数   PDRIVER_UNLOAD      DriverUnload;// 卸载函数指向
}


今日一贴!驱动下的SSDT基地址获取

评分

参与人数 1驿站币 +2 热心值 +2 收起 理由
58_avatar_small thzzl + 2 + 2 支持原创!

查看全部评分





上一篇:今日一贴!Win10驱动搭建XP调试
下一篇:关于PE文件的异常表,选项卡式窗口

本帖被以下淘专辑推荐:

58_avatar_middle
最佳答案
26 
online_vip 发表于 2020-2-27 11:46:14 | 显示全部楼层
支持,必须的好好看看。
75_avatar_middle
最佳答案
10 
ico_lz  楼主| 发表于 2020-2-27 11:50:53 | 显示全部楼层
thzzl 发表于 2020-2-27 11:46
支持,必须的好好看看。

今日一贴!驱动下的SSDT基地址获取
04_avatar_middle
最佳答案
2 
online_vip 发表于 2020-2-27 12:11:52 | 显示全部楼层
应该说明下,这样获取SSDT的办法只适合x86系统,x64系统是不行的
75_avatar_middle
最佳答案
10 
ico_lz  楼主| 发表于 2020-2-27 12:13:51 | 显示全部楼层
xiao14116 发表于 2020-2-27 12:11
应该说明下,这样获取SSDT的办法只适合x86系统,x64系统是不行的

今日一贴!驱动下的SSDT基地址获取    下次 注意  嘿嘿    谢谢提醒
58_avatar_middle
最佳答案
26 
online_vip 发表于 2020-2-27 14:07:23 | 显示全部楼层
先学好X86在说,x64等有基础后在学。
89_avatar_middle
最佳答案
0 
在线会员 发表于 2020-3-2 17:12:04 | 显示全部楼层
感谢楼主分享
您需要登录后才可以回帖 登录 | 加入驿站 qq_login

本版积分规则

×【发帖 友情提示】
1、请回复有意义的内容,请勿恶意灌水;
2、纯数字、字母、表情等无意义的内容系统将自动删除;
3、若正常回复后帖子被自动删除,为系统误删的情况,请重新回复其他正常内容或等待管理员审核通过后会自动发布;
4、感谢您对VC驿站一如既往的支持,谢谢合作!

关闭

站长提醒上一条 /2 下一条

QQ|小黑屋|手机版|VC驿站 ( 辽ICP备09019393号 )|网站地图wx_jqr

GMT+8, 2020-4-4 10:52

Powered by CcTry.CoM

© 2009-2020 cctry.com

快速回复 返回顶部 返回列表