Hook 内核函数技术细节

原创 2007年09月24日 08:20:00

刚开始看到通过 SSDT 来 HOOK ZwXXX 内核函数的方法时不是很了解, 等把 ZwXXX 反汇编后才发现技术细节.
原来也没什么新鲜的,就是找到目标函数在 SSDT 中的位置( 偏移量=位置*4 ), 然后保存并替换偏移量处的值为自己新的函数地址就行了。

这种技术现在已是老掉牙了,不过在实际的软件开发中也比较常用, 可以实现各种监控功能.
上次安了个诺顿, 它把所有的 ZwXXX 都给 Hook, 而且在 service.exe 注入了监视线程,作用是防止主进程被关闭.
不说别的了,免得思路被打断了.


下面以 Hook ZwDeviceIoControlFile 为例说明一下:

例如下面的 ring0 级代码:

VOID HookStart( void )
{
    if( !IsHooked )
    {
        RealZwDeviceIoControlFile = SYSCALL( ZwDeviceIoControlFile );

        SYSCALL( ZwDeviceIoControlFile ) = (PVOID) HookZwDeviceIoControlFile;

        IsHooked = TRUE;
    }
}

你能想象这样的代码能取得 ZwDeviceIoControlFile 在 SSDT 中的位置吗?
现在再让我们看看反汇编代码:

.text:00010381                 mov     eax, ds:ZwDeviceIoControlFile   ; 保存 ZwDeviceIoControlFile 地址到 eax
.text:00010386                 mov     ecx, ssdt                                          ; 取得 ssdt 的地址, 保存到 ecx
.text:0001038C                 push    esi
.text:0001038D                 mov     edx, [eax+1]              ; 取得 ZwDeviceIoControlFile 在 SSDT 中的位置, 参看
                                                                                             ; 该函数反汇编后的代码 B838000000    MOV EAX,      00000038,  eax+1 的效果是跳过了B8, 指向了38000000。[eax+1] 的值自然就是 00000038 (NOTE: Little-Endian).现在 edx 值为 00000038.

.text:00010390                 mov     esi, [ecx]                      ; 取得 SSDT 的地址 ==> esi

.text:00010392                 mov     edx, [esi+edx*4]         ; 保存 ZwDeviceIoControlFile 真正的函数地址
.text:00010395                 pop     esi
.text:00010396                 mov     dword_10814, edx

.text:0001039C                 mov     eax, [eax+1]                ; ZwDeviceIoControlFile 函数在 SSDT 的位置 ===> eax
.text:0001039F                 mov     ecx, [ecx]                      ; SSDT 地址


.text:000103A1                 mov     dword ptr [ecx+eax*4], offset sub_1030E    ; 用我们自己新的函数替换
                                                                                  ; ZwDeviceIoControlFile 在SSDT位置中的数值


OK!! ,现在已经在 dword_10814 保存了正确的 ZwDeviceIoControlFile 地址, 并把我们自己的函数 dword_10814 替换了ZwDeviceIoControlFile , 到此完成!


下面是 ZwDeviceIoControlFile的反汇编代码, 可以简单的在windbg 中用 "u ZwDeviceIoControlFile" 得到反汇编代码

00400BC6: B838000000               MOV EAX, 00000038
00400BCB: 8D542404                   LEA EDX, [ESP+04]
00400BCF: CD2E                           INT 2E
00400BD1: C22800                       RETN 0028

入口点加1,便是系统调用号.


 

对DeviceIoControl()函数控制码的整理

以下内容全部来自于MSDN,里面部分内容一时不知道怎么翻译,为了不浪费太多的时间,所以暂时用“暂缺”代替,以后有机会再补上。内容繁多,差错难免,不当之处,敬请指正。...
  • mrxyz098
  • mrxyz098
  • 2014年06月01日 21:51
  • 4921

GetVolumeInformation获取磁盘信息与DeviceIoControl获取硬盘信息

硬盘序列号: 英文名 Hard Disk Serial Number, 该号是出厂时生产厂家为区别产品而设置的, 是唯一的, 是只读的, 利用硬盘序列号的加密往往是利用其唯一和只读的特性, 大多是针对...
  • zhiweiyouzhishenghuo
  • zhiweiyouzhishenghuo
  • 2013年02月20日 14:14
  • 14556

delphi 调用驱动

unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls...
  • chinazhd
  • chinazhd
  • 2011年05月23日 18:16
  • 1177

通过hook Linux内核函数,监控进程/线程创建与销毁

还是实验室蛋疼项目的需求催出来的东西,蛋疼要死,CS专业读研难道就等于干2-3年义工?? Linux实际上木有线程这玩意,具体到内核里面就是个进程组头+一堆轻量级进程 太感谢Linus了,工作量瞬间下...
  • warriorpaw
  • warriorpaw
  • 2013年12月09日 19:49
  • 5237

另类挂钩-RING3数据包监视

另类挂钩 RING3数据包监视 前几天朋友让帮忙写一个RING3程序来监视TCP包并做数据包分析 本来想HOOK ws2_32!WSASend/Send/WSARecv/Recv,后来发现...
  • jiangqin115
  • jiangqin115
  • 2015年10月29日 16:46
  • 424

Linux Kernel 学习笔记10:hook函数

(本章基于:Linux-4.4.0-37) linux 内核中有一套hook函数机制,可在不同hook点位置监控网络数据包,并执行丢弃、修改等操作。网络防火墙就是通过此机制实现的。 注册注销hoo...
  • stone8761
  • stone8761
  • 2017年06月01日 10:03
  • 762

ObjectC Hook函数的实现与实战

一、简介在一个类没有实现源码的情况下,如果你要改变一个类的实现方法,你可以选择重继承该类,然后重写方法,或者使用Category类别名暴力抢先的方式。但是这两种方式,都需要我们在使用的时候改变我们的编...
  • yixiangboy
  • yixiangboy
  • 2016年05月21日 23:35
  • 1956

通过内核HOOK处理某个进程对SetCursorPos的调用

最近打开一个游戏,发现该游戏不断调用SetCursorPos这个函数,所以想着在内核中PASS掉它,经过两周断断续续的研究,终于在今晚成功PASS掉它。 经过两周断断续续的查资料,看视频,分析,终于...
  • wei5635607
  • wei5635607
  • 2016年11月28日 21:43
  • 267

内核编程之SSDTHook(2)Hook NtOpenProcess实现进程保护

本博文由CSDN博主zuishikonghuan所作,版权归zuishikonghuan所有,转载请注明出处: 上一篇博文“内核编程之SSDTHook(1)原理(地址:)”中,介绍了SSDTHook的...
  • zuishikonghuan
  • zuishikonghuan
  • 2016年03月11日 14:20
  • 2466

关于Android上对so进行函数的hook的完整原理解析,最新测试通过

http://pan.baidu.com/s/1boiw3iJ          共享出来源码吧,里面有远程注入(inject)和下面方法2的源码以及使用libsbustrate的方式,修改go...
  • scjie168
  • scjie168
  • 2016年09月07日 18:05
  • 1357
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Hook 内核函数技术细节
举报原因:
原因补充:

(最多只允许输入30个字)