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,便是系统调用号.


 

相关文章推荐

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

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

android视频监控实例技术细节略解

  • 2013年09月04日 18:35
  • 593KB
  • 下载

看我出招之我用Nagios(技术细节)

  • 2011年12月22日 16:52
  • 340KB
  • 下载

JSON API 1.0 核心开发者自述 | 你所不知道的那些技术细节

JSON API 让设计和搭建一个 API 变得标准化,这样一来开发者能够更专注于应用本身的设计。JSON API 在目标和视野上颇具野心:它不仅定义了一种媒体类型 (application/vnd....

从技术细节看美团的架构

  • 2016年04月14日 15:26
  • 29KB
  • 下载

struts2.x一些技术细节资料总结

  • 2010年01月06日 16:10
  • 20KB
  • 下载

InSAR-DInSAR 技术细节(三) 斜坡效应

SAR影像的几何畸变 这个畸变是由地形坡度导致的,直观地理解就是一个像素对应的地面范围随着地形的不同而不同,具体地: 另外, Foreshortened areas are bright...

Python处理二进制结构化数据时的技术细节

处理二进制文件或者从网络接收字节流时,字节流中的结构化数据可能存在二进制有符号数。虽然开发者根据字节流协议可以先验的知道有符号数的字节序、字长、符号位等信息,但在使用Python进行类型转换时缺少将这...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Hook 内核函数技术细节
举报原因:
原因补充:

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