---恢复内容开始---

首先,我要说一件很重要的事,本人文采不好,如果哪里说的尴尬了,那你就尴尬着听吧。。。。。。

  SSDT HOOK最初貌似源于Rookit,但是Rookit之前有没有其他病毒使用,这就不清楚了,总之这个功能很不错,那么什么是SSDT呢,SSDT全称是(System Services Descriptor Table),它将ring3的Win32 API和ring0的内核函数联系起来,SSDT 并不仅仅只包含一个庞大的地址索引表,它还包含着一些其它有用的信息,诸如地址索引的基地址、服务函数个数等。

通过修改此表的函数地址可以对常用 Windows 函数及 API 进行 Hook,从而实现对一些关心的系统动作进行过滤、监控的目的。一些 HIPS、防毒软件、系统监控、注册表监控软件往往会采用此接口来实现自己的监控模块。

  SSDT基址存储在KSYSTEM_SERVICE_TABLE->ServiceTableBase中,下面是这个结构的定义

kd> dt _KSYSTEM_SERVICE_TABLE
ssdtHook!_KSYSTEM_SERVICE_TABLE
+0x000 ServiceTableBase : Ptr32 Uint4B //SSDT (System Service Dispatch Table)的基地址
  +0x004 ServiceCounterTableBase :   Ptr32 Uint4B //用于 checked builds, 包含 SSDT 中每个服务被调用的次数  +0x008 NumberOfService : Uint4B 
  +0x00c ParamTableBase : Uint4B

  其实ServiceTableBase也是一个数据结构,我们这里从WRK中看看它的定义

typedef struct _KSERVICE_TABLE_DESCRIPTOR {
PULONG_PTR Base;  
PULONG Count;
ULONG Limit;
PUCHAR Number;
} KSERVICE_TABLE_DESCRIPTOR, *PKSERVICE_TABLE_DESCRIPTOR;

  这里的Base成员就是存储各函数地址的基址,再补充一点,内核中有两个系统服务描述符表,一个是KeServiceDescriptorTable(由ntoskrnl.exe导出),一个是KeServieDescriptorTableShadow(没有导出)。我们HOOK的是KeServiceDescriptorTable中的函数地址,KeServiceDescriptorTable是一个内核变量,可通过extern来使用它,而且它存储的就是_KSYSTEM_SERVICE_TABLE的首地址 

kd> dd KeServiceDescriptorTable
8055d700 80505450 00000000 0000011c 805058c4
8055d710 00000000 00000000 00000000 00000000
8055d720 00000000 00000000 00000000 00000000
kd> dt _KSYSTEM_SERVICE_TABLE 80505450
ssdtHook!_KSYSTEM_SERVICE_TABLE
+0x000 ServiceTableBase : 0x805a5614 -> 0x9c68
+0x004 ServiceCounterTableBase : 0x805f1adc -> 0x8b55ff8b
+0x008 NumberOfService : 0x805f5312
+0x00c ParamTableBase : 0x805f1b0e

  

  这里我保护进程是HOOK的函数NtOpenProcess,隐藏进程是通过NtQuerySystemInformation实现的,为什么HOOK NtOpenProcess呢,因为任务管理器结束任务的时候,会通过OpenProcess获得被结束的进程句柄,然后再结束。 HOOK NtQuerySystemInformation的原因是因为可以通过它的参数,得到进程链(不同于EPROCESS),然后摘除掉,这样任务管理器就不会显示了,NtOpenProcess的索引号可以通过OD得知    我要做的步骤如下:

  第一: 首先用驱动创建个Device,然后绑定个符号链接,供其与R3程序进行通信

  第二: HOOK NtOpenProcess和

---恢复内容结束---

首先,我要说一件很重要的事,本人文采不好,如果哪里说的尴尬了,那你就尴尬着听吧。。。。。。

  SSDT HOOK最初貌似源于Rookit,但是Rookit之前有没有其他病毒使用,这就不清楚了,总之这个功能很不错,那么什么是SSDT呢,SSDT全称是(System Services Descriptor Table),它将ring3的Win32 API和ring0的内核函数联系起来,SSDT 并不仅仅只包含一个庞大的地址索引表,它还包含着一些其它有用的信息,诸如地址索引的基地址、服务函数个数等。

通过修改此表的函数地址可以对常用 Windows 函数及 API 进行 Hook,从而实现对一些关心的系统动作进行过滤、监控的目的。一些 HIPS、防毒软件、系统监控、注册表监控软件往往会采用此接口来实现自己的监控模块。

  SSDT基址存储在KSYSTEM_SERVICE_TABLE->ServiceTableBase中,下面是这个结构的定义

kd> dt _KSYSTEM_SERVICE_TABLE
ssdtHook!_KSYSTEM_SERVICE_TABLE
+0x000 ServiceTableBase : Ptr32 Uint4B //SSDT (System Service Dispatch Table)的基地址
  +0x004 ServiceCounterTableBase :   Ptr32 Uint4B //用于 checked builds, 包含 SSDT 中每个服务被调用的次数  +0x008 NumberOfService : Uint4B 
  +0x00c ParamTableBase : Uint4B

  其实ServiceTableBase也是一个数据结构,我们这里从WRK中看看它的定义

typedef struct _KSERVICE_TABLE_DESCRIPTOR {
PULONG_PTR Base;  
PULONG Count;
ULONG Limit;
PUCHAR Number;
} KSERVICE_TABLE_DESCRIPTOR, *PKSERVICE_TABLE_DESCRIPTOR;

  这里的Base成员就是存储各函数地址的基址,再补充一点,内核中有两个系统服务描述符表,一个是KeServiceDescriptorTable(由ntoskrnl.exe导出),一个是KeServieDescriptorTableShadow(没有导出)。我们HOOK的是KeServiceDescriptorTable中的函数地址,KeServiceDescriptorTable是一个内核变量,可通过extern来使用它,而且它存储的就是_KSYSTEM_SERVICE_TABLE的首地址 

kd> dd KeServiceDescriptorTable
8055d700 80505450 00000000 0000011c 805058c4
8055d710 00000000 00000000 00000000 00000000
8055d720 00000000 00000000 00000000 00000000
kd> dt _KSYSTEM_SERVICE_TABLE 80505450
ssdtHook!_KSYSTEM_SERVICE_TABLE
+0x000 ServiceTableBase : 0x805a5614 -> 0x9c68
+0x004 ServiceCounterTableBase : 0x805f1adc -> 0x8b55ff8b
+0x008 NumberOfService : 0x805f5312
+0x00c ParamTableBase : 0x805f1b0e

  

  这里我保护进程是HOOK的函数NtOpenProcess,隐藏进程是通过NtQuerySystemInformation实现的,为什么HOOK NtOpenProcess呢,因为任务管理器结束任务的时候,会通过OpenProcess获得被结束的进程句柄,然后再结束。 HOOK NtQuerySystemInformation的原因是因为可以通过它的参数,得到进程链(不同于EPROCESS),然后摘除掉,这样任务管理器就不会显示了,NtOpenProcess的索引号可以通过OD得知    我要做的步骤如下:

  第一: 首先用驱动创建个Device,然后绑定个符号链接,供其与R3程序进行通信

  第二: HOOK NtOpenProcess和

通过SSDT HOOK实现进程保护和进程隐藏的更多相关文章

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

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

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

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

  3. SSDT Hook结构

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

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

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

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

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

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

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

  7. 【Hook技术】实现从"任务管理器"中保护进程不被关闭 + 附带源码 + 进程保护知识扩展

    [Hook技术]实现从"任务管理器"中保护进程不被关闭 + 附带源码 + 进程保护知识扩展 公司有个监控程序涉及到进程的保护问题,需要避免用户通过任务管理器结束掉监控进程,这里使用 ...

  8. x64下进程保护HOOK

    目录 x64(32)下的进程保护回调. 一丶进程保护线程保护 1.简介以及原理 1.2 代码 1.3注意的问题 二丶丶回调函数写法 2.1 遇到的问题. 2.2 回调代码 x64(32)下的进程保护回 ...

  9. 64位下Hook NtOpenProcess的实现进程保护 + 源码 (升级篇 )

    64位下Hook NtOpenProcess的实现进程保护 + 源码 (升级篇 ) [PS: 如果在64位系统下,出现调用测试demo,返回false的情况下,请修改Hook Dll的代码] glhH ...

随机推荐

  1. Tomcat 安装错误

    安装tomcat时,遇到"failed to install tomcat6 service check your settings and permissions"的问题 安装时 ...

  2. Speech Recognition Grammar Specification Version 1.0 JavaScript TTS 文本发音

    Speech Recognition Grammar Specification Version 1.0 https://www.w3.org/TR/speech-grammar/ W3C Recom ...

  3. bzoj2101【Usaco2010 Dec】Treasure Chest 藏宝箱

    2101: [Usaco2010 Dec]Treasure Chest 藏宝箱 Time Limit: 10 Sec  Memory Limit: 64 MB Submit: 418  Solved: ...

  4. WCF Rest post请求

    只有遇到问题才能解决问题,这个问题之前也遇到过因为没有及时总结所以这个问题又重新出现困扰了我8个小时. ajax 请示WCF Rest 是一个比较成熟的技术.所以 涉及到了几个技术点 1 jquery ...

  5. Java内部类用法

    内部类可以是静态(static)的,可以使用 public.protected 和 private 访问控制符,而外部类只能使用 public,或者默认. 成员式内部类 在外部类内部直接定义(不在方法 ...

  6. 求两个list的交集和并集

    两个list的并集,只需去除重复元素即可: 将两个list放入同一个set中即可: 两个list的交集: 1将其中一个list放入set, 2循环另一个list,每次向set塞值, 3判断set的总数 ...

  7. UESTC 982质因子分解

    读入一个自然数,将nn分解为质因子连乘的形式输出. Input 有多组测试数据.输入的第一行是整数TT(0<T≤10000),表示测试数据的组数.每一组测试数据只有一行,包含待分解的自然数nn. ...

  8. C++在循环内和循环外定义变量的差异

    原文:http://blog.csdn.net/cashey1991/article/details/45127561 最后总结: 对于使用int等基本数据类型作为循环变量,只要你用的优化方面足够给力 ...

  9. appium学习【四】:第一个appium脚本

    #coding=utf-8 import os import HTMLTestRunner import unittest import time import sys from appium imp ...

  10. bzoj3620

    KMP 我似乎复杂度写的不对... 因为位置相同只算一次,后缀数组什么的都不管用了,我们就暴力kmp,但是我写的是暴力跳...竟然过了...我写bzoj3670才发现... #include<c ...