zoukankan      html  css  js  c++  java
  • rootkit应用之[三] inline hook

    标 题: rootkit应用之[] inline hook
    作 者: combojiang
    时 间: 2008-01-30,17:27
    链 接: http://bbs.pediy.com/showthread.php?t=59127

    最近为了写好rootkit inline hook篇,特意A了著名的流氓软件(cdnprot.sys,这个文件很庞大,有152k之多花费了我好几个晚上的时间,让我少看好多集的电视剧《闯关东》,在这个软件里面用了很多好的技术,不管怎么说,技术本身是无辜的,由于我们今天谈论的主题是Inline hook,因此今天只是带领大家看看他是怎样使用inline hook这项技术的。今天是一年一度的小年,发表此篇,作为对大家的小年献礼吧,顺祝大家小年好。

    关于什么是inline hook.,这些基本概念,我们就不在这里说了,大家可以google下。
    对于ring3下的inline hook使用起来非常的方便,也非常简单。但是到了ring0inline hook就麻烦些,搞不好就出现了bsod   ,我们今天讲的是内核中的inline hook。这个技术,在这个流氓软件中应用的比较稳定。我们就来看看它是怎么用的。

    先谈谈思路:

    1
      Hook之前的准备工作之一。
    在这个软件中,总共hook15native api 函数。他们分别是:
    ZwOpenKey , ZwCloseZwQueryValueKeyZwDeleteKeyZwSetValueKeyZwCreateKey,
    ZwDeleteValueKeyZwEnumerateValueKey,ZwRestoreKeyZwReplaceKeyZwTerminateProcessZwSetSecurityObjectZwCreateThreadZwTerminateThreadZwQuerySystemInformation.

    15个函数中,包括2个未公开的函数,ZwCreateThreadZwTerminateThread,这两个函数,需要我们从ntdll.dll的导出表中找到。另外,所有的native api函数的最终实现都是在ntoskrnl模块中,所以,我们使用ZwQuerySystemInformation0B号功能,找出ntoskrnl模块的内存加载区间,然后逐个判断ssdt表中这些要hook的函数地址,是否在这个区间内。确保我们是第一个吃螃蟹的人。呵呵。

    2
      Hook之前准备工作之二:
    1
    )一个全局函数表 ,保存这15个要hook的函数的原始地址。
    这个表起始地址位于:.data:00036860 ,终止于:data:0003689C 60字节
    2
    )一个hook 的函数地址表,分别对应于要hook15个函数的跳转。
    这个表起始地址位于:.data:00034E98
    .data:00034E98 off_34E98        dd offset sub_1EEA8    
    .data:00034E9C                 dd offset sub_1EE82
    .data:00034EA0                 dd offset sub_1EF82
    .data:00034EA4                 dd offset sub_1EF4A
    .data:00034EA8                 dd offset sub_1EF6D
    .data:00034EAC                 dd offset sub_1EEC1
    .data:00034EB0                 dd offset sub_1EED2
    .data:00034EB4                 dd offset sub_1EEF5
    .data:00034EB8                 dd offset sub_1EF31
    .data:00034EBC                 dd offset sub_1EF18
    .data:00034EC0                 dd offset sub_1EF93
    .data:00034EC4                 dd offset sub_1EFA8
    .data:00034EC8                 dd offset sub_1EFBD
    .data:00034ECC                 dd offset sub_1EFE6
    .data:00034ED0                 dd offset sub_1EFFF

    15个函数,都是在cdnprot.sys中实现的。

    3
    )一个用于保存函数开头字节的二维数组数据区,数组形式是 array[15][30];
      15
    个函数,每个函数有30个字节可用。 30个字节中,首先保存原hook函数开头字节,然后写入0xe9 ,再写入数组当前位置跟原hook函数地址偏移我们已复制出的字节码后的位置之间的相对偏移值。(具体我们要保存原hook函数开头多少字节,代码中有一个算法。)
      
    这个数组的作用是,当我们hook了函数后,执行完我们的hook函数之后,然后,需要恢复执行原api函数,由于原api函数开头5字节已经被改写,由于函数原开头字节已经保存到相应的数组里,因此这里的作法是,执行这个数组中的机器码,数组机器码执行到最后,会跳转到原hook函数某个偏移位置,继续执行。

    3
      Inline hook
    1)  IoAllocateMdl 
    ,分配一个mdl,将要hook的函数映射进去。
    2)  MmProbeAndLockPages
    ,锁定页面
    3)  
    去掉写保护
    4)  
    保存函数开头机器码到对应的二维数组区,改写开头5个字节,让他跳转到起始地址位于.data:00034E98的跳转表中的对应跳转函数。
    5)  
    恢复写保护
    6)  MmUnlockPages
    7)  IoFreeMdl


    4
      Inline hook后的恢复工作
    正如2步骤3)中描述的那样。

    代码太多,不在这里贴出了。
    Inline hook
    对应的函数是sub_1F30D,这个函数很庞大。嵌套了n多层。我把逆向的源文件和.idb文件附上。有兴致的可以使用ida5.2看看。

     

     

     

     

  • 相关阅读:
    AGC037F Counting of Subarrays
    AGC025F Addition and Andition
    CF506C Mr. Kitayuta vs. Bamboos
    AGC032D Rotation Sort
    ARC101F Robots and Exits
    AGC032E Modulo Pairing
    CF559E Gerald and Path
    CF685C Optimal Point
    聊聊Mysql索引和redis跳表
    什么是线程安全
  • 原文地址:https://www.cnblogs.com/dflower/p/1572520.html
Copyright © 2011-2022 走看看