驱动之路_取原函数地址_判断是否被hook

event.h

#include <ntddk.h>
#define INITCODE code_seg("INIT") 
#define PAGECODE code_seg("PAGE") /*表示内存不足时,可以被置换到硬盘*/

VOID DDK_Unload (IN PDRIVER_OBJECT pDriverObject); //前置说明 卸载例程

typedef struct _ServiceDescriptorTable {
    PVOID ServiceTableBase; //System Service Dispatch Table 的基地址  
    PVOID ServiceCounterTable;
    //包含着 SSDT 中每个服务被调用次数的计数器。这个计数器一般由sysenter 更新。 
    unsigned int NumberOfServices;//由 ServiceTableBase 描述的服务的数目。  
    PVOID ParamTableBase; //包含每个系统服务参数字节数表的基地址-系统服务参数表 
}*PServiceDescriptorTable;  
extern PServiceDescriptorTable KeServiceDescriptorTable;
ULONG GetNt_CurAddr() //获取当前SSDT_NtOpenProcess的当前地址
{

    LONG *SSDT_Adr,SSDT_NtOpenProcess_Cur_Addr,t_addr; 
    KdPrint(("驱动成功被加载中.............................\n"));
    //读取SSDT表中索引值为0x7A的函数
    //poi(poi(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));
    return SSDT_NtOpenProcess_Cur_Addr;
}

ULONG GetNt_OldAddr()
{
    UNICODE_STRING Old_NtOpenProcess;
    ULONG Old_Addr;
    RtlInitUnicodeString(&Old_NtOpenProcess,L"NtOpenProcess");
    Old_Addr=(ULONG)MmGetSystemRoutineAddress(&Old_NtOpenProcess);//取得NtOpenProcess的地址
    KdPrint(("取得原函数NtOpenProcess的值为 %x",Old_Addr));
    return Old_Addr;

}

 

event.c

 

//_stdcall
#include "event.h"
#pragma  INITCODE
NTSTATUS DriverEntry(PDRIVER_OBJECT pDriverObject,PUNICODE_STRING B) //TYPEDEF LONG NTSTATUS
{  
    ULONG cur,old;
    cur=GetNt_CurAddr();
    old=GetNt_OldAddr();
    if (cur!=old)
    {
        //写入JMP   
        KdPrint(("NtOpenProcess被HOOK了"));
    }
    
    return (1);
}

#pragma PAGECODE
VOID DDK_Unload (IN PDRIVER_OBJECT pDriverObject)
{
    PDEVICE_OBJECT pDev;//用来取得要删除设备对象
    UNICODE_STRING symLinkName; // 

    pDev=pDriverObject->DeviceObject;
    IoDeleteDevice(pDev); //删除设备

    //取符号链接名字
    RtlInitUnicodeString(&symLinkName,L"\\??\\yjx888");
    //删除符号链接
    IoDeleteSymbolicLink(&symLinkName);
    KdPrint(("驱动成功被卸载...OK-----------")); //sprintf,printf
    //取得要删除设备对象
    //删掉所有设备
    DbgPrint("卸载成功");
}

 

posted @ 2013-09-01 23:32  宝贝,我永远都在  阅读(243)  评论(0)    收藏  举报