一、效果图

二、分析

这里对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的更多相关文章

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

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

  2. SSDT Hook结构

    目录 SSDT Hook效果图 SSDT简介 SSDT结构 SSDT HOOK原理 Hook前准备 如何获得SSDT中函数的地址呢 SSDT Hook流程 SSDT Hook实现进程保护 Ring3与 ...

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

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

  4. 进程隐藏与进程保护(SSDT Hook 实现)(一)

    读了这篇文章终于明白大致怎么回事了 文章目录:                   1. 引子 – Hook 技术: 2. SSDT 简介: 3. 应用层调用 Win32 API 的完整执行流程: 4 ...

  5. SSDT Hook实现内核级的进程保护

    目录 SSDT Hook效果图 SSDT简介 SSDT结构 SSDT HOOK原理 Hook前准备 如何获得SSDT中函数的地址呢 SSDT Hook流程 SSDT Hook实现进程保护 Ring3与 ...

  6. 进程隐藏与进程保护(SSDT Hook 实现)(三)

    文章目录: 1. 引子: 2. 获取当前系统下所有进程: 3. 服务管理(安装,启动,停止,卸载): 4. 应用程序和内核程序通信: 5. 小结: 1. 引子: 关于这个 SSDT Hook 实现进程 ...

  7. 通过SSDT HOOK实现进程保护和进程隐藏

    ---恢复内容开始--- 首先,我要说一件很重要的事,本人文采不好,如果哪里说的尴尬了,那你就尴尬着听吧...... SSDT HOOK最初貌似源于Rookit,但是Rookit之前有没有其他病毒使用 ...

  8. X86 下的SSDT HOOK

    目录 SSDTHOOK 1.SSDTHOOK 原理. 1.x32下的SSDT HOOK 2.SSDT HOOK代码 3.结果 4.总结 SSDTHOOK 1.SSDTHOOK 原理. x32下,直接获 ...

  9. Win64 驱动内核编程-22.SHADOW SSDT HOOK(宋孖健)

    SHADOW SSDT HOOK HOOK 和 UNHOOK SHADOW SSDT 跟之前的 HOOK/UNHOOK SSDT 类似,区别是查找SSSDT的特征码,以及根据索引计算函数地址的公式,还 ...

  10. HOOK技术之SSDT hook(x86/x64)

    x86 SSDT Hook 32位下进行SSDT Hook比较简单,通过修改SSDT表中需要hook的系统服务为自己的函数,在自己的函数中进行过滤判断达到hook的目的. 获取KeServiceDes ...

随机推荐

  1. LInux SSH远程文件/目录传输命令scp(转载)

    From:http://www.vpser.net/manage/scp.html 相信各位VPSer在使用VPS是经常会在不同VPS间相互备份数据或转移数据.一般情况下VPS都已安装了Ngnix或者 ...

  2. crm 4 IFRAME 元素隐藏

    function hidebtn(elementTitle) { var x = document.getElementsByTagName("LI"); for (i = 0; ...

  3. Ext中 get、getDom、getCmp的区别

    getDom方法能够得到文档中的DOM节点,该方法中包含一个参数,该参数可以是DOM节点的id.DOM节点对象或DOM节点对应的Ext元素(Element)等. (与getElementById是一个 ...

  4. Python第九章模块和包

    1.import Python文件的时候文件名不能跟Python中自带的关键字重复,否则无法使用关键字的方法. 2.Reload(),重载例子 import sysreload(sys)sys.set ...

  5. Mongdb操作嵌套文档

    1.一个文档如下 db.posts.find() { "_id" : ObjectId("5388162dfc164ee1f39be37f"), "t ...

  6. 内存数据库(sqlite)和 map数据结构 做缓存对比

    背景: 今天看文档时发现说android的SQLITE在创建时,如果不指定name,则会创建in-memory的数据库.且当该db被close时,才会释放. 那这样来说,完全可以用来做内存缓存嘛. 用 ...

  7. ansible高级用法

    将多个符合正则的文件拷贝到目标机器 - name: Copy copy: src={{ item }} dest=/root/.sshkeys mode=0600 owner=root group=r ...

  8. HDU 2209 翻纸牌游戏 状态BFS

    翻纸牌游戏 Time Limit: 9000/3000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Problem De ...

  9. Xml语言

    一.XML是什么?作用是什么? l  XML ( eXtensible Markup Language )语言是一种可扩展的标记语言.其中的可扩展是相对HTML来说的.因为XML标签没有被预定义,需要 ...

  10. 怎样对CODESOFT中的条形码进行黑白转换

      CODESOFT 2015标签设计软件能 够提供无与伦比的灵活性.功能和支持,其面对的用户也是极其的广泛.对于一些需要打印黑白反转条形码的特殊用户,例如使用黑色标签纸的用 户,CODESOFT 2 ...