读取无保护的SSDT表中的NtOpenProcess函数的当前地址
2013-06-12 17:27
330 查看
// 无技术含量,是抄来的
,驱动已入门的请飘过
/************************************************************************
* 文件名称:Driver.h
* 作 者:
* 完成日期:
*************************************************************************/
#pragma once //保证头文件只被编译一次
#include <ntddk.h>
#define ULONG unsigned long
#define PAGEDCODE code_seg("PAGE") /*表示内存不足时,可以被置换到硬盘 的代码段*/
#define INITCODE code_seg("INIT") /*指的代码运行后 就从内存释放掉 的代码段*/
//结构体声明
typedef struct _ServiceDescriptorTable {
PVOID ServiceTableBase; //System Service Dispatch Table 的基地址
//包含着 SSDT 中每个服务被调用次数的计数器,这个计数器一般由sysenter 更新
PVOID ServiceCounterTable;
unsigned int NumberOfServices;//由 ServiceTableBase 描述的服务的数目
PVOID ParamTableBase; //包含每个系统服务参数字节数表的基地址-系统服务参数表
}*PServiceDescriptorTable;
extern PServiceDescriptorTable KeServiceDescriptorTable;
// 函数声明
NTSTATUS CreateDevice (IN PDRIVER_OBJECT pDriverObject);
VOID HelloDDKUnload (IN PDRIVER_OBJECT pDriverObject);
NTSTATUS HelloDDKDispatchRoutine(IN PDEVICE_OBJECT pDevObj,
IN PIRP pIrp);
/*******************************************************************************************************************************************************/
/****************************************************************Driver.c*******************************************************************************/
/************************************************************************
* 文件名称:Driver.c
* 作 者:
* 完成日期:
*************************************************************************/
#include "Driver.h"
/************************************************************************
* 函数名称:DriverEntry
* 功能描述:初始化驱动程序,定位和申请硬件资源,创建内核对象
* 参数列表:
pDriverObject:从I/O管理器中传进来的驱动对象
pRegistryPath:驱动程序在注册表的中的路径
* 返回 值:返回初始化驱动状态
*************************************************************************/
#pragma INITCODE //表示内存不足时,可以被置换到硬盘 的代码段
NTSTATUS DriverEntry (
IN PDRIVER_OBJECT pDriverObject,
IN PUNICODE_STRING pRegistryPath
)
{
NTSTATUS status;
LONG *SSDT_Adr,SSDT_NtOpenProcess_Cur_Addr,t_addr;
KdPrint(("驱动成功被加载中...............\n"));
#if DBG
_asm int 3
#endif
//读取SSDT表
// 读取SSDT表中索引值为0x7A的函数
//[KeServiceDescriptorTable]+0x7a*4
t_addr=(LONG)KeServiceDescriptorTable->ServiceTableBase;
KdPrint(("当前ServiceTableBase地址为%x \n",t_addr));
SSDT_Adr=(PLONG)(t_addr+0x7A*4);
KdPrint(("当前t_addr+0x7A*4=%x \n",SSDT_Adr));
SSDT_NtOpenProcess_Cur_Addr=*SSDT_Adr;
KdPrint(("当前SSDT_NtOpenProcess_Cur_Addr地址为%x \n",SSDT_NtOpenProcess_Cur_Addr));
//注册其他驱动调用函数入口
pDriverObject->DriverUnload = HelloDDKUnload;
pDriverObject->MajorFunction[IRP_MJ_CREATE] = HelloDDKDispatchRoutine;
pDriverObject->MajorFunction[IRP_MJ_CLOSE] = HelloDDKDispatchRoutine;
pDriverObject->MajorFunction[IRP_MJ_WRITE] = HelloDDKDispatchRoutine;
pDriverObject->MajorFunction[IRP_MJ_READ] = HelloDDKDispatchRoutine;
pDriverObject->MajorFunction[IRP_MJ_DEVICE_CONTROL] = HelloDDKDispatchRoutine;
//创建驱动设备对象
status = CreateDevice(pDriverObject);
KdPrint(("DriverEntry end\n"));
return status;
}
/************************************************************************
* 函数名称:CreateDevice
* 功能描述:初始化设备对象
* 参数列表:
pDriverObject:从I/O管理器中传进来的驱动对象
* 返回 值:返回初始化状态
*************************************************************************/
#pragma INITCODE //指的代码运行后 就从内存释放掉
NTSTATUS CreateDevice (
IN PDRIVER_OBJECT
pDriverObject)
{
NTSTATUS status;
PDEVICE_OBJECT pDevObj;//用来返回创建设备
// 创建设备名称
UNICODE_STRING devName; // 用于存放设备名称
UNICODE_STRING symLinkName; // 用于存放符号链接名称
// 对devName初始化字串为 "\\Device\\junDDKDevice"
RtlInitUnicodeString(&devName,L"\\Device\\junDDKDevice");
// 创建设备
status = IoCreateDevice( pDriverObject,
0,
&devName,
FILE_DEVICE_UNKNOWN,
0, TRUE,
&pDevObj );
if (!NT_SUCCESS(status))
{
if (status==STATUS_INSUFFICIENT_RESOURCES)
{
KdPrint(("资源不足 STATUS_INSUFFICIENT_RESOURCES"));
}
if (status==STATUS_OBJECT_NAME_EXISTS )
{
KdPrint(("指定对象名存在 STATUS_OBJECT_NAME_EXISTS"));
}
if (status==STATUS_OBJECT_NAME_COLLISION)
{
KdPrint(("对象名有冲突 STATUS_OBJECT_NAME_COLLISION"));
}
KdPrint(("设备创建失败......"));
return status;
}
KdPrint(("设备创建成功...++++++++"));
pDevObj->Flags |= DO_BUFFERED_IO;
// 创建符号链接
RtlInitUnicodeString(&symLinkName,L"\\??\\junHelloDDK");
status = IoCreateSymbolicLink( &symLinkName,&devName );
if (!NT_SUCCESS(status)) // status等于0
{
IoDeleteDevice( pDevObj );
return status;
}
return STATUS_SUCCESS;
}
/************************************************************************
* 函数名称:HelloDDKUnload
* 功能描述:负责驱动程序的卸载操作
* 参数列表:
pDriverObject:驱动对象
* 返回 值:返回状态
*************************************************************************/
#pragma PAGEDCODE //表示内存不足时,可以被置换到硬盘 的代码段
VOID HelloDDKUnload (IN PDRIVER_OBJECT pDriverObject)
{
PDEVICE_OBJECT pDev; // 用来取得要删除设备对象
UNICODE_STRING symLinkName;// 由驱动对象得到设备对象
pDev=pDriverObject->DeviceObject;
IoDeleteDevice(pDev); // 删除设备
// 取符号链接名字
RtlInitUnicodeString(&symLinkName,L"\\??\\junHelloDDK");
// 删除符号链接
IoDeleteSymbolicLink(&symLinkName);
KdPrint(("驱动成功被卸载...OK-----------"));
DbgPrint("卸载成功");
}
/************************************************************************
* 函数名称:HelloDDKDispatchRoutine
* 功能描述:对读IRP进行处理
* 参数列表:
pDevObj:功能设备对象
pIrp:从IO请求包
* 返回 值:返回状态
*************************************************************************/
#pragma PAGEDCODE /*表示内存不足时,可以被置换到硬盘 的代码段*/
NTSTATUS HelloDDKDispatchRoutine(IN PDEVICE_OBJECT pDevObj,
IN PIRP pIrp)
{
KdPrint(("进入派遣函数 ******\n"));
// 完成IRP
pIrp->IoStatus.Status = STATUS_SUCCESS; // 设置IRP的状态为成功
pIrp->IoStatus.Information = 0;
// 设置操作的字节数为0
IoCompleteRequest( pIrp, IO_NO_INCREMENT ); // 指示完成此IRP
KdPrint(("离开派遣函数......\n")); // 打印调试信息
return STATUS_SUCCESS; // 返回成功
}
/**************************************************************************************************************************************/
//下面是写给自己的:
编译的时候发现一个错误
错误起因:
KdPrint(("Enter DriverEntry成功加载++++++\n"));
ULONG SSDT_NtOpenProcess_Cur_Addr;
syntax error missing ';' before 'type'
改为:
ULONG SSDT_NtOpenProcess_Cur_Addr;
KdPrint(("Enter DriverEntry成功加载++++++\n"));
,驱动已入门的请飘过
/************************************************************************
* 文件名称:Driver.h
* 作 者:
* 完成日期:
*************************************************************************/
#pragma once //保证头文件只被编译一次
#include <ntddk.h>
#define ULONG unsigned long
#define PAGEDCODE code_seg("PAGE") /*表示内存不足时,可以被置换到硬盘 的代码段*/
#define INITCODE code_seg("INIT") /*指的代码运行后 就从内存释放掉 的代码段*/
//结构体声明
typedef struct _ServiceDescriptorTable {
PVOID ServiceTableBase; //System Service Dispatch Table 的基地址
//包含着 SSDT 中每个服务被调用次数的计数器,这个计数器一般由sysenter 更新
PVOID ServiceCounterTable;
unsigned int NumberOfServices;//由 ServiceTableBase 描述的服务的数目
PVOID ParamTableBase; //包含每个系统服务参数字节数表的基地址-系统服务参数表
}*PServiceDescriptorTable;
extern PServiceDescriptorTable KeServiceDescriptorTable;
// 函数声明
NTSTATUS CreateDevice (IN PDRIVER_OBJECT pDriverObject);
VOID HelloDDKUnload (IN PDRIVER_OBJECT pDriverObject);
NTSTATUS HelloDDKDispatchRoutine(IN PDEVICE_OBJECT pDevObj,
IN PIRP pIrp);
/*******************************************************************************************************************************************************/
/****************************************************************Driver.c*******************************************************************************/
/************************************************************************
* 文件名称:Driver.c
* 作 者:
* 完成日期:
*************************************************************************/
#include "Driver.h"
/************************************************************************
* 函数名称:DriverEntry
* 功能描述:初始化驱动程序,定位和申请硬件资源,创建内核对象
* 参数列表:
pDriverObject:从I/O管理器中传进来的驱动对象
pRegistryPath:驱动程序在注册表的中的路径
* 返回 值:返回初始化驱动状态
*************************************************************************/
#pragma INITCODE //表示内存不足时,可以被置换到硬盘 的代码段
NTSTATUS DriverEntry (
IN PDRIVER_OBJECT pDriverObject,
IN PUNICODE_STRING pRegistryPath
)
{
NTSTATUS status;
LONG *SSDT_Adr,SSDT_NtOpenProcess_Cur_Addr,t_addr;
KdPrint(("驱动成功被加载中...............\n"));
#if DBG
_asm int 3
#endif
//读取SSDT表
// 读取SSDT表中索引值为0x7A的函数
//[KeServiceDescriptorTable]+0x7a*4
t_addr=(LONG)KeServiceDescriptorTable->ServiceTableBase;
KdPrint(("当前ServiceTableBase地址为%x \n",t_addr));
SSDT_Adr=(PLONG)(t_addr+0x7A*4);
KdPrint(("当前t_addr+0x7A*4=%x \n",SSDT_Adr));
SSDT_NtOpenProcess_Cur_Addr=*SSDT_Adr;
KdPrint(("当前SSDT_NtOpenProcess_Cur_Addr地址为%x \n",SSDT_NtOpenProcess_Cur_Addr));
//注册其他驱动调用函数入口
pDriverObject->DriverUnload = HelloDDKUnload;
pDriverObject->MajorFunction[IRP_MJ_CREATE] = HelloDDKDispatchRoutine;
pDriverObject->MajorFunction[IRP_MJ_CLOSE] = HelloDDKDispatchRoutine;
pDriverObject->MajorFunction[IRP_MJ_WRITE] = HelloDDKDispatchRoutine;
pDriverObject->MajorFunction[IRP_MJ_READ] = HelloDDKDispatchRoutine;
pDriverObject->MajorFunction[IRP_MJ_DEVICE_CONTROL] = HelloDDKDispatchRoutine;
//创建驱动设备对象
status = CreateDevice(pDriverObject);
KdPrint(("DriverEntry end\n"));
return status;
}
/************************************************************************
* 函数名称:CreateDevice
* 功能描述:初始化设备对象
* 参数列表:
pDriverObject:从I/O管理器中传进来的驱动对象
* 返回 值:返回初始化状态
*************************************************************************/
#pragma INITCODE //指的代码运行后 就从内存释放掉
NTSTATUS CreateDevice (
IN PDRIVER_OBJECT
pDriverObject)
{
NTSTATUS status;
PDEVICE_OBJECT pDevObj;//用来返回创建设备
// 创建设备名称
UNICODE_STRING devName; // 用于存放设备名称
UNICODE_STRING symLinkName; // 用于存放符号链接名称
// 对devName初始化字串为 "\\Device\\junDDKDevice"
RtlInitUnicodeString(&devName,L"\\Device\\junDDKDevice");
// 创建设备
status = IoCreateDevice( pDriverObject,
0,
&devName,
FILE_DEVICE_UNKNOWN,
0, TRUE,
&pDevObj );
if (!NT_SUCCESS(status))
{
if (status==STATUS_INSUFFICIENT_RESOURCES)
{
KdPrint(("资源不足 STATUS_INSUFFICIENT_RESOURCES"));
}
if (status==STATUS_OBJECT_NAME_EXISTS )
{
KdPrint(("指定对象名存在 STATUS_OBJECT_NAME_EXISTS"));
}
if (status==STATUS_OBJECT_NAME_COLLISION)
{
KdPrint(("对象名有冲突 STATUS_OBJECT_NAME_COLLISION"));
}
KdPrint(("设备创建失败......"));
return status;
}
KdPrint(("设备创建成功...++++++++"));
pDevObj->Flags |= DO_BUFFERED_IO;
// 创建符号链接
RtlInitUnicodeString(&symLinkName,L"\\??\\junHelloDDK");
status = IoCreateSymbolicLink( &symLinkName,&devName );
if (!NT_SUCCESS(status)) // status等于0
{
IoDeleteDevice( pDevObj );
return status;
}
return STATUS_SUCCESS;
}
/************************************************************************
* 函数名称:HelloDDKUnload
* 功能描述:负责驱动程序的卸载操作
* 参数列表:
pDriverObject:驱动对象
* 返回 值:返回状态
*************************************************************************/
#pragma PAGEDCODE //表示内存不足时,可以被置换到硬盘 的代码段
VOID HelloDDKUnload (IN PDRIVER_OBJECT pDriverObject)
{
PDEVICE_OBJECT pDev; // 用来取得要删除设备对象
UNICODE_STRING symLinkName;// 由驱动对象得到设备对象
pDev=pDriverObject->DeviceObject;
IoDeleteDevice(pDev); // 删除设备
// 取符号链接名字
RtlInitUnicodeString(&symLinkName,L"\\??\\junHelloDDK");
// 删除符号链接
IoDeleteSymbolicLink(&symLinkName);
KdPrint(("驱动成功被卸载...OK-----------"));
DbgPrint("卸载成功");
}
/************************************************************************
* 函数名称:HelloDDKDispatchRoutine
* 功能描述:对读IRP进行处理
* 参数列表:
pDevObj:功能设备对象
pIrp:从IO请求包
* 返回 值:返回状态
*************************************************************************/
#pragma PAGEDCODE /*表示内存不足时,可以被置换到硬盘 的代码段*/
NTSTATUS HelloDDKDispatchRoutine(IN PDEVICE_OBJECT pDevObj,
IN PIRP pIrp)
{
KdPrint(("进入派遣函数 ******\n"));
// 完成IRP
pIrp->IoStatus.Status = STATUS_SUCCESS; // 设置IRP的状态为成功
pIrp->IoStatus.Information = 0;
// 设置操作的字节数为0
IoCompleteRequest( pIrp, IO_NO_INCREMENT ); // 指示完成此IRP
KdPrint(("离开派遣函数......\n")); // 打印调试信息
return STATUS_SUCCESS; // 返回成功
}
/**************************************************************************************************************************************/
//下面是写给自己的:
编译的时候发现一个错误
错误起因:
KdPrint(("Enter DriverEntry成功加载++++++\n"));
ULONG SSDT_NtOpenProcess_Cur_Addr;
syntax error missing ';' before 'type'
改为:
ULONG SSDT_NtOpenProcess_Cur_Addr;
KdPrint(("Enter DriverEntry成功加载++++++\n"));
相关文章推荐
- 内核编程之SSDTHook(2)Hook NtOpenProcess实现进程保护
- 读取SSDT当前函数地址
- 读取SSDT当前函数地址
- HOOK SSDT NtOpenProcess 保护进程
- 获取NtOpenProcess的当前地址和原函数地址
- SSDT HOOK,通过hook NtOpenProcess达到保护制定进程效果
- r0调用ntOpenprocess函数枚举进程
- 根据索引号读出SSDT表当前函数地址
- Hook SSDT NtOpenProcess的完整代码
- YJX_Driver_018_读出SSDT表当前函数地址
- Hook SSDT NtOpenProcess的完整代码
- 过NtOpenProcess保护的方法总结
- 通过windbg 得到我们要 hook 的api 地址的方法以及 hook NtOpenProcess 的例子。。。
- NtOpenProcess被HOOK,跳回原函数地址后仍然无法看到进程
- 64位下Hook NtOpenProcess的实现进程保护 + 源码 (升级篇 )
- SSDT的例子2-NtOpenProcess
- NtOpenProcess被HOOK,跳回原函数地址后仍然无法看到进程
- NtOpenProcess被HOOK,跳回原函数地址后仍然无法看到进程
- 新手学ssdt_hook_ntopenprocess
- Hook SSDT NtOpenProcess的完整代码