X86 下的SSDT HOOK
SSDTHOOK
1.SSDTHOOK 原理.
x32下,直接获取系统描述符表.以及调用号.就可以进行HOOK了.
x64下可以设置回调来进行过滤我们想要的功能.当然如果你简单的过一下PatchGuard也可以设置SSDT HOOK.
1.x32下的SSDT HOOK
首先SSDT 我们是可以在windbg下看到的

SSDT表的结构如下:
typedef struct _KSERVICE_TABLE_DESCRIPTOR {
PULONG_PTR Base;
PULONG Count;
ULONG Limit;
PUCHAR Number;
} KSERVICE_TABLE_DESCRIPTOR, *PKSERVICE_TABLE_DESCRIPTOR;
在WRK中的 ke.h中可以看到.

查看定义

在wrk中也可以看到定义的地方. 所以我们只需要在我们的函数中引用这个全局变量即可.
其中这个结构第一项是表的首地址 第二项是表的个数. *表 + n = 第某个函数的地址
也就是 base[10]就是第十项的地址.
KeServiceDescriptorTable

对应PCHunter查看.

所以我们想要HOOK就很简单了.
- 导入全局变量. 则获得SSDT表的地址
- 获取你想HOOK函数的位置
- 进行HOOK
- HOOK之前关闭一下CR0得写保护
代码如下:
2.SSDT HOOK代码
#include "Driver.h"
NTKERNELAPI UCHAR* PsGetProcessImageFileName(IN PEPROCESS Process);
void UnHook();
void DriverUnLoad(PDRIVER_OBJECT pDriverObj)
{
UnHook();
KdPrint(("驱动卸载成功"));
}
typedef struct _KSERVICE_TABLE_DESCRIPTOR {
PULONG_PTR Base;
PULONG Count;
ULONG Limit;
PUCHAR Number;
} KSERVICE_TABLE_DESCRIPTOR, *PKSERVICE_TABLE_DESCRIPTOR;
__declspec(dllimport) KSERVICE_TABLE_DESCRIPTOR KeServiceDescriptorTable; //导入全局变量
// sizeof(base) + 370 * 4 = NtTerMinateProcess
//extern KSERVICE_TABLE_DESCRIPTOR KeServiceDescriptorTable
typedef NTSTATUS(*PfnZwTerminateProcess)(
IN HANDLE ProcessHandle OPTIONAL,
IN NTSTATUS ExitStatus);
PfnZwTerminateProcess OldZwTerminateProcess;
NTSTATUS Hook_ZwTerminateProcess(
IN HANDLE ProcessHandle OPTIONAL,
IN NTSTATUS ExitStatus)
{
NTSTATUS rc;
PEPROCESS pRocess;
UCHAR *pszProcessName;
//UCHAR *pszProcessName = PsGetProcessImageFileName();
rc = ObReferenceObjectByHandle(ProcessHandle, GENERIC_ALL, *PsProcessType, KernelMode, &pRocess, NULL);
if (!NT_SUCCESS(rc))
{
return OldZwTerminateProcess(ProcessHandle, ExitStatus);
}
pszProcessName = PsGetProcessImageFileName(pRocess);
if (strstr(pszProcessName, "calc"))
{
return STATUS_ACCESS_DENIED;
ObDereferenceObject(pRocess);
}
ObDereferenceObject(pRocess);
rc = OldZwTerminateProcess(ProcessHandle, ExitStatus);
return rc;
}
//关闭写保护 1111 1111 1111 1110 1111 1111 1111 1111
VOID _CloseWriteProtected()
{
__asm
{
push eax
mov eax, cr0
and eax, 0xFFFEFFFF
mov cr0,eax
pop eax
}
return;
}
VOID _OpenTheWriteProtected()
{
__asm
{
push eax
mov eax, cr0
or eax, NOT 0xFFFEFFFF
mov cr0, eax
pop eax
}
return;
}
void HOOK()
{
//370是ntTerminateProcess 也可以写成 base + sizeof(type) *n = *(KeServiceDescriptorTable.Base) + 4 * 370 = NtTinminateProcess的地址
/*
OldZwTerminateProcess = (PfnZwTerminateProcess)(*(KeServiceDescriptorTable.Base) + 370 * 4);
*/
OldZwTerminateProcess = (PfnZwTerminateProcess)KeServiceDescriptorTable.Base[370];
_CloseWriteProtected();
//
KeServiceDescriptorTable.Base[370] = (int)Hook_ZwTerminateProcess;
_OpenTheWriteProtected();
}
void UnHook()
{
_CloseWriteProtected();
//
KeServiceDescriptorTable.Base[370] = (int)OldZwTerminateProcess;
_OpenTheWriteProtected();
}
NTSTATUS DriverEntry(PDRIVER_OBJECT pDriverObj, PUNICODE_STRING pRegPath)
{
pDriverObj->DriverUnload = DriverUnLoad;
HOOK();
return STATUS_SUCCESS;
}
3.结果

4.总结
总的来说如果按照服务号来HOOK是很简单的.如果没有服务号你怎么HOOK?
其实在32位下.你调用的函数.里面就有调用号.内核也跟应用层的调用号是息息相关的.我们可以取得函数调用号进行HOOK也可以.
如:
未测试.
KeServiceDescriptorTable.Base[*(PULONG)((PUCHAR)_FUNCTION +1)];
其中_FUNCTION用名字修改即可.

X86 下的SSDT HOOK的更多相关文章
- HOOK技术之SSDT hook(x86/x64)
x86 SSDT Hook 32位下进行SSDT Hook比较简单,通过修改SSDT表中需要hook的系统服务为自己的函数,在自己的函数中进行过滤判断达到hook的目的. 获取KeServiceDes ...
- SSDT Hook结构
目录 SSDT Hook效果图 SSDT简介 SSDT结构 SSDT HOOK原理 Hook前准备 如何获得SSDT中函数的地址呢 SSDT Hook流程 SSDT Hook实现进程保护 Ring3与 ...
- SSDT Hook实现内核级的进程保护
目录 SSDT Hook效果图 SSDT简介 SSDT结构 SSDT HOOK原理 Hook前准备 如何获得SSDT中函数的地址呢 SSDT Hook流程 SSDT Hook实现进程保护 Ring3与 ...
- SSDT Hook实现简单的进程隐藏和保护【转载】
原文链接:http://www.blogfshare.com/ssdthook-hide-protect.html 原文作者:AloneMonkey SSDT Hook实现简单的进程隐藏和保护 Alo ...
- 进程隐藏与进程保护(SSDT Hook 实现)(二)
文章目录: 1. 引子 – Demo 实现效果: 2. 进程隐藏与进程保护概念: 3. SSDT Hook 框架搭建: 4. Ring0 实现进程隐藏: 5. Ri ...
- 进程隐藏与进程保护(SSDT Hook 实现)(一)
读了这篇文章终于明白大致怎么回事了 文章目录: 1. 引子 – Hook 技术: 2. SSDT 简介: 3. 应用层调用 Win32 API 的完整执行流程: 4 ...
- MinHook测试与分析(x86下 E8,E9,EB,CALL指令测试,且逆推测试微软热补丁)
依稀记得第一次接触Hook的概念是在周伟民先生的书中-><<多任务下的数据结构与算法>>,当时觉得Hook的本质就是拦截,就算到现在也是如此认为. 本篇文章是在x86下测 ...
- 进程隐藏与进程保护(SSDT Hook 实现)(三)
文章目录: 1. 引子: 2. 获取当前系统下所有进程: 3. 服务管理(安装,启动,停止,卸载): 4. 应用程序和内核程序通信: 5. 小结: 1. 引子: 关于这个 SSDT Hook 实现进程 ...
- x64下进程保护HOOK
目录 x64(32)下的进程保护回调. 一丶进程保护线程保护 1.简介以及原理 1.2 代码 1.3注意的问题 二丶丶回调函数写法 2.1 遇到的问题. 2.2 回调代码 x64(32)下的进程保护回 ...
随机推荐
- @Valid注解的使用springmvc pojo校验
@Valid注解用于校验,所属包为:javax.validation.Valid. ① 首先需要在实体类的相应字段上添加用于充当校验条件的注解,如:@Min,如下代码(age属于User类中的属性): ...
- prometheus重启hang住问题记录
官方issue并不承认这是一个问题,参考: https://github.com/prometheus/prometheus/issues/5727 https://github.com/promet ...
- Spring怎么管理事务?
我们一般通过aop管理事务,就是把代码看成一个纵向有序的,然后通过aop管理事务,就好比增删改的时候需要开启一个事务,我们给他配置一个required,required就是有事务就执行事务,没有就给他 ...
- 70.JS---利用原生js做手机端网页自适应解决方案rem布局
利用原生js做手机端网页自适应解决方案rem布局 刚开始我用的是下面这段代码,然后js通过外部链接引入,最后每次用手机刷新网页的时候都会出现缩略图 function getRem(pwidth, pr ...
- IOS之NSString NSData char 相互转换
转自:http://blog.csdn.net/xialibing103/article/details/8513312 1.NSString转化为UNICODE String:(NSString*) ...
- DataPipeline丨构建实时数据集成平台时,在技术选型上的考量点
文 | 陈肃 DataPipeline CTO 随着企业应用复杂性的上升和微服务架构的流行,数据正变得越来越以应用为中心. 服务之间仅在必要时以接口或者消息队列方式进行数据交互,从而避免了构建单一数 ...
- Cheat Engine 模糊数值
打开游戏 玩到换枪为止 换枪 发现子弹数量是有限的200 扫描200 这是初次扫描 开两枪 剩余子弹数量194 再次扫描194 得到地址 尝试得到的这两个地址,经验证,第二个是我们想要的地址 重新开始 ...
- 针对源代码和检查元素不一致的网页爬虫——利用Selenium、PhantomJS、bs4爬取12306的列车途径站信息
整个程序的核心难点在于上次豆瓣爬虫针对的是静态网页,源代码和检查元素内容相同:而在12306的查找搜索过程中,其网页发生变化(出现了查找到的数据),这个过程是动态的,使得我们在审查元素中能一一对应看到 ...
- Linux下源码编译php7
1.安装依赖包 yum install -y gcc gcc-c++ make zlib zlib-devel pcre pcre-devel libjpeg libjpeg-devel libpng ...
- Beta冲刺第4次
二.Scrum部分 1. 各成员情况 翟仕佶 学号:201731103226 今日进展 今天不再使用Excel绘制燃尽图,改学习使用highcharts绘制 存在问题 对前端不够了解,第一次在这博客园 ...