文档章节

x64技术之SSDT_Hook

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

测试环境:

虚拟机: 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

共有 人打赏支持
上一篇: windbg学习记录
下一篇: Bypassing PatchGuard 3
simpower
粉丝 26
博文 564
码字总数 43779
作品 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
菜鸟之驱动开发10

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

长平狐
2012/08/13
41
0
windows 上驱动阻止关机重启操作

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

sincoder
2014/03/10
0
0

没有更多内容

加载失败,请刷新页面

加载更多

可自定义扩展底部列表对话框ListBottomSheetDialogFragment

因为需要,为了方便,构建了一个可以自定义扩展的底部列表对话框,可以应付大部分场景。 效果图如下: 1.默认实现: 2.自定义列表实现 3.自定义头部和列表实现 一.可实现功能 1.默认可实现通...

明月春秋
37分钟前
1
0
数据库---增删改查

增:insert into 表名(列名1,列名2) values(‘列值1’,‘列值2’) 多行数据处理:insert into 表名(列名1,列名2) select ‘列值1’,‘列值2’ union select ‘列值1.1’,‘列值2.2...

森林之下
38分钟前
2
0
分布式/集群下session共享方案汇总

除去那些对容器依赖特别高的方案(如: 基于Tomcat的memcached-session-manager / tomcat-redis-session-manager,基于Jetty的jetty-nosql-memcache / jetty-session-redis ),自己整理了下...

哥本哈根的小哥
今天
2
0
Vue中的缩写:v-bind、v-on

v-bind 缩写:: 预期:any (with argument) | Object (without argument) 参数:attrOrProp (optional) 修饰符: .prop - 被用于绑定 DOM 属性。 .camel - (2.1.0+) 将 kebab-case 特性名转换......

文文1
今天
2
0
epoll中使用

1、一个线程epoll_wait时,另一个线程调用epoll_ctl是安全的。 2、使用edge触发,在socket有数据到来后,不收取数据,再次调用epoll_ctl将socket加入,仍会触发下一次动作。 asio用该方法来发...

gelare
今天
2
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部