• 【旧文章搬运】对抗RKU的StealthCode检测


    原文发表于百度空间,2009-07-02
    ==========================================================================

    快一个月没写东西了,随便写点~~

    StealthCode检测似乎是RootkitUnhooker独有的功能,主要是检测那些无主的可执行代码片段。
    比如一些放在Pool中的代码,或者驱动中的代码但驱动隐藏了使得RKU无法找到,就认为是StealthCode了。
    RKU检测StealthCode的方法似乎是这样的(结合网上一些资料及自己的观察):
    InlineHook以下StealthCode中常用的函数
    ExAllocPool
    ExAllocPoolWithTag
    KeDelayExecutionThread
    并将调用者的相关信息记录在案
    在查找线程时会记录线程(内核线程)的StartAddress,如果StartAddress不在它能找到的模块中,那好,RKU就认为找到了一处StealthCode
    对于以上三个函数的Hook,RKU都是5字节的HeadInline,所以可以直接jmp到FunAddr+5跳过它的Hook.比如这样:

    //跳过RKU的InlineHook
    __declspec( naked ) NTSTATUS
    myKeDelayExecutionThread (
    KPROCESSOR_MODE WaitMode,
    BOOLEAN Alertable,
    PLARGE_INTEGER Interval
         )
    {
    _asm
    {
       push ebp
       mov ebp,esp
       mov eax,g_AddrKeDelayExecutionThread
       add eax,5
       jmp eax
    }
    }

    然后所有调用KeDelayExecutionThread的地方直接换成myKeDelayExecutionThread就OK了。跳过Hook之后,RKU自然是无法记录到的。

    对于StartAddress检测法,也很容易欺骗,只要我们把线程的启动地址给DKOM掉就可以了。

    lkd> dt _ETHREAD 821bb5a8
    nt!_ETHREAD
    ....
    +0x220 ThreadsProcess    : 0x821bb830 _EPROCESS
    +0x224 StartAddress      : 0x80684528 

    就是这个东西,改成任意一个已知模块中的有效地址就可以了,比如ntoskrnl中某个函数的地址~~


    或者另外一种方法,首先找一个已知模块中的有效地址,更改该处代码,使它跳到我们真正的线程地址处。然后PsCreateSystemThread时把线程的启动地址设为刚才找到的那个有效地址就可以了。启动线程之后,再把刚才改的代码还原回去,了无痕迹.
    线程是我们的,但启动地址是别人的,这就叫"嫁祸他人",走自己的路,让别人背黑锅去吧~~(该方法在Ring3也可以用,VirtualAlloc一块内存,写入代码,把启动地址嫁祸到任意一个模块中(比如kernel32.dll中~~),如果有人想检测线程地址的话......)
    比如,我改一下KeBugCheckEx(之所以选它,是因为只要系统还正常,就调用不到它)的入口代码,如下:


    然后PsCreateSystemThread开启线程,来看一下线程信息:

    启动地址是KeBugCheckEx,就是这个效果~~ RKU看到这个地址所在的模块是已知的,就自然不认为是StealthCode了,Over.

  • 相关阅读:
    向eureka注册正确的ip地址
    sleuth + zipkin 链路分析
    Yii2的整体结构概览
    Redis实现消息队列
    Redis使用场景梳理
    redis基础知识
    TCP服务
    数据结构-队列
    看见
    线性表的链式存储结构
  • 原文地址:https://www.cnblogs.com/achillis/p/10181657.html
Copyright © 2020-2023  润新知