FUTo: Bypassing Blacklight and IceSword

windbg !htrace 学习总结 windbg-!htrace(跟踪句柄泄漏) http://blog.youkuaiyun.com/hgy413/article/details/7631187 !htrace !htrace(Handle Trace) 扩展用于显示一个或多个句柄的堆栈回溯信息。 直接用!htrace -?可以看到简单使用说明: [cpp] view plain copy 0:000> ! 阅读详情
1.前言

摘要

自从介绍了FU,ROOTKIT世界就从执行系统HOOK,转移到了隐藏他们的存在。因为在攻击方面

新的改变,那么新的防御就不得被建立。新的算法被ROOTKIT检测系统采用。例如BLACKLIGHT,

就已经从原来检测ROOTKIT HOOK的存在,转变到试图找到是什么ROOTKIT正在隐藏。这篇文章将

讨论被Blacklight和IceSword用来检隐藏进程的算法。他也将展示,在ROOTKIT检测领域的缺点,

并且介绍一个基于FU的更完全的隐藏技术。

2.说明

在过去的一两年中,在ROOTKIT世界中已经有了很大的发展。最近的里程碑包括FU ROOTKIT,他

使用了Direct Kernel Object Manipulation (DKOM)

他是第一个ROOTKIT检测程序VICE的产生,,第一个主流ROOTKIT检测程序的诞生,Shadow Walker

的诞生,他是一个HOOK了memory manager进行隐藏的ROOTKIT。

3.Blacklight

这篇文章将先研究Blacklight,因为他的算法是被我所关注的。并且,IceSword采用了和

Blacklight类似的算法,因此如果在Blacklight中发现一个弱点,那么他也可能在IceSword

中存在。Blacklight占用一个USERLAND来检测进程,虽然简单,但是他的算法却是惊人的有效。

借助于,在开始时,创建TLS(ThreadLocal Storage)回收表,Blacklight产生了一个强大的反

调试特征。借助在进程对象完全创建前分流主进程,Blacklight的TLS表试图迷惑调试器。

这能被实现,因为TLS回收程序在进程完全初始化前被调用。Blacklight也有反调试措施,他能检

测到调试器对他的扫描。与其战胜反调试措施,作者更想使TSL程序失效。为了做到这个,作者使

用了一个叫LordPE的工具,他允许使用者编辑PE文件。作者使用这个工具来ZERO OUT TSL回收表,

这就使分流程序丧失了能力,并且给作者使用API监控器的可能。

你应该注意到,在使回收程序丧失能力的同时,将允许你attach一个调试器,但是当使用者在

Blacklight单击扫描时Blacklight的GUI将探测调试器并且退出。围绕着第二种反调试程序,作

者决定分析Blacklight调用过程,在最后作者将使用Rohitab API Monitor。

在测试中,你能看到调用API OpenProcess失败(tls zero is Blacklight without a TLS table)。

Blacklight试图用PID号为0x1CC, 0x1D0, 0x1D4, 0x1D8打开一个进程。在PID为0x0到0x4E1C

范围内,他调用OpenProcess来循环所有可能的PID。Blacklight保存一个表,表中包括他使用

PIDB方法能打开的所有进程。然后,他调用CreateToolhelp32Snapshot,这给了Blacklight第二

个进程表。然后Blacklight将两个表对比,看PIDB表中的进程,是否有不在被CreateToolhelp-

-32Snapshot函数返回中所产生的表中。如果有差异,这些进程就被认为是隐藏的进程,并报告给

使用者。

3.1) Windows OpenProcess

In Windows, OpenProcess是一个包装NtOpenProcess程序的函数。NtOpenProcess在内核中使用

NTOSKRNL.EXE被实现 他的函数原形是:

NTSTATUS NtOpenProcess (
OUT PHANDLE ProcessHandle,
IN ACCESS_MASK DesiredAccess,
IN POBJECT_ATTRIBUTES ObjectAttributes,
IN PCLIENT_ID ClientId OPTIONAL);

NtOpenProcess执行三个主要的功能,

1.他检测被PsLookupProcessByProcessId调用的进程是否存在。

2.他试图给被ObOpenObjectByPointer调用的进程,开放一个句柄。

3.如果他成功的为进程打开一个句柄,他将给调用者返回那个句柄。

PsLookupProcessByProcessId是下一个研究的地方。一个突出的问题是,PsLookupProcessBy-

-ProcessId如何知道一个被给出的PID是有效的进程的一部分,答案就在下面的几行汇编码中,

PsLookupProcessByProcessId:
mov edi, edi
push ebp
mov ebp, esp
push ebx
push esi
mov eax, large fs:124h
push [ebp+arg_4]
mov esi, eax
dec dword ptr [esi+0D4h]
push PspCidTable

call ExMapHandleToPointer

从上面的汇编码中,我们清楚的知道ExMapHandleToPointer向PspCidTable询问以得到PID。

现在我们已经清晰的了解Blacklight如何检测隐藏的进程:

1.Blacklight通过一个有效的PID范围来开始一个循环,0 through 0x41DC.

2.在每个可能的PIDS上他调用OpenProcess。

3.OpenProcess调用NtOpenProcess

4.NtOpenProcessPsLookupProcessByProcessId来校验进程存在。

5.PsLookupProcessByProcessId使用PspCidTable来校验进程的存在。

6.NtOpenProcess调用ObOpenObjectByPointer来得到进程句柄。

7.如果OpenProcess成功,Blacklight将存储进程信息并继续循环。

8.如果用尽了所有可能的PID来建立进程列表。Blacklight将PIDB和创建的列表(由调用

CreateToolhelp32Snapshot所创建)进行对比,CreateToolhelp32Snapshot是一个API函数,

用来得到所有在系统运行的进程的快照。如果两个表有差别就意味着,含有隐藏进程。

3.2) The PspCidTable

The PspCidTable is a "handle table for process and thread client IDs".Every process'

PID corresponds to its location in the PspCidTable. The PspCidTable is a pointer

to a HANDLE_TABLE structure.

typedef struct _HANDLE_TABLE {

PVOID p_hTable;
PEPROCESS QuotaProcess;
PVOID UniqueProcessId;
EX_PUSH_LOCK HandleTableLock [4];
LIST_ENTRY HandleTableList;
EX_PUSH_LOCK HandleContentionEvent;
PHANDLE_TRACE_DEBUG_INFO DebugInfo;
DWORD ExtraInfoPages;
DWORD FirstFree;
DWORD LastFree;
DWORD NextHandleNeedingPool;
DWORD HandleCount;
DWORD Flags;
};

WINDOWS提供了许多无输出的函数来利用和得到PspCidTable信息。他们包括:

- [ExCreateHandleTable]建立一个无进程句柄表,

- [ExDupHandleTable]当spawning一个进程时被调用

- [ExSweepHandleTable] 被用于进程 rundown.

- [ExDestroyHandleTable] 当进程存在是被调用.

- [ExCreateHandle] 创建新的进程表入口.

- [ExChangeHandle] 在句柄上被用来改变access mask .

- [ExDestroyHandle] 执行CloseHandle的功能.

- [ExMapHandleToPointer] 返回对象相应的句柄的地址.

- [ExReferenceHandleDebugIn] 跟踪句柄.

- [ExSnapShotHandleTables]被用来句柄搜索 (for example in oh.exe).]

下面是使用无输出函数移动PspCidTable表中的一个进程对象的代码。为了无输出函数的需要,

他使用编码的地址。然而,一个ROOTKIT能找到这些函数地址。

typedef PHANDLE_TABLE_ENTRY (*ExMapHandleToPointerFUNC)
( IN PHANDLE_TABLE HandleTable,
IN HANDLE ProcessId);

void HideFromBlacklight(DWORD eproc)
{
PHANDLE_TABLE_ENTRY CidEntry;
ExMapHandleToPointerFUNC map;
ExUnlockHandleTableEntryFUNC umap;
PEPROCESS p;
CLIENT_ID ClientId;

map = (ExMapHandleToPointerFUNC)0x80493285;

CidEntry = map((PHANDLE_TABLE)0x8188d7c8,
LongToHandle( *((DWORD*)(eproc+PIDOFFSET)) ) );
if(CidEntry != NULL)
{
CidEntry->Object = 0;
}
return;
}

既然PspCidTable的工作是保持追踪所有的进程和线程,那么ROOTKIT检测器使用PspCidTable来

找到隐藏进程也是合乎逻辑的。但是,使用一个单独的数据结构不是一个很好的算法,如果

ROOTKIT改变这个数据结构,系统和另外的程序将不能找到存在的隐藏进程,新的ROOTKIT检测

程序算法应该被设计成有重叠的依靠部分,以便一个单独的改变将被识别。

4) FUTo

为了验证现有的ROOTKIT检测程序算法有缺陷,作者建立了FUTO,FUTO是一个FU ROOTKIT的新版

本。FUTO添加了不是用任何函数调用就可操作PspCidTable的功能. 他使用DKOM技术来隐藏

PspCidTable表中的特殊的对象当实现FUTO的新功能时,有一些设计上的考虑。首先,像

ExMapHandleXXX功能,PspCidTable不能被内核输出,为了克服这个,FUTO自动的检测

PspCidTable借助于寻找PsLookupProcessByProcessId函数并且分解他寻找第一个函数调用,

当写这篇文章时,第一个函数调用总是对ExMapHandleToPointer。ExMapHandleToPointer装载

PspCidTable来作为他的第一个参数,使用这个知识,就相当直接的找到PspCidTable

PsLookupProcessByProcessId:
mov edi, edi
push ebp
mov ebp, esp
push ebx
push esi
mov eax, large fs:124h
push [ebp+arg_4]
mov esi, eax
dec dword ptr [esi+0D4h]
push PspCidTable
call ExMapHandleToPointer

一个寻找PspCidTable更明智的方法应该被写出,Opc0de写了一个更好的方法来探测像

PspCidTable这样的无输出变量, PspActiveProcessHead, PspLoadedModuleList等等。

Opc0des的方法不需要像FUTO那样的内存扫描。Instead Opc0de found that the

KdVersionBlockfield in the Process Control Region structure pointed to a

structureKDDEBUGGER_DATA32. The structure looks like this:

typedef struct _KDDEBUGGER_DATA32 {

DBGKD_DEBUG_DATA_HEADER32 Header;
ULONG KernBase;
ULONG BreakpointWithStatus; // address of breakpoint
ULONG SavedContext;
USHORT ThCallbackStack; // offset in thread data
USHORT NextCallback; // saved pointer to next callback frame
USHORT FramePointer; // saved frame pointer
USHORT PaeEnabled:1;
ULONG KiCallUserMode; // kernel routine
ULONG KeUserCallbackDispatcher; // address in ntdll

ULONG PsLoadedModuleList;
ULONG PsActiveProcessHead;
ULONG PspCidTable;

ULONG ExpSystemResourcesList;
ULONG ExpPagedPoolDescriptor;
ULONG ExpNumberOfPagedPools;

[...]

ULONG KdPrintCircularBuffer;
ULONG KdPrintCircularBufferEnd;
ULONG KdPrintWritePointer;
ULONG KdPrintRolloverCount;

ULONG MmLoadedUserImageList;

} KDDEBUGGER_DATA32, *PKDDEBUGGER_DATA32;


As the reader can see the structure contains pointers to many of the commonly

needed/used non-exported variables.这是一个更好的方法来寻到PspCidTable和另外变量

第二个设计考虑有一点麻烦,当FUTO从PspCidTable移动一个对象时,HANDLE_ENTRY被NULL代

替来表示的进程不存在,当被隐藏的进程被关闭时问题就产生了。当进程被关闭时,他将索

引进入PspCidTable并且丢弃NULL对象,这将引起蓝屏。解决方法是:首先,FUTO使用

PsSetCreateProcessNotifyRoutine建立一个进程通报程序。当进程创建时回收函数将被调用

但是更重要的是他将在进程被删除是调用。回收在隐藏的进程被终止前执行。因此,他在系

统崩溃前调用。当FUTO删除包含指向流氓对象的索引时,他将保存the HANDLE_ENTRYs的值同

样也保留,索引为以后使用,当进程被关闭时,FUTO将在关闭进程前恢复对象。

(下面的是废话~~~~~~~~~~~,不翻译了
FUTo_enhanced.zip 著名的的Rootkit,有很强的学习价值 立即下载

相关推荐

WSL2 Ubuntu 22.04安装NVIDIA驱动避坑指南:从驱动版本选择到CUDA环境验证

本文详细介绍了在WSL2 Ubuntu 22.04中安装NVIDIA驱动和配置CUDA环境的完整流程,包括驱动版本选择、环境变量设置以及常见问题解决方案。通过本指南,用户可以避免常见的安装陷阱,确保GPU加速环境正确配置,适用于深度学习开发和CUDA编程。

weixin_28419039的博客 464

PspCidTable概述

PspCidTable也是一个句柄表,其格式与普通的句柄表是完全一样的.但它与每个进程私有的句柄表有以下不同:1.PspCidTable中存放的对象是系统中所有的进线程对象,其索引就是PID和TID2.PspCidTable中存放的直接是对象体(EPROCESS和ETHREAD),而每个进程私有的句柄表则存放的是对象头(OBJECT_HEADER)3.PspCidTable是一个独立的句柄表,而每

yaneng的专栏 1461

开箱即用的Platform IO开发平台(包括Arduino,ESP8266,ESP32,STM32)

开箱即用的 Platform IO 离线开发环境,包含(ESP32,ESP32S2,ESP8266,Arduino,STM32)

qq_19703307的博客 757

PspCidTable进程枚举

-------------------------------------这是分割线--------------------------------------- Windows句柄表格式 句柄是Windows对象管理中引入的一个东西,它的实际意义是对象在句柄表中的索引。Windows2000使用的是固定的三层句柄表,而WindowsXP和Windows2003都是使用的动态可扩展的

rongwenbin的专栏 1681

BSW: Dcm模块配置--28服务

这个章节讲解下UDS中的28服务(Communcation Control)的配置,顾名思义,对当前ECU的通讯状态进行变更,主要设置应用报文,网络管理报文的收发控制,通常应用在刷写APP软件时,降低总线负载。这里首先要提醒的一点是,28服务几乎不需要手写代码,只有在客户需求要求前置条件不满足时报特定NRC时才需要填充代码。实际配置中主要涉及的模块有DCM,BSWM,ComM,RTE.2.BswM模块的配置。3.ComM模块的配置。1.DCM模块的配置。

Forever_Oct的博客 3086

GPS从入门到放弃(一) --- GPS基础原理

GPS从入门到放弃(一) — GPS基础原理 GPS,全称Global Positioning System,已经广泛应用于我们的日常生活中了,现在的智能手机 里都会自带GPS定位功能。这是一个美国的全球定位系统,虽然我们现在也有北斗了,但毕竟GPS搞的早,所以先从它开始研究起。 整个GPS系统分三大部分: 地面站 卫星 接收机 地面站负责监控。它们通过接收、测量各个卫星信号,计算卫星的运行轨...

tyst08的专栏 2万+

Rootkit技术

随着安全技术的发展和计算机用户群的技术提高,一般的木马后门越来越难生存,于是一部分有能力的后门作者把眼光投向了系统底层——ring 0。位于ring 0层的是系统核心模块和各种驱动程序模块,所以位于这一层的木马也是以驱动的形式生存的,而不是一般的exe。后门作者把后门写成符合wdm规范 (windows driver model)的驱动程序模块,把自身添加进注册表的驱动程序加载入口,便实现了“无启

唯一谣|Airs|走尽天涯路|极地阳光 917

手把手教你用RSoft BPM仿真一个1x2光分束器:从参数设置到结果分析全记录

本文详细介绍了使用RSoft BPM模块设计和仿真1×2光分束器的完整流程,包括参数设置、结构建模、仿真配置和结果分析。通过实战指南,帮助读者掌握光波导器件的仿真技术,实现50:50功率分配的设计目标,适用于光通信和集成光学领域的研究与应用。

weixin_30545945的博客 546

一种Object hook的思路和实现过程

 作 者: sudami时 间: 2008-08-08,20:34链 接: http://bbs.pediy.com/showthread.php?t=70329 作者:sudami [sudami@163.com]时间:2008/08/08 主题:NtClose相关逆向关键词:Object/type/hook/OkayToCloseProcedure ----------------------

2691

多周期路径及set_multicycle_path详解

默认情况下,每条路径都被定义为单周期,即源触发器在时钟的任一边沿启动(launch)的数据都应该由目的触发器在时钟的下一上升沿捕获(capture)。 有的设计需要在数据被捕获前提供一些额外的周期,这类路径被称为多周期路径。 一、set_multicycle_path命令 命令格式如下: set_multicycle_path .........

Jackiezhang1993的博客 4万+

Open3D——点云构建Delaunay三角网【2026最新版】

点云构建Delaunay三角网

点云侠的博客 8371

FUTo

Author: peter # Views: 1259 Printer Friendly ...  ForewardSince the introduction of FU, the rootkit world has moved aw

1796

2026.5.3:Ubuntu26.04下uv所需的环境变量pyproject.toml

本文档提供了Python开发环境的配置指南。主要包括: 设置环境变量(HF_ENDPOINT、UV_PYTHON_INSTALL_MIRROR等) 创建pyproject.toml配置文件,定义项目元数据(名称、版本等) 指定依赖项(torch系列库)及其安装源(PyTorch官方CUDA 12.8镜像) 配置Python版本要求(>=3.13,<3.14) 设置平台限制(Linux/Windows) 该配置适用于需要PyTorch CUDA 12.8支持的项目开发环境搭建。

拥抱具身智能,昇腾Ascend C 593

Six Rootkit Detectors Protect Your System

 原始链接:http://www.informationweek.com/story/showArticle.jhtml?articleID=196901062In October 2005, Windows expert Mark Russinovich broke the news about a truly underhanded copy-protection technology tha

1422

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

遍历PspCidTable表检测隐藏进程

一、PspCidTable概述 PspCidTable也是一个句柄表,其格式与普通的句柄表是完全一样的,但它与每个进程私有的句柄表有以下不同: 1.PspCidTable中存放的对象是系统中所有的进程线程对象,其索引就是PID和TID。 2.PspCidTable中存放的直接是对象体(EPROCESS和ETHREAD),而每个进程私有的句柄表则存放的是对象头(OBJECT_HE...

503

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

Windows 10 X64 内核对象句柄表解析

fweWindows 很多API函数都会创建和使用句柄(传入参数),句柄代表一个内核对象的内存地址,每个进程都有一个句柄表,它保存着进程拥有的句柄,内核也有一个句柄表 PspCidTable,它保存着整个系统的句柄。0xffff8d85`570ff000 notepad.exe句柄表地址,低两位为0 表示是1级表。(句柄项>>0x10)&0xfffffffffffffff0 = 对象地址(低位)句柄表地址+(进程ID>>0xa*8)-1。从内核句柄项中解析出内核对象地址。由上内核函数逆向可知。

vs2008ASPNET的专栏 2046

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

Rootkit木马:隐藏技术发展的颠峰

Rootkit木马:隐藏技术发展的颠峰自从“广外幽灵”开创了dll木马时代的先河以来,现在采用线程注射的dll木马和恶意程序已经随处可见了,除了普遍被采用的另行编写dll加载器程序躲在启动项里运行加载dll主体之外,“求职信”还带来了一种比较少见的通过注册表 “hkey_local_machine /software/microsoft/windowsnt/currentversion

唯一谣|Airs|走尽天涯路|极地阳光 2562

Rootkit介绍

  Rootkit 是一种特殊类型的 malware(恶意软件)。   Rootkit 之所以特殊是因为您不知道它们在做什么事情。Rootkit 基本上是无法检测到的,而且几乎不能删除它们。   虽然检测工具在不断增多,但是恶意软件的开发者也在不断寻找新的途径来掩盖他们的踪迹。   Rootkit 的目的在于隐藏自己以及其他软件不被发现。它可以通过阻止用户识别和删除攻击者的软件来达到这个目的...

weixin_34400525的博客 538

关于rootkit和anti-rootkit的一些思考(一)

       作了进两个月的rootkit和anti-rootkit,不免有很多思考。你一直在想握着篇文章算是什么类型的呢,心得,算不上,讲技术的,更不说,就叫日志吧。如果你不幸看到这篇文章,发现几乎没有叫的是对的,请不要大惊小怪。当然我更欢迎你指出。       说道rootkit和anti-rootkit,我想有一个不能不说的是hook。很多rootkit和anti-rootkit产品都在

MTrickster的专栏 1232

简单认识Anti-RootKit

简单认识Anti-RootKit 作者:single 现在RK(rootkit)和ARK(anti-rootkit)的斗争已经进行了很久,在印象中最早出来的ARK工具是冰刃(IceSword),从冰刃开始出来到现在RK和ARK的斗争一直在继续,目前冰刃还是在流行当中,自己感觉也正是冰刃的出来才带动了当前流行的RK和ARK的斗争 呵呵,现在很多病毒木马已经广泛的带有驱动,使用一些RK

程序人生,学海无涯 3556

【旧文章搬运】PspCidTable概述

原文发表于百度空间,2009-03-28========================================================================== PspCidTable也是一个句柄表,其格式与普通的句柄表是完全一样的.但它与每个进程私有的句柄表有以下不同:1.PspCidTable中存放的对象是系统中所有的进线程对象,其索引就是PID和TID2.Psp...

weixin_30824277的博客 217

【旧文章搬运】Windows句柄分配算法(一)

原文发表于百度空间,2009-04-04========================================================================== 分析了Windows句柄表的分配算法之后,综合WRK1.2中的代码以及Window XP下的实践,继续分析句柄的分配算法~~为了便于描述,先定义几个概念:FreeHandle即尚未被使用的Handle,Fre...

weixin_30587025的博客 259

《Undocumented Windows 2000 Secrets》翻译 --- 第七章(2)

第七章  Windows 2000的对象管理翻译:Kendiv( fcczj@263.net )更新:Sunday, May 22, 2005 声明:转载请注明出处,并保证文章的完整性,本人保留译文的所有权利。OBJECT_TYPE结构在前面讨论对象表头字段时,总是涉及到“类型对象”或OBJECT_TYPE结构,那么现在就让我们开始讨论它们。正式的来讲,一个类型对象是一种特殊类型的对象,它可以是一

Kendiv's Box 4359
上一篇: ring0调用Ring3的代码
下一篇: 若干重要的Windows参考资料
iiprogram
博客等级 码龄25年 1068粉丝 1515原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值