SSDT Hook
一、效果图
二、分析
这里对NtCreateProcessEx做拦截,用WinDbg来定位该函数在SSDT中的记录地址:
: kd> dd KeServiceDescriptorTable
8055d700 0000011c 805058c4
8055d710
8055d720
8055d730
8055d740 bf80c0b6
8055d750 f8399a80 f82ffb60 820f06b0 806f70c0
8055d760 071d8498 0b14f8a6
8055d770 01cf525a
: kd> dd + 0x30 *
805d2136 805ac3ae
805c49b6 805d1fd4 805fa0e6
805a60f4 80643f58 806440a8
806170d6 80577c2c 80624c16
805f5958 80624de6 8057a24a
805befc4 805edd88 806170e4 80624fc6
806170c8 805b4c9e 805edf34
8061660c 80577cf8 805b7806 8062549a
: kd> u 805d2136
nt!NtCreateProcessEx:
805d2136 6a0c push 0Ch
805d2138 68e0b84d80 push offset nt!ObWatchHandles+0x684 (804db8e0)
805d213d e83eaaf6ff call nt!_SEH_prolog (8053cb80)
805d2142 64a124010000 mov eax,dword ptr fs:[00000124h]
805d2148 33d2 xor edx,edx
805d214a cmp byte ptr [eax+140h],dl
805d2150 je nt!NtCreateProcessEx+0x51 (805d2187)
805d2152 8955fc mov dword ptr [ebp-],edx
三、源代码
#include <ntddk.h> typedef struct _SERVICE_DESCRIPTOR_TABLE
{
PULONG ServiceTableBase;
PULONG ServiceCounterTableBase;
ULONG NumberOfServices;
PUCHAR ParamTableBase;
}SERVICE_DESCRIPTOR_TABLE, *PSERVICE_DESCRIPTOR_TALBLE; extern PSERVICE_DESCRIPTOR_TALBLE KeServiceDescriptorTable; typedef NTSTATUS (*NTCREATEPROCESSEX)(PHANDLE, ACCESS_MASK, POBJECT_ATTRIBUTES, HANDLE, ULONG, HANDLE, HANDLE, HANDLE, ULONG); //保存NtCreateProcessEx函数的地址
NTCREATEPROCESSEX ulNtCreateProcessEx = ;
//在指针数组中NtCreateProcessEx的地址
ULONG ulNtCreateProcessExAddr = ; VOID UN_PROTECT()
{
_asm
{
push eax
mov eax,0FFFEFFFFh
mov CR0,eax
pop eax
}
} VOID RE_PROTECT()
{
_asm
{
push eax
mov eax,CR0
or eax,0FFFEFFFFh
mov CR0,eax
pop eax
}
} VOID DriverUnload(PDRIVER_OBJECT pDriverObject)
{
UN_PROTECT(); //替换NtCreateProcessEx的地址为MyNtCreateProcessEx
*(PULONG)ulNtCreateProcessExAddr = (ULONG)ulNtCreateProcessEx; RE_PROTECT();
} NTSTATUS MyNtCreateProcessEx
(
__out PHANDLE ProcessHandle,
__in ACCESS_MASK DesiredAccess,
__in_opt POBJECT_ATTRIBUTES ObjectAttributes,
__in HANDLE ParentProcess,
__in ULONG Flags,
__in_opt HANDLE SectionHandle,
__in_opt HANDLE DebugPort,
__in_opt HANDLE ExceptionPort,
__in ULONG JobMemberLevel
)
{
NTSTATUS Status = STATUS_SUCCESS;
KdPrint(("Enter MyNtCreateProcessEx! \r\n")); Status = ulNtCreateProcessEx(ProcessHandle,
DesiredAccess, ObjectAttributes, ParentProcess,
Flags, SectionHandle, DebugPort, ExceptionPort, JobMemberLevel); return Status;
} VOID HookCreateProcess()
{
ULONG ulSsdt = ; //获取SSDT
ulSsdt = (ULONG)KeServiceDescriptorTable->ServiceTableBase; //获取NtCreateProcessEx地址的指针
ulNtCreateProcessExAddr = ulSsdt + 0x30 * ; //备份NtCreateProcessEx的原始地址
ulNtCreateProcessEx = (NTCREATEPROCESSEX)*(PULONG)ulNtCreateProcessExAddr; UN_PROTECT(); //替换NtCreateProcessEx的地址为MyNtCreateProcessEx
*(PULONG)ulNtCreateProcessExAddr = (ULONG)MyNtCreateProcessEx; RE_PROTECT();
} NTSTATUS DriverEntry(PDRIVER_OBJECT pDriverObject, PUNICODE_STRING pRegistryPath)
{
NTSTATUS Status = STATUS_SUCCESS;
pDriverObject->DriverUnload = DriverUnload; HookCreateProcess(); return Status;
}
SSDT Hook的更多相关文章
- SSDT Hook实现简单的进程隐藏和保护【转载】
原文链接:http://www.blogfshare.com/ssdthook-hide-protect.html 原文作者:AloneMonkey SSDT Hook实现简单的进程隐藏和保护 Alo ...
- SSDT Hook结构
目录 SSDT Hook效果图 SSDT简介 SSDT结构 SSDT HOOK原理 Hook前准备 如何获得SSDT中函数的地址呢 SSDT Hook流程 SSDT Hook实现进程保护 Ring3与 ...
- 进程隐藏与进程保护(SSDT Hook 实现)(二)
文章目录: 1. 引子 – Demo 实现效果: 2. 进程隐藏与进程保护概念: 3. SSDT Hook 框架搭建: 4. Ring0 实现进程隐藏: 5. Ri ...
- 进程隐藏与进程保护(SSDT Hook 实现)(一)
读了这篇文章终于明白大致怎么回事了 文章目录: 1. 引子 – Hook 技术: 2. SSDT 简介: 3. 应用层调用 Win32 API 的完整执行流程: 4 ...
- SSDT Hook实现内核级的进程保护
目录 SSDT Hook效果图 SSDT简介 SSDT结构 SSDT HOOK原理 Hook前准备 如何获得SSDT中函数的地址呢 SSDT Hook流程 SSDT Hook实现进程保护 Ring3与 ...
- 进程隐藏与进程保护(SSDT Hook 实现)(三)
文章目录: 1. 引子: 2. 获取当前系统下所有进程: 3. 服务管理(安装,启动,停止,卸载): 4. 应用程序和内核程序通信: 5. 小结: 1. 引子: 关于这个 SSDT Hook 实现进程 ...
- 通过SSDT HOOK实现进程保护和进程隐藏
---恢复内容开始--- 首先,我要说一件很重要的事,本人文采不好,如果哪里说的尴尬了,那你就尴尬着听吧...... SSDT HOOK最初貌似源于Rookit,但是Rookit之前有没有其他病毒使用 ...
- X86 下的SSDT HOOK
目录 SSDTHOOK 1.SSDTHOOK 原理. 1.x32下的SSDT HOOK 2.SSDT HOOK代码 3.结果 4.总结 SSDTHOOK 1.SSDTHOOK 原理. x32下,直接获 ...
- Win64 驱动内核编程-22.SHADOW SSDT HOOK(宋孖健)
SHADOW SSDT HOOK HOOK 和 UNHOOK SHADOW SSDT 跟之前的 HOOK/UNHOOK SSDT 类似,区别是查找SSSDT的特征码,以及根据索引计算函数地址的公式,还 ...
- HOOK技术之SSDT hook(x86/x64)
x86 SSDT Hook 32位下进行SSDT Hook比较简单,通过修改SSDT表中需要hook的系统服务为自己的函数,在自己的函数中进行过滤判断达到hook的目的. 获取KeServiceDes ...
随机推荐
- html标签搜索引擎友好度总结
H系列标签: H标签当中数H1的权重最高,H1相当于我们一篇作文的标题,H2.H3等标签是属于页面的相关性主题标签,h标签的权重也是相对递减的,如果你没有出现h1,那么h2的权重也就相当 ...
- tcpdump命令--实用篇
//查看本机与mysql的操作命令 注意 -i any表示监听所有网络接口,我们也根据自身情况选择网络接口 #tcpdump -i any -w - dst port 3306 |strings // ...
- Java多线程之线程中断
该例子说明,Sleep可以被中断,但是I/O和synchronized不能被中断. package Thread.Interrupting; import java.io.IOException; i ...
- Python进阶05 循环设计
作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明.谢谢! 在"循环"一节,我们已经讨论了Python基本的循环语法.这一 ...
- mongodb 查询使用
> db.jd_58tc_raw.findOne() { "_id" : "2659e4e4caf0504ec4362478e2ed57ca", &quo ...
- PostgreSQL 数据迁移
新主机PostgreSQL需要事先建立和原主机名称相同的用户和数据库. 备份原主机数据库 pg_dump -U <UserName> -p <PortNum> <DBNa ...
- Nginx作为简单代理服务器(Windows环境)
Nginx一个频繁的应用是作为代理服务器,由Nginx代理服务器接受客户请求,并将客户请求发送到应用服务器处理,接受应用服务器的响应,然后将响应发送给客户. 现在要做的一个应用场景就是当客户请求图片资 ...
- 内省—beanutils工具包
Apache组织开发了一套用于操作JavaBean的API,这套API考虑到了很多实际开发中的应用场景,因此在实际开发中很多程序员使用这套API操作JavaBean,以简化程序代码的编写. BeanU ...
- vc调用dll 示例
其实,调用dll文件的方法很多,不一定要使用LoadLibrary函数.如果使用的话,你就要预先声明dll中的函数,很麻烦. 下面是我使用dll时的一点技巧,就是引入lib文件,可以参考: 一.Win ...
- Xml语言
一.XML是什么?作用是什么? l XML ( eXtensible Markup Language )语言是一种可扩展的标记语言.其中的可扩展是相对HTML来说的.因为XML标签没有被预定义,需要 ...