简介

线程所属的父进程 _EPROCESS 结构体中的 ThreadListHead 成员是当前进程中所有线程的双向链表头,该成员有两个,分别在 0x500x190 处。我们可以通过该线程链表头进行线程遍历,也可以通过直接遍历 _ETHREAD 结构体中的 ThreadListEntry 成员实现遍历进程中的所有线程,ThreadListEntry 分别位于 0x1b00x22c 处。

我们可以通过 _ETHREADThreadListEntry 断链实现线程隐藏。需要注意的是,ThreadListEntry 中的地址不能直接置为0,而是因指向自己,否则会触发蓝屏。

关于 _EPRICESS 的结构体,可参考
_EPROCESS断链 —— 实现进程内核隐藏

_ETHREAD

_ETHREAD 的结构如下:

kd> dt _ETHREAD
nt!_ETHREAD+0x000 Tcb              : _KTHREAD  //“可等待”对象,比如Mutex互斥体、Event事件等(WaitForSingleObject)/*kd> dt _KTHREADnt!_KTHREAD+0x000 Header           : _DISPATCHER_HEADER+0x010 MutantListHead   : _LIST_ENTRY+0x018 InitialStack     : Ptr32 Void        // 记录R0栈顶初始地址, 用于线程切换+0x01c StackLimit       : Ptr32 Void      // 记录R0栈界限+0x020 Teb              : Ptr32 Void     // R3 _TEB, Thread Environment Block, 线程环境块// fs[0]: R3 表示_TEB; R0表示 KPCR+0x024 TlsArray         : Ptr32 Void+0x028 KernelStack      : Ptr32 Void     // 记录R0栈顶, 用于线程切换时, 填充TSS的ESP0+0x02c DebugActive      : UChar  // 当前线程是否处于调试状态// 如果值为-1 不能使用调试寄存器:Dr0 - Dr7+0x02d State            : UChar // 当前线程的状态, 就绪、阻塞+0x02e Alerted          : [2] UChar+0x030 Iopl             : UChar+0x031 NpxState         : UChar+0x032 Saturation       : Char+0x033 Priority         : Char+0x034 ApcState         : _KAPC_STATE       // APC 相关   +0x04c ContextSwitches  : Uint4B+0x050 IdleSwapBlock    : UChar+0x051 Spare0           : [3] UChar+0x054 WaitStatus       : Int4B+0x058 WaitIrql         : UChar+0x059 WaitMode         : Char+0x05a WaitNext         : UChar+0x05b WaitReason       : UChar+0x05c WaitBlockList    : Ptr32 _KWAIT_BLOCK+0x060 WaitListEntry    : _LIST_ENTRY // 等待链表+0x060 SwapListEntry    : _SINGLE_LIST_ENTRY    // 就绪链表+0x068 WaitTime         : Uint4B+0x06c BasePriority     : Char // 其初始值是所属进程的BasePriority值, // 以后可以通过KeSetBasePriorityThread()函数重新设定+0x06d DecrementCount   : UChar+0x06e PriorityDecrement : Char+0x06f Quantum          : Char+0x070 WaitBlock        : [4] _KWAIT_BLOCK  // 等待哪个对象(WaitForSingleObject)+0x0d0 LegoData         : Ptr32 Void+0x0d4 KernelApcDisable : Uint4B+0x0d8 UserAffinity     : Uint4B+0x0dc SystemAffinityActive : UChar+0x0dd PowerState       : UChar+0x0de NpxIrql          : UChar+0x0df InitialNode      : UChar+0x0e0 ServiceTable     : Ptr32 Void      //系统服务表+0x0e4 Queue            : Ptr32 _KQUEUE+0x0e8 ApcQueueLock     : Uint4B            // APC相关+0x0f0 Timer            : _KTIMER+0x118 QueueListEntry   : _LIST_ENTRY+0x120 SoftAffinity     : Uint4B+0x124 Affinity         : Uint4B+0x128 Preempted        : UChar+0x129 ProcessReadyQueue : UChar+0x12a KernelStackResident : UChar+0x12b NextProcessor    : UChar+0x12c CallbackStack    : Ptr32 Void+0x130 Win32Thread      : Ptr32 Void+0x134 TrapFrame        : Ptr32 _KTRAP_FRAME       // 进0环时保存环境+0x138 ApcStatePointer  : [2] Ptr32 _KAPC_STATE     // APC 相关+0x140 PreviousMode     : Char    //先前模式,记录先前是0环,还是3环+0x141 EnableStackSwap  : UChar+0x142 LargeStack       : UChar+0x143 ResourceIndex    : UChar+0x144 KernelTime       : Uint4B+0x148 UserTime         : Uint4B+0x14c SavedApcState    : _KAPC_STATE           // APC 相关+0x164 Alertable        : UChar+0x165 ApcStateIndex    : UChar+0x166 ApcQueueable     : UChar+0x167 AutoAlignment    : UChar+0x168 StackBase        : Ptr32 Void+0x16c SuspendApc       : _KAPC+0x19c SuspendSemaphore : _KSEMAPHORE+0x1b0 ThreadListEntry  : _LIST_ENTRY  // 双向链表, 记录进程中的所有模块+0x1b8 FreezeCount      : Char+0x1b9 SuspendCount     : Char+0x1ba IdealProcessor   : UChar+0x1bb DisableBoost     : UChar*/+0x1c0 CreateTime       : _LARGE_INTEGER+0x1c0 NestedFaultCount : Pos 0, 2 Bits+0x1c0 ApcNeeded        : Pos 2, 1 Bit+0x1c8 ExitTime         : _LARGE_INTEGER+0x1c8 LpcReplyChain    : _LIST_ENTRY+0x1c8 KeyedWaitChain   : _LIST_ENTRY+0x1d0 ExitStatus       : Int4B+0x1d0 OfsChain         : Ptr32 Void+0x1d4 PostBlockList    : _LIST_ENTRY+0x1dc TerminationPort  : Ptr32 _TERMINATION_PORT+0x1dc ReaperLink       : Ptr32 _ETHREAD+0x1dc KeyedWaitValue   : Ptr32 Void+0x1e0 ActiveTimerListLock : Uint4B+0x1e4 ActiveTimerListHead : _LIST_ENTRY+0x1ec Cid              : _CLIENT_ID       /*kd> dt _CLIENT_IDnt!_CLIENT_ID+0x000 UniqueProcess    : Ptr32 Void        // PID+0x004 UniqueThread     : Ptr32 Void     // ThreadID*/+0x1f4 LpcReplySemaphore : _KSEMAPHORE+0x1f4 KeyedWaitSemaphore : _KSEMAPHORE+0x208 LpcReplyMessage  : Ptr32 Void+0x208 LpcWaitingOnPort : Ptr32 Void+0x20c ImpersonationInfo : Ptr32 _PS_IMPERSONATION_INFORMATION+0x210 IrpList          : _LIST_ENTRY+0x218 TopLevelIrp      : Uint4B+0x21c DeviceToVerify   : Ptr32 _DEVICE_OBJECT+0x220 ThreadsProcess   : Ptr32 _EPROCESS   // 指向父进程的 _EPROCESS 结构体+0x224 StartAddress     : Ptr32 Void+0x228 Win32StartAddress : Ptr32 Void+0x228 LpcReceivedMessageId : Uint4B+0x22c ThreadListEntry  : _LIST_ENTRY   // 双向链表, 记录进程中的所有模块+0x234 RundownProtect   : _EX_RUNDOWN_REF+0x238 ThreadLock       : _EX_PUSH_LOCK+0x23c LpcReplyMessageId : Uint4B+0x240 ReadClusterSize  : Uint4B+0x244 GrantedAccess    : Uint4B+0x248 CrossThreadFlags : Uint4B+0x248 Terminated       : Pos 0, 1 Bit+0x248 DeadThread       : Pos 1, 1 Bit+0x248 HideFromDebugger : Pos 2, 1 Bit+0x248 ActiveImpersonationInfo : Pos 3, 1 Bit+0x248 SystemThread     : Pos 4, 1 Bit+0x248 HardErrorsAreDisabled : Pos 5, 1 Bit+0x248 BreakOnTermination : Pos 6, 1 Bit+0x248 SkipCreationMsg  : Pos 7, 1 Bit+0x248 SkipTerminationMsg : Pos 8, 1 Bit+0x24c SameThreadPassiveFlags : Uint4B+0x24c ActiveExWorker   : Pos 0, 1 Bit+0x24c ExWorkerCanWaitUser : Pos 1, 1 Bit+0x24c MemoryMaker      : Pos 2, 1 Bit+0x250 SameThreadApcFlags : Uint4B+0x250 LpcReceivedMsgIdValid : Pos 0, 1 Bit+0x250 LpcExitThreadCalled : Pos 1, 1 Bit+0x250 AddressSpaceOwner : Pos 2, 1 Bit+0x254 ForwardClusterOnly : UChar+0x255 DisablePageFaultClustering : UChar

Code

NTSTATUS _NtThreadHide(ULONG uPid)
{PEPROCESS pEPROCESS;LPSTR lpImageFileName;__asm{mov eax, fs: [0x124] mov eax, [eax + 0x220]mov pEPROCESS, eax}PLIST_ENTRY pHeader = (PCHAR)pEPROCESS + 0x88;PLIST_ENTRY pCur = pHeader;do{if (*(PLONG)((ULONG)pCur - 4) == uPid){PLIST_ENTRY pEThreadHeader1, pEThreadHeader2, pEThreadCur, pEThreadNext;ULONG uSizeOfLIST_ENTRY = sizeof(LIST_ENTRY);lpImageFileName = (PCHAR)pCur + 0xec;DbgPrint("该进程名称: %s\n", lpImageFileName);pEThreadHeader1 = (PCHAR)pCur - 0x88 + 0x50; // 模块链表头pEThreadHeader2 = (PCHAR)pCur - 0x88 + 0x190;  // 模块链表头pEThreadCur = pEThreadHeader1;do {pEThreadNext = pEThreadCur->Blink;pEThreadCur->Flink = pEThreadCur;pEThreadCur->Blink = pEThreadCur;pEThreadCur = pEThreadNext;} while (pEThreadHeader1 == pEThreadCur);pEThreadCur = pEThreadHeader2;do{pEThreadNext = pEThreadCur->Blink;pEThreadCur->Flink = pEThreadCur; // 指向自己, 不能直接置为0, 否则会触发蓝屏pEThreadCur->Blink = pEThreadCur;pEThreadCur = pEThreadNext;} while (pEThreadHeader1 == pEThreadCur);DbgPrint("线程隐藏成功!\n");return STATUS_SUCCESS;}pCur = pCur->Blink;} while (pCur != pHeader);return STATUS_ABANDONED;
}

测试进程的 PID 为 980,有一个线程。

当执行 _EtHReAD 断链后,线程数变为了0,说明成功实现了对线程的隐藏。

_ETHREAD断链 —— 实现线程隐藏相关推荐

  1. (53)进程结构体EPROCESS,擦除 DebugPort 实现反调试,ActiveProcessLinks 断链实现进程隐藏

    一.进程的作用 进程最重要的作用是提供了CR3,10-10-12分页下CR3指向页目录表,2-9-9-12分页下CR3指向页目录指针表. 每个进程有一个或多个线程.本质上,没有进程切换,只有线程切换. ...

  2. c语言断链隐藏dll,利用C++ R3层断链实现模块隐藏功能

    一.模块隐藏的实现原理 普通API查找模块实现思路:其通过查询在R3中的PEB(Process Environment Block 进程环境块)与TEB(Thread Environment Bloc ...

  3. (54)线程结构体 ETHREAD,线程断链

    一.回顾 上次课我们学习了进程,我们知道了进程是空间概念,最主要的功能是提供CR3,而线程才是CPU调度的最小单位: 更早的时候做SSDT HOOK FindWindow 时我们还了解到了,当3环程序 ...

  4. 驱动编程:注册表回调,进程回调,文件回调,进程隐藏断链,窗口保护

    #include "struct.h"#define debug_pott_offset 0x298 //#define debug_pott_offset 0x1f0DWORD ...

  5. 4.PEB断链隐藏模块

    0x4 PEB断链隐藏模块 1.如何找到_PEB_LDR_DATA 由_TEB找到_PEB,_PEB偏移0xC找到_PEB_LDR_DATA 2.基础知识 _LDR_DATA_TABLE_ENTRY结 ...

  6. 二、C++反作弊对抗实战 (进阶篇 —— 2.作弊器中常见断链隐藏DLL方法)

    目前,比较常见的模块隐藏方法有抹去模块的PE头.断开进程的LDR_MODULE链或者Hook模块枚举函数等,这里介绍前面抹去PE头.断链的方法. 提示:以下是本篇文章正文内容,下面案例可供参考 一.设 ...

  7. 驱动开发:断链隐藏驱动程序自身

    与断链隐藏进程功能类似,关于断链进程隐藏可参考<驱动开发:DKOM 实现进程隐藏>这一篇文章,断链隐藏驱动自身则用于隐藏自身SYS驱动文件,当驱动加载后那么使用ARK工具扫描将看不到自身驱 ...

  8. 内核驱动隐藏自身【断链】

    内核驱动加载断链式隐藏自身 //创建一个驱动对象数据结构 typedef struct _KLDR_DATA_TABLE_ENTRY {LIST_ENTRY64 InLoadOrderLinks;// ...

  9. Win10内核驱动断链式隐藏指定进程

    //直接上功能代码: //定义函数,通过进程PID操作隐藏 NTSTATUS HideProcess(ULONG pid) {//定义存放EPROCESS地址变量 ULONG64 L_pEPROCES ...

最新文章

  1. php返回结果判断,老司机在判断返回结果时翻了个身(ThinkPHP)
  2. 计算机电容的作用,电容和电感的作用
  3. iredmail安装roundcube webmail插件
  4. php强制cookies,php Cookies操作类(附源码)
  5. P50发布!网友:滚筒洗衣机也能打电话了
  6. 柱形图无数据可选中_Excel---多层柱形图来了!让领导看呆
  7. abb机器人指令手册_「ABB」ABB机器人指令模块介绍与开发过程
  8. kmeans算法和kmeans++
  9. ++x 和 x++的区别
  10. 可访问性之于类和对象
  11. springboot异常处理机制之统一异常处理和自定义异常类
  12. eviews建立时间序列模型_Eviews软件做时间序列分析?
  13. Centos7配置AirPrint(解决手机执行多次打印后搜索不到打印机的情况)
  14. 项目管理ITTO(一张图梳理49个过程)
  15. 如何正确、高效地进行论文阅读和批判性思考
  16. Go语言之return语句的几种用法
  17. 如何在线批量将Word转换为PDF格式
  18. uniapp小程序展示3D模型
  19. go开发gui还是python开发gui_golang为什么没有官方的gui包?
  20. excel怎样把一列中有相同的数据编同一个序号,不同商品的序号要递增

热门文章

  1. 谷歌网盘国内下载API
  2. python优点是代码库支持、灵活_Google将限制Python语言的应用 开发社区热议
  3. 利用注册表清除Office Word文档杀手病毒
  4. aecmap快捷键_ArcGIS编辑操作的常用快捷键
  5. Android短信备份案例
  6. 智能测试实践之路-UI 缺陷检测
  7. 抖音很火的召唤神龙的小游戏完整代码-召唤神龙
  8. 推荐歌曲 一百首最经典的歌曲下载
  9. 一个基于OpenDDS的股票报价Stock Quote和交易exchange 的完整用例介绍
  10. visual paradigm 绘图学习记录