驱动编程-ssdt hook--系统服务表

整理下自己的驱动编程。

ssdt是系统服务表,每个window系统都会维护自己的系统服务表。我们可以使用kernel detective看下ssdt表。

以openProcess为例子:

开windbg

kd> u nt!ZwOpenProcess
nt!ZwOpenProcess:
804ff720 b87a000000      mov     eax,7Ah  //7A
804ff725 8d542404        lea     edx,[esp+4]
804ff729 9c              pushfd
804ff72a 6a08            push    8
804ff72c e850ed0300      call    nt!KiSystemService (8053e481)
804ff731 c21000          ret     10h
nt!ZwOpenProcessToken:
804ff734 b87b000000      mov     eax,7Bh
804ff739 8d542404        lea     edx,[esp+4]

ZwOpenPeocess的开头

mov     eax,7Ah

7A的十进制就是190对应的ssdt表的第190个。


现在来说下openProcess的hook方法

分为两种:

修改ssdt表:

修改ssdt表的第190地址,在修改之前先保存原来的ssdt地址,然后跳到自己定义的MyopenProcess,在MyOpenProcess结束跳回原来保存的地址。这种修改方法容易被检测出来。


inline hook:

第二种修改openProcess函数的入口使用jmp跳转到自己的函数上,据我所知,大部分保护驱动都是这样的。


代码献上:

miniddk.cpp

#include "miniDDK.h"
#include "SSDT.h"
#include "IDThook.h"

#pragma INITCODE 
extern "C" NTSTATUS DriverEntry(PDRIVER_OBJECT pDriverObject,PUNICODE_STRING b){
	//=================Init============================

	//分开注册 派遣函数
	KdPrint(("\n\n驱动被加载----------\n"));
	pDriverObject->MajorFunction[IRP_MJ_CREATE]=ddk_DispatchRoutine_CREATE;
	pDriverObject->MajorFunction[IRP_MJ_CLOSE]=ddk_DispatchRoutine_CLOSE;
	pDriverObject->MajorFunction[IRP_MJ_READ]=ddk_DispatchRoutine_READ;
	pDriverObject->MajorFunction[IRP_MJ_WRITE]=ddk_DispatchRoutine_WRITE;
	pDriverObject->MajorFunction[ IRP_MJ_DEVICE_CONTROL]=ddk_DispatchRoutine_CONTROL;
	CreateMyDriver(pDriverObject);
	pDriverObject->DriverUnload = DDK_Unload;
	//=================Init============================

	

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值