感谢众大神分享的技术,因为几乎没直接用别人的源码,所以就标题原创
但是因为这个技术肯定是前辈们搞出来的,所以就特意说明下,此乃转载耶
模板用的张帆大牛的
记录一下,以后备用
有些许疑惑,不过都解决了:http://blog.csdn.net/u012410612/article/details/17096597
//本来只是测试MmGetSystemRoutineAddresss函数的,然后发现直接用函数名就可以得到这个地址
//然后就像SSDT HOOK简单测试一下函数地址,
//然后HOOK之后就想简单的实现进程保护
//就这样越多了
#ifdef _cplusplus
extern "C"
{
#endif
#include <ntddk.h>
#ifdef _cplusplus
}
#endif
//定义代码段分页标志
#define PAGEDCODE code_seg("PAGE")
#define LOCKEDCODE code_seg()
#define INITCODE code_seg("INIT")
//定义数据段分页标志
#define PAGEDDATA code_seg("PAGE")
#define LOCKEDDATA code_seg()
#define INITDATA code_seg("INIT")
//定义求数组个数的宏定义
#define arraysize(p) (sizeof(p) / sizeof((p)[0]))
//定义设备扩展
typedef struct _DEVICE_EXTENSION{
PDEVICE_OBJECT pDevice;
UNICODE_STRING ustrDeviceName; //设备名称
UNICODE_STRING ustrSymLinkName; //符号链接名
}DEVICE_EXTENSION, *PDEVICE_EXTENSION;
//函数声明//
//初始化时创建设备和符号
NTSTATUS CreateDevice(IN PDRIVER_OBJECT pDriverObject);
//驱动卸载例程
VOID DriverUnload(IN PDRIVER_OBJECT pDriverObject);
//驱动默认分派例程
NTSTATUS DispatchRoutine(IN PDEVICE_OBJECT pDevObj, IN PIRP pIrp);
typedef NTSTATUS ( *pfnNtOpenProcess)(
PHANDLE,
ACCESS_MASK,
POBJECT_ATTRIBUTES,
PCLIENT_ID);
pfnNtOpenProcess OldNtOpenProcess;
NTSTATUS MyNtOpenProcess(
OUT PHANDLE ProcessHandle,
IN ACCESS_MASK DesireAccess,
IN POBJECT_ATTRIBUTES ObjectAttributes,
PCLIENT_ID ClientID);
typedef struct _SERVICE_DESCRIPTOR_TABLE {
PVOID ServiceTableBase;//System Service Dispatch Table 的基地址
PVOID ServiceCounterTableBase;//包含着 SSDT 中每个服务被调用次数的计数器。这个计数器一般由sysenter 更新
ULONG NumberOfServices;//由 ServiceTableB