linux vc打印指针地址,今日一贴!驱动下的SSDT基地址获取

本帖最后由 wl1383838438 于 2020-2-27 12:14 编辑

#include //驱动的头文件

//-------------------------------------------------------------------该代码测试在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;// 卸载函数指向

}

a9081cca24a3446725b8a31b4462dcbf.gif

1.png (169.12 KB, 下载次数: 0)

2020-2-27 11:52 上传

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值