还原SSDT函数驱动#include <ntddk.h>
#include <WinDef.h>
typedef struct ServiceDescriptorEntry {
unsigned int *ServiceTableBase;
unsigned int *ServiceCounterTableBase; //仅适用于checked build版本
unsigned int NumberOfServices;
unsigned char *ParamTableBase;
} ServiceDescriptorTableEntry_t, *PServiceDescriptorTableEntry_t;
__declspec(dllimport) ServiceDescriptorTableEntry_t KeServiceDescriptorTable;#define SYSTEMSERVICE(_function) KeServiceDescriptorTable.ServiceTableBase[ *(PULONG)((PUCHAR)_function+1)]#pragma pack(1)
typedef struct _JMPCODE//定义JMP结构
{
BYTE  E9;//JMP机器码
ULONG JMPADDR;//要跳转的地址
}JMPCODE,*PJMPCODE;
#pragma pack()JMPCODE CurCode;//保存当前前5字节 以便恢复
PJMPCODE pcur;//一直指向当前函数地址
BOOL bHook=FALSE;ULONG GetNt_OldAddr(PUNICODE_STRING FuncName);//得到原函数地址
VOID MyDriverUnload(PDRIVER_OBJECT driver);NTSTATUS DriverEntry(PDRIVER_OBJECT driver,PUNICODE_STRING reg_path)
{
ULONG  CurAddr,OldAddr,JmpAddr;
UNICODE_STRING FuncName;
RtlCopyUnicodeString(&FuncName,L"NtOpenProcess"); __asm int 3 DbgPrint("进入驱动\n"); __asm int 3 CurAddr=(ULONG)(SYSTEMSERVICE(NtOpenProcess));
OldAddr=GetNt_OldAddr(&FuncName); __asm int 3 if (CurAddr!=OldAddr)
{
bHook=TRUE;
DbgPrint("NtOpenProcess被HOOK了.\n");
JmpAddr=OldAddr-CurAddr-5;//计算JMP地址 公式:原函数地址-当前函数地址-5 pcur=(PJMPCODE)CurAddr;//初始化指向当前函数地址
CurCode.E9=pcur->E9;//保存当前前5字节
CurCode.JMPADDR=pcur->JMPADDR; __asm //去掉页面保护
{
cli;
mov eax,cr0
and eax,0FFFEFFFFh
mov cr0,eax
}
pcur->E9=0xE9;
pcur->JMPADDR=JmpAddr;
__asm //恢复页保护
{
mov eax,cr0
or  eax,10000h
mov cr0,eax
sti;
}
DbgPrint("反Hook成功!\n");
}
driver->DriverUnload=MyDriverUnload;
return STATUS_SUCCESS;
}ULONG GetNt_OldAddr(PUNICODE_STRING FuncName)
{
ULONG OldAddr;
OldAddr=(ULONG)MmGetSystemRoutineAddress(FuncName);
return OldAddr;
}
VOID MyDriverUnload(PDRIVER_OBJECT driver)
{
if (bHook)
{
__asm //去掉页面保护
{
cli;
mov eax,cr0
and eax,0FFFEFFFFh
mov cr0,eax
}
pcur->E9=CurCode.E9;
pcur->JMPADDR=CurCode.JMPADDR;
__asm //恢复页保护
{
mov eax,cr0
or  eax,10000h
mov cr0,eax
sti;
}
DbgPrint("还原成功!\n");
}
DbgPrint("驱动成功卸载.\n");
}一加载驱动就蓝屏,貌似是结构体定义有问题?
入口函数 “进入驱动”调试信息都不输出
初学者,望指点

解决方案 »

  1.   

    不进入驱动怎么会蓝屏你加了 __asm int 3 中断,那你的系统就要启动调试模式,用WINDEBUG去调试,如果系统不进入调试模式,那中断的时候就会蓝屏
    如果你只是输出调试信息,你不要加 __asm int 3 ,然后用dbgview 去查看
      

  2.   

    __asm int 3 中断是我为了在windbg调试时加的
    去掉之后 加载确实蓝屏
    没有输出DbgPrint("进入驱动\n");
    这个
      

  3.   

    windbg接上了没? 一来就int 3断下来了吗?同意楼上lz还是先把int 3 中断关了吧.......用Windbg跟踪下出错点,另外如果是Win7的系统注意看看有没有PatchGuard.
      

  4.   

    windbg接上了
    跟踪出错点 提示是Break instruction exception 百度了 不知道啥玩意