#ifdef __cplusplus
extern "C"
{
#endif
#include <ntddk.h>
#ifdef __cplusplus
}
#endif typedef struct _ServiceDescriptorTable {
unsigned int *ServiceTableBase; //System Service Dispatch Table 的基地址
unsigned int *ServiceCounterTable;
//包含着 SSDT 中每个服务被调用次数的计数器。这个计数器一般由sysenter 更新。
unsigned int NumberOfServices;//由 ServiceTableBase 描述的服务的数目。
unsigned int *ParamTableBase; //包含每个系统服务参数字节数表的基地址-系统服务参数表
}*PServiceDescriptorTable; extern "C" extern PServiceDescriptorTable KeServiceDescriptorTable; typedef NTSTATUS (*NTCREATEPROCESSEX)(PHANDLE ProcessHandle,
ACCESS_MASK DesiredAccess,
POBJECT_ATTRIBUTES oa,
HANDLE ParentProcess,
ULONG Flags,
HANDLE SectionHandle,
HANDLE DebugPort,
HANDLE ExceptionPort,
ULONG JobFlag); ULONG O_NtCreateProcesseEx = ; // 保存原始地址 // 去掉页面保护
VOID UN_PROTECT()
{
__asm
{
cli //关闭中断,增强这段代码的稳定性
push eax
mov eax, CR0
and eax, 0x0FFFEFFFF //使低17位为0 从右往左第17位
mov CR0, eax
pop eax
}
} // 恢复页面保护
VOID RE_PROTECT()
{
__asm
{
push eax
mov eax, CR0
or eax,10000h //使低17位为1
mov CR0, eax
pop eax
sti //打开中断
}
} //自己定义的函数,让程序执行的函数
NTSTATUS
MyNtCreateProcessEx(
PHANDLE ProcessHandle,
ACCESS_MASK DesiredAccess,
POBJECT_ATTRIBUTES oa,
HANDLE ParentProcess,
ULONG Flags,
HANDLE SectionHandle,
HANDLE DebugPort,
HANDLE ExceptionPort,
ULONG JobFlag)
{
KdPrint(("Hook NtCreateProcess Success\n"));
// 调用NtCreateProcessEx函数,为什么能够调用?因为地址因为替换成NtCreateProcessEx函数的地址
// 3 正常返回
return ((NTCREATEPROCESSEX)O_NtCreateProcesseEx)(ProcessHandle,
DesiredAccess,
oa,
ParentProcess,
Flags,
SectionHandle,
DebugPort,
ExceptionPort,
JobFlag); } VOID HookSsdt()
{
//1 保存
O_NtCreateProcesseEx = KeServiceDescriptorTable->ServiceTableBase[];
UN_PROTECT();
// 2 替换
KeServiceDescriptorTable->ServiceTableBase[] = (unsigned int )MyNtCreateProcessEx;
RE_PROTECT();
} VOID UnHookSsdt()
{
// 4 替换回去
KeServiceDescriptorTable->ServiceTableBase[] = O_NtCreateProcesseEx;
}
VOID DriverUnload(PDRIVER_OBJECT pDriverObject)
{
UnHookSsdt();
KdPrint(("Driver Unload Success\n"));
}
extern "C" NTSTATUS DriverEntry(PDRIVER_OBJECT pDriverObject, PUNICODE_STRING pRegistryPath)
{
KdPrint(("Welcome to JoyChou's Driver\n")); pDriverObject->DriverUnload = DriverUnload;
HookSsdt();
return STATUS_SUCCESS;
}
整个流程:
首先在DriverEntry调用HookCreateProcess()函数,该函数的作用是将SSDT表中NtCreateProcessEx()函数的地址替换为
MyNtCreatePocessEx()函数的地址。
而MyNtCreatePocessEx()函数是用来取代NtCreateProcessEx()函数的函数。
 
说明:
执行UN_PROTECT()后,CPU可以向标志为只读的内存页进行写入操作。
写入完成后,执行RE_PROTECT()函数回复到原来的状态。
 
效果:
当加载驱动后,随意运行一个程序,用dbgview就能接受到“Hook NtCreateProcess Success”成功提示字符串
 
 
 
环境:
XP SP3
 
注意:
ulNtCreateProcesseExAddr = ulSsdt + 48 * 4;//这的48根据自己的电脑SSDT表中NtCreateProcessEx序号

Hook SSDT中NtCreateProcessEx的更多相关文章

  1. 基于frida框架Hook native中的函数(1)

    作者:H01mes撰写的这篇关于frida框架hook native函数的文章很不错,值得推荐和学习,也感谢原作者. 0x01 前言 关于android的hook以前一直用的xposed来hook j ...

  2. Resume Hook SSDT

    在HookSSDT中  通过在第4部通过索引将NtOpenProcess 换成 Base[索引] = FakeNtOpenProcess; so 在阻止时应该在ntoskrnl.exe 找到真正的Op ...

  3. 闭包传参 余额计算 钩子hook 闭包中的this JavaScript 钩子

    闭包传参  余额计算    钩子hook 小程序 a=function(e){console.log(this)}() a=function(e){console.log(this)}() VM289 ...

  4. 简单HOOK SSDT实现文件防删除

    http://www.rosoo.net/a/201001/8347.html

  5. 进程隐藏与进程保护(SSDT Hook 实现)(二)

    文章目录:                   1. 引子 – Demo 实现效果: 2. 进程隐藏与进程保护概念: 3. SSDT Hook 框架搭建: 4. Ring0 实现进程隐藏: 5. Ri ...

  6. SSDT表函数Hook原理

    其实 SSDT Hook 的原理是很简单的,我们可以知道在 SSDT 这个数组中呢,保存了系统服务的地址,比如对于 Ring0 下的 NtQuerySystemInformation 这个系统服务的地 ...

  7. SSDT Hook实现简单的进程隐藏和保护【转载】

    原文链接:http://www.blogfshare.com/ssdthook-hide-protect.html 原文作者:AloneMonkey SSDT Hook实现简单的进程隐藏和保护 Alo ...

  8. 菜鸟开始学习SSDT HOOK((附带源码)

    看了梦无极的ssdt_hook教程,虽然大牛讲得很细,但是很多细节还是要自己去体会,才会更加深入.在这里我总结一下我的分析过程,若有不对的地方,希望大家指出来.首先我们应该认识 ssdt是什么?从梦无 ...

  9. SSDT Hook

    一.效果图 二.分析 这里对NtCreateProcessEx做拦截,用WinDbg来定位该函数在SSDT中的记录地址: : kd> dd KeServiceDescriptorTable 80 ...

随机推荐

  1. POJ 2586 Y2K Accounting Bug(枚举洪水问题)

    Y2K Accounting Bug Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 10674   Accepted: 53 ...

  2. 关于JavaScript中计算精度丢失的问题

    摘要: 由于计算机是用二进制来存储和处理数字,不能精确表示浮点数,而JavaScript中没有相应的封装类来处理浮点数运算,直接计算会导致运算精度丢失. 为了避免产生精度差异,把需要计算的数字升级(乘 ...

  3. Oracle缓存机制

  4. BZOJ 1355 Baltic2009 Radio Transmission KMP算法

    标题效果:给定一个字符串,求最小周期节(不能整除) 示例Hint这是错误的忽略了就好了 环路部分应该是cab 这个称号充分利用KMP在next自然阵列,那是,n-next[n]它表示一个循环节 POJ ...

  5. Forms身份验证和基于Role的权限验证

    Forms身份验证和基于Role的权限验证 从Membership到SimpleMembership再到ASP.NET Identity,ASP.NET每一次更换身份验证的组件,都让我更失望.Memb ...

  6. Socket 学习(二)

    1对1的发送和接收 Client 端         void ThreadReceive()         {             try             {              ...

  7. 浅谈javascript性能-管理内存

    上次说到,javascript脚本到底应该放在哪里?用什么用处? 以下2点: 在Html.Body部分中的JS会在页面加载的时候执行.即-用户触发一个事件的时候执行的脚本.eg:onload事件... ...

  8. SQL点滴13—收集SQLServer线程等待信息

    原文:SQL点滴13-收集SQLServer线程等待信息 要知道线程等待时间是制约SQL Server效率的重要原因,这一个随笔中将学习怎样收集SQL Server中的线程等待时间,类型等信息,这些信 ...

  9. 关于标准I/O缓冲区和fork函数

    标准I/O库提供缓冲的目的是尽可能减少使用read和write调用的次数.标准I/O提供三个类型的缓冲:全缓冲.行缓冲和不带缓冲.标准输入(stdin)和标准输出(stdout)是行缓冲,标准出错(s ...

  10. Android 使用Gson解析json案例具体解释

    一.眼下解析json有三种工具:org.json(Java经常使用的解析),fastjson(阿里巴巴project师开发的),Gson(Google官网出的),解析速度最快的是Gson,下载地址:h ...