#include "SSDT.h"
//关闭内存写保护
VOID WPOFF()
{
__asm
{
cli //屏蔽中断
mov eax, cr0
and eax, not 10000h
mov cr0, eax
}
}
//开启内存写保护
VOID WPON()
{
__asm
{
mov eax, cr0
or eax, 10000h
mov cr0, eax
sti //回复中断
}
}
/*
第一个参数Index就是服务号,
第二个参数ul_save_real_addrsss就是保存函数原始地址。因为我们要在过滤函数中调用原始地址
第三个参数ul_hook_address就是我们的hook代码的函数
*/
//Cr0方式SSDT表的函数Hook
VOID Cr0SSDTHook(int *Index, ULONG_PTR *ul_save_real_addrsss, ULONG_PTR ul_hook_address)
{
ULONG_PTR ul_real_service_address;
ULONG_PTR num = *Index;
//根据计算公式
//ul_real_service_address = 0x84495d5c + 105*4;
//ul_real_service_address = 0x84496170;
//获取被Hook函数的原始地址
ul_real_service_address = (ULONG)KeServiceDescriptorTable->ServiceTable + num*4;
if (ul_real_service_address)
{
//0x84647e3e
/*
nt!NtQuerySystemInformation:
84647e3e 8bff mov edi,edi
84647e40 55 push ebp
84647e41 8bec mov ebp,esp
84647e43 8b5508 mov edx,dword ptr [ebp+8]
84647e46 83fa53 cmp edx,53h
*/
//保存SSDT表中原始函数地址
*ul_save_real_addrsss = *((ULONG*)ul_real_service_address);
//关闭wp写保护
WPOFF();
//修改SSDT表中的Hook函数的地址为自定函数的地址
*((ULONG*)ul_real_service_address) = ul_hook_address;
//开启wp写保护
WPON();
}
}
//移除Cr0方式SSDT表的函数Hook即恢复SSDT中被Hook的函数
VOID Cr0RemoveSSDTHook(int *Index, ULONG_PTR ul_save_real_addrsss)
{
ULONG_PTR ul_real_service_address;
ULONG_PTR num = *Index;
//关闭wp写保护
WPOFF();
//根据计算公式
ul_real_service_address = (ULONG)KeServiceDescriptorTable->ServiceTable + num*4;
if (ul_real_service_address)
{
//恢复SSDT表中被Hook函数的地址
*((ULONG*)ul_real_service_address) = ul_save_real_addrsss;
}
//开启wp写保护
WPON();
}
//******************************************************************************************
//采用比较安全的方法修改ssdt表
//因为SSDT的虚拟地址分页属性是只读的,我们不能够直接修改它,否则会产生蓝屏
//我们借助Mdl分配一段虚拟地址映射到SSDT所在的物理地址,
//同时因为我们映射的MDL内存属性却可以是可写,所以就可以修改ssdt,这样就替代了cr0方式。
//******************************************************************************************
//采用Mdl方式的SSDT表函数Hook
NTSTATUS MdlSSDTHook(ULONG_PTR ul_real_function, ULONG_PTR hook_function_addr, ULONG_PTR *ul_save_real_function_addr)
{
//创建内存描述符列表Mdl,映射到SSDT表所在的内存物理地址
pmdl_system_call = MmCreateMdl(NULL, KeServiceDescriptorTable->ServiceTable, KeServiceDescriptorTable->TableSize*sizeof(ULONG_PTR));
//判断内存描述符列表Mdl
if(!pmdl_system_call)
{
return STATUS_UNSUCCESSFUL;
}
//构建非分页内存,建立虚拟地址与物理地址的映射关系
MmBuildMdlForNonPagedPool(pmdl_system_call);
//改变MDL的标志,设置为MDL_MAPPED_TO_SYSTEM_VA标志,让这块内存变可写
pmdl_system_call->MdlFlags = pmdl_system_call->MdlFlags | MDL_MAPPED_TO_SYSTEM_VA;
//锁定非分页内存
pdword_mapped_table = MmMapLockedPages(pmdl_system_call, KernelMode);
if (pdword_mapped_table)
{
//开始Mdl方式的SSDT表函数Hook
HOOK_SYSCALL(ul_real_function, hook_function_addr, *ul_save_real_function_addr);
}
return STATUS_SUCCESS;
}
//移除采用Mdl方式的SSDT表函数Hook
NTSTATUS MdlRemoveSSDTHook(ULONG_PTR ul_real_function, ULONG_PTR hook_function_addr, ULONG_PTR *ul_save_real_function_addr)
{
//恢复SSDT表中被Hook的函数
UNHOOK_SYSCALL(ul_real_function, *ul_save_real_function_addr, hook_function_addr);
if(pmdl_system_call)
{
//解锁非分页内存
MmUnmapLockedPages(pdword_mapped_table, pmdl_system_call);
//释放申请的非分页内存
IoFreeMdl(pmdl_system_call);
return STATUS_SUCCESS;
}
return STATUS_UNSUCCESSFUL;
}
SSDT表的Hook原理和示例代码
需积分: 33 170 浏览量
2015-06-25
16:29:23
上传
评论 2
收藏 100KB ZIP 举报
Fly20141201
- 粉丝: 990
- 资源: 41
最新资源
- 基于protel99se(原理图库+封装库)电路设计硬件PCB设计protel库合集protel封装大全(近3000个).zip
- python-leetcode面试题解之第157题用Read4读取N个字符-题解.zip
- python-leetcode面试题解之第156题上下翻转二叉树-题解.zip
- python-leetcode面试题解之第155题最小栈-题解.zip
- python-leetcode面试题解之第153题寻找旋转排序数组中的最小值-题解.zip
- python-leetcode面试题解之第152题乘积最大子数组-题解.zip
- python-leetcode面试题解之第151题反转字符串中的单词-题解.zip
- python-leetcode面试题解之第150题逆波兰表达式求值-题解.zip
- python-leetcode面试题解之第149题直线上最多的点数-题解.zip
- python-leetcode面试题解之第148题排序链表-题解.zip
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈