文档章节

x64技术之SSDT_Hook

simpower
 simpower
发布于 08/20 17:03
字数 914
阅读 0
收藏 0

测试环境:

虚拟机: Windows 7 64bit

过PG工具

驱动加载工具

PCHunter64

系统自带的计算器和任务管理器等

实现思路:

实际思路与win32的思路一样.都是替换SSDT表里边的函数地址.不过微软被搞怕了,所以在x64上做了一些手脚.

具体手脚就是x64通过SSDT得到的函数地址,不是真实的函数绝对地址了,而是加密了的.

HOOK

1.得到系统服务表基址

2.保存需要Hook的函数地址(实际为偏移)

3.使内存可写,把表中要Hook的地址替换成KeBugCheckEx的地址,还原内存属性

4.HookKeBugCheckEx函数,在其开始处jmp到我们自己的函数地址.

5.自己实现Hook的函数,在其中做处理.

注:

简单说一下,win10x64th2及之前的版本,原始地址的保存方式是八字节的,每个地址是需要重定向的绝对地址,但从win10x64rs1开始,原始地址保存方式是四字节的,每个地址是不需要重定向的相对地址。
简单说公式就是
original_address=image_base+address_read_from_file
其中original_address和image_base是八字节整形,address_read_from_file是四字节整形
之前的公式是:
original_address=image_base+(address_read_from_file-file_image_base)
这四个变量都是八字节整形,括号内计算的是重定向


Tesla.Angela 则给出了新的计算公式

VA = KiServiceTable - NtosBase + ReloadedNtosBase;
OriAddr = getdword(VA+Index*4) + NtosBase;

x64要Hook的函数地址是 ServiceTableBase[Index]>>4 + ServiceTableBase

此处Hook了NtOpenProcess,导出序号是35号.处理了结束计算器进程的时候,禁止结束.

还原Hook的时候不需要还原KeBugCheckEx,因为这个函数就是崩溃蓝屏需要执行的函数.

这篇文章不会讲述过PG.

关键代码:

获取服务表基址

 
  1. //获取服务表基址

  2. ULONGLONG GetKeServiceDescriptorTable64()

  3. {

  4. PUCHAR StartSearchAddress = (PUCHAR)__readmsr(0xC0000082);

  5. PUCHAR EndSearchAddress = StartSearchAddress + 0x500;

  6. PUCHAR i = NULL;

  7. UCHAR byte1 = 0, byte2 = 0, byte3 = 0;

  8. ULONG temp = 0;

  9. ULONGLONG addr = 0;

  10. //开始搜索

  11. for (i = StartSearchAddress;i < EndSearchAddress;i++)

  12. {

  13. if (MmIsAddressValid(i) && MmIsAddressValid(i + 1) && MmIsAddressValid(i + 2))

  14. {

  15. byte1 = *i;

  16. byte2 = *(i + 1);

  17. byte3 = *(i + 2);

  18. if (byte1 == 0x4c && byte2 == 0x8d && byte3 == 0x15) //4c8d15

  19. {

  20. memcpy(&temp, i + 3, 4);

  21. addr = (ULONGLONG)temp + (ULONGLONG)i + 7;

  22. return addr;

  23. }

  24. }

  25. }

  26. return 0;

  27. }

获取SSDT表中的函数地址

 
  1. //获取SSDT中的函数地址

  2. ULONGLONG GetSSDTFuncCurrentAddr(ULONG id)

  3. {

  4. LONG dwtemp = 0;

  5. PULONG ServiceTableBase = NULL;

  6. ServiceTableBase = (PULONG)KeServiceDescriptorTable->ServiceTableBase;

  7. dwtemp = ServiceTableBase[id];

  8. dwtemp = dwtemp >> 4;

  9. return (LONGLONG)dwtemp + (ULONGLONG)ServiceTableBase;

  10. }

开启Hook

 
  1. //开启Hook

  2. VOID HookSSDT()

  3. {

  4. KIRQL irql;

  5. ULONGLONG dwtmp = 0;

  6. PULONG ServiceTableBase = NULL;

  7. //获取老函数地址

  8. g_OldOpenProcess = (NTOPENPROCESS)GetSSDTFuncCurrentAddr(35);

  9. //HookKeBugCheckEx

  10. InlineHookKeBugCheckEx();

  11. //保存地址数据,替换数据

  12. ServiceTableBase = (PULONG)KeServiceDescriptorTable->ServiceTableBase;

  13. OldTpVal = ServiceTableBase[35]; //保存表中的偏移变量

  14. irql = WriteProtectOFFx64();

  15. ServiceTableBase[35] = GetOffsetAddress((ULONGLONG)KeBugCheckEx);

  16. WriteProtectONx64(irql);

  17. }

HookKeBugCheckEx作为跳转

 
  1. //InlineHook_KeBugCheckEx

  2. VOID InlineHookKeBugCheckEx()

  3. {

  4. KIRQL irql;

  5. ULONGLONG myfun;

  6. UCHAR jmp_code[] = "\x48\xB8\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x00\xFF\xE0";

  7. myfun = (ULONGLONG)HookNtOpenProcess;//替换成自己的函数地址

  8. memcpy(jmp_code + 2, &myfun, 8);

  9. irql = WriteProtectOFFx64();

  10. memset(KeBugCheckEx, 0x90, 15);

  11. memcpy(KeBugCheckEx, jmp_code, 12);//拷贝12字节

  12. WriteProtectONx64(irql);

  13. }

测试效果:

过PG后,加载驱动,使用任务管理器结束"计算器"程序失败,提示"拒绝访问"

 

PCHunter64位查看,又看到驱动挂钩了NtOpenProcess函数

PS:博客的技术内容的宽度可是开的有点大了,感觉自己很难把这些坑都填完.尽力填吧,每一个技术方面都尽力去深究.不过也有自己的事要做,填坑的速度肯定是快不了的.

本文转载自:https://blog.csdn.net/wrsharper/article/details/80272337

共有 人打赏支持
simpower
粉丝 24
博文 536
码字总数 38046
作品 0
海淀
程序员
inline hook之行。(渝州)

以后的几篇blog都是关于inline hook的文章,也有可能引发其它一些列的战斗任务,也有可能一去不复返。 大侠请重新来过。 1. 战斗一: 无进程木马 所谓无进程木马,就是利用技术手段隐藏进程的...

凌子寒宵
2012/07/02
0
0
菜鸟之驱动开发4

在上一节,我们学到了如何读取SSDT表中函数的当前地址与系统地址, 有了这两个地址我们就可以判断该函数是否被inline hook了, 如果NSOpenProcess被hook了,那么我们就无法用od对进程进行载入...

长平狐
2012/08/13
45
0
SSDT-hook,IDT-hook原理

【详细过程】 这次主要说说核心层的hook。包括SSDT-hook,IDT-hook,sysenter-hook。欢迎讨论,指正!内核层需要驱动,有这方面的基础最好,如果不会,了解下其中的思路也可以的。 II. SSDT...

simpower
08/02
0
0
windows 上驱动阻止关机重启操作

Windows 上关机重启有很多相关的操作 HOOK 一个点搞不定 具体需要以下 4 处来布控 SSDT HOOK NtInitiatePowerAction 函数 ,直接返回失败废掉这个函数 SSDT HOOK NtSetSystemPowerState 函数...

sincoder
2014/03/10
0
0
菜鸟之驱动开发10

在第10节里,我们要写一个ssdt hook功能的应用程序,因为是应用程序没有SSDT HOOK的能力,所以我们要写一个具有HOOK能力的驱动,然后应用程序发命令到驱动完成功能。 其实是以前学习的总结:...

长平狐
2012/08/13
41
0

没有更多内容

加载失败,请刷新页面

加载更多

多线程

1. 多线程概念。并发和并行的概念。 多线程指的是一段时间内cpu同时执行多个线程。一个程序至少运行>=1个进程,进程就是运行中的程序,而一个进程至少运行>=1个线程,线程是操作系统能调度的...

鱼想吃肉
今天
0
0
HBase 表修复在线方式和离线方式

一、在线修复 1.1 使用检查命令 $ ./bin/hbase hbck 该命令可完整修复 HBase 元数据信息;存在有错误信息会进行输出; 也可以通过如下命令查看详细信息: $ ./bin/hbase hbck -details 1.2 ...

Ryan-瑞恩
今天
3
0
redis 系列二 -- 常用命令

1.基础命令 info ping quit save dbsize select flushdb flushall 2.键命令 2.1 set 直接赋值 set a a 2.2 get 取值 get a 2.3 exists 是否存在 exists a 2.4 expire 设置剩余时间 秒 expire......

imbiao
今天
2
0
php foreach

<?php// 数组的引用$a=array(1,2,3,4,5);foreach($a as $key=>&$value){$value=$value*2;}print_r($a);echo " $key -------------------$value\r\n";/** * ...

小张525
今天
3
0
12-利用思维导图梳理JavaSE-多线程

12-利用思维导图梳理JavaSE-多线程 主要内容 1.线程概念 2.线程开发 3.线程的状态 4.线程的同步和死锁 5.Java5.0并发库类 QQ/知识星球/个人WeChat/公众号二维码 本文为原创文章,如果对你有一...

飞鱼说编程
今天
2
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部