基于PEB断链的进程-模块隐藏

发布于:2024-10-24 编辑:匿名 来源:网络

断链是一项非常古老的技术,在很多场景中都有使用。在内核层,如果我们需要隐藏某个进程的内核结构,也会用到这种技术。

本文分别在用户层和内核层实现PEB断链。在用户层实现的效果主要是dll模块的隐藏,在内核层实现的效果主要是进程的隐藏。

3环PEB断链 每个线程都有一个TEB结构来存储线程的一些属性结构。 TEB的地址通过fs:[0]获得。

在地址0x30处,有一个指针指向PEB结构image-9.png,然后定位到PEB。 PEB是进程用来记录自身信息的结构体。

PEB 的 0x00c 偏移处有一个 Ldr _PEB_LDR_DATA 结构。按照 image-9.png 进行操作。

_PEB_LDR_DATA中有3个双向链表。 InLoadOrderModuleList:模块加载的顺序。

InMemoryOrderModuleList:模块。内存中的顺序 InInitializationOrderModuleList:模块初始化的顺序 image-0.png 以 InLoadOrderModuleList 为例,双向链表的含义是最后一个指针会指向自己 image-7.png 那么了解了基本原理后,我们可以通过断开链接来实现模块的隐藏,我们知道如果我们要枚举模块,一般都是使用CreateToolhelp32Snapshot来进行快照,找到之后再遍历模块列表。

事实上,API也是通过查找_PEB_LDR_DATA结构来获取程序有哪些模块。那么如果我们想要隐藏某个dll就可以通过修改这两个双向链表来隐藏。

_DRIVER_OBJECT结构中的0x偏移处有一个成员DriverSection,它可以遍历内核模块。DriverSection是一个指针,它实际上对应了一个结构体: _LDR_DATA_TABLE_ENTRYimage-2.png 在_LDR_DATA_TABLE_ENTRY的0x偏移处有一个DllBase,里面存放的是dll image-0.png的地址,所以如果我们想在这里隐藏它的话对于指定的dll,可以通过DllBase通过GetModuleHandleA获取该dll的句柄进行比较。

然后我们首先定义_PEB_LDR_DATA和_LDR_DATA_TABLE_ENTRY结构。代码语言:c++ copy // LDR链表头 typedef struct _PEB_LDR_DATA{DWORD Length;bool Initialized;PVOID SsHandle;LIST_ENTRY InLoadOrderModuleList; // 指向 InLoadOrderModuleList 列表的第一项 LIST_ENTRY InMemoryOrderModuleList;LIST_ENTRY InInitializationOrderModuleList;} PEB_LDR_DATA,*PPEB_LDR_DATA;typedef struct _LDR_DATA_TABLE_ENTRY{LIST_ ENTRY InLoadOrderModuleList;LIST_ENTRY InMemoryOrderModuleList;LIST_ENTRY InInitializationOr derModuleList;void* 基址;无效*入口点; ULONG SizeOfImage;UNICODE_STRINGFullDllName;UNICODE_STRING BaseDllName;ULONG Flags;SHORT LoadCount;SHORT TlsIndex;HANDLE SectionHandle;ULONG CheckSum;ULONG TimeDateStamp;} LDR_DATA_TABLE_ENTRY, *PLDR_DATA_TABLE_ENTRY;然后通过汇编定位到LDR代码语言: c++ copy__asm{mov eax,fs:[0x30] // PEB mov ecx,[eax + 0x0c] // LDRmov ldr,因为这里的三个双向链表的结构是相同的,所以这里使用InLoadOrderModuleList来演示断链。

这里要实现断链,最简单的办法就是让Head的Flink和Blink指向自己。首先,获取获取到的ldr结构体指向InLoadOrderModuleList。

代码语言:c++ copy Head = &(ldr->InLoadOrderModuleList);然后通过CONTAINING_RECORD宏返回结构体的基地址。代码语言:c++ copy Cur = Head->Flink;ldte = CONTAINING_RECORD( Cur, LDR_DATA_TABLE_ENTRY , InInitializationOrderModuleList); image-4.png 代码语言:c++ copy void CONTAINING_RECORD(address, type, field);执行断链操作 代码语言:txt copy ldte->InInitializationOrderModuleList.Blink->Flink = ldte->InInitializationOrderModuleList.Flink;代码语言:txt复制ldte->InInitializationOrderModuleList.Flink->Blink = ldte->InInitializationOrderModuleList.Blink;然后将指针指向下一个结构体代码语言:c++ copy Cur = Cur->Flink;因为它需要遍历链表来断开链接并指向自己进行操作,所以需要编写一个循环来断开链接。

完整代码如下。代码语言:c++ copy //killPEB.cpp :D定义控制台应用程序的入口点。

//#include "stdafx.h"#include typedef struct _UNICODE_STRING {USHORT Length;USHORT MaximumLength;PWSTR Buffer;} UNICODE_STRING, *PUNICODE_STRING;typedef struct _PEB_LDR_DATA{DWORD 长度;bool Initialized;PVOID SsHandle;LIST_ENTRY InLoadOrderModuleList;LIST_ENTRY InMemoryOrderModuleList;LIST_ENTRY InInitializationOrderModuleList;} PEB_LDR_DATA,*PPEB_LDR_DATA;// LDR表项,存储了模块信息typedef struct _LDR_DATA_TABLE_ENTRY{LIST_ENTRY InLoadOrderModuleList;LIST_ENT RY InMemoryOrderModuleList;LIST_ENTRY InInitializationOrderModuleList;void* BaseAddress;void * 入口点; ULONG SizeOfImage;UNICODE_STRINGFullDllName;UNICODE_STRING BaseDllName;ULONG Flags;SHORT LoadCount;SHORT TlsIndex;HANDLE SectionHandle;ULONG CheckSum;ULONG TimeDateStamp;} LDR_DATA_TABLE_ENTRY, *PLDR_DATA_TABLE_ENTRY;void HideModule(HMODULE hModule){PPEB_LDR_DATA ldr; PLDR_DATA_TABLE_ENTRY ldte;__asm{mov eax,fs:[0x30] mov ecx,[eax + 0x0c] mov ldr,ecx }PLIST_ENTRY 头,Cur; Head = &(ldr->InLoadOrderModuleList);Cur = Head->Flink; do{ldte = CONTAINING_RECORD( Cur, LDR_DATA_TABLE_ENTRY, InLoadOrderModuleList);if (ldte->BaseAddress == hModule){ldte->InLoadOrderModuleList.Blink->Flink = ldte->InLoadOrderModuleList.Flink; ldte->InLoadOrderModuleList.Flink->Blink = ldte->InLoadOrderModuleList.Blink; }Cur = Cur->Flink;} while(Head != Cur); Head = &(ldr->InMemoryOrderModuleList);Cur = Head->Flink; do { ldte = CONTAINING_RECORD( Cur, LDR_DATA_TABLE_ENTRY, InMemoryOrderModuleList); if (ldte->BaseAddress == hModule){ldte->InMemoryOrderModuleList.Blink->Flink = ldte->InMemoryOrderModuleList.Flink; ldte->InMemoryOrderModuleList.Flink->闪烁 =ldte->InMemoryOrderModuleList.Blink; }Cur = Cur->Flink;} while(Head != Cur); Head = &(ldr->InInitializationOrderModuleList);Cur = Head->Flink; do { ldte = CONTAINING_RECORD( Cur, LDR_DATA_TABLE_ENTRY , InInitializationOrderModuleList); if (ldte->BaseAddress == hModule){ldte->InInitializationOrderModuleList.Blink->Flink = ldte->InInitializationOrderModuleList.Flink; ldte->InInitializationOrderModuleList.Flink->Blink = ldte->InInitializationOrderModuleList.Blink; } Cur = Cur->Flink;} while(Head != Cur);}int main(int argc, CHAR* argv[]){printf("点击任意键开始断开链接");getchar();HideModule (GetModuleHandleA( "kernel32.dll"));printf("链接断开成功\n");getchar();return 0;}在这里你可以看到 image-8.png 练习由 3 个模块组成,之前链接已损坏。之后可以发现kernel32.dll已经被隐藏了 image-7.png 如果想隐藏所有模块,直接删除模块判断代码即可。

代码语言:c++ copy void HideModule_All(){PPEB_LDR_DATA ldr; PLDR_DATA_TABLE_ENTRY ldte;//获取LDR__asm{mov eax,fs:[0x30] mov ecx,[eax + 0x0c]mov ldr,ecx }PLIST_ENTRY 头; Head = &(ldr->InLoadOrderModuleList);Head->Flink = Head->Blink = Head;Head = &(ldr->InMemoryOrderModuleList);Head->Flink = Head->Blink = Head;Head = &(ldr- >InInitializationOrderModuleList);Head->Flink = Head->Blink = Head;}??效果如下 image-5.png 练习后,所有模块不再可见 image-8.png0 Ring PEB Break 在操作系统层面,一个过程本质上是一个结构。当操作系统要创建一个进程时,它会分配一块内存,填充一个结构体,并为结构体中的每一项填充一些特定的值。

该结构 EPROCESSimage-6.png 在 x 偏移处有一个指针 ActiveProcessLinks,指向 _LIST_ENTRY。它是一个双向链表,所有活动进程连接在一起形成一个链表image-0.png。

那么链表总是有一个头,全局变量PsActiveProcessHead(8个字节)指向全局链表头。这个链表与进程隐藏有关。

只要我们打断我们想要隐藏的进程对应的EPROCESS链接,就可以达到隐藏ring 0进程的目的。我们看一下PsActiveProcessHead代码语言:c++ copy kd> dd PsActiveProcessHeadimage-4.png 。

前四个字节指向下一个EPROCESS结构,但它不是指向EPROCESS的首地址,而是指向每个进程的_EPROCESS + 0x88。 image-7.png的位置,所以当我们要查询下一个进程结构时,我们需要-0x88。

例如,PsActiveProcessHead 当前指向的下一个地址是 0xb58b8 代码语言: c++ copy kd> dt _EPROCESS b58b8-0x88 将进程名称存储在 0x 偏移处。我们可以看到第一个EPROCESS结构体对应的是System进程,这里 0x88 的偏移量存储的是下一个EPROCESS结构体的地址,但是这里要注意,因为这个结构体的地址指向下一个链表的地址,所以如果你想要获取EPROCESS的第一个结构体,需要-0x88image-3.png,我们通过偏移量得到下一个EPROCESS结构体,可以发现其实现为smss.exe进程image-2.png。

所以我们的想法在这里很明确。通过EPROCESS找到我们想要隐藏的进程的ActiveProcessLinks,修改双向链表的值,我们就可以将这个进程的ActiveProcessLinks从双向链表中删除掉,达到隐藏的效果,这样比较方便直接使用windbg中的ed进行修改,但是如果想使用代码修改的话,需要先在ETHREAD中定位EPROCESS的0x偏移量,通过ThreadsProcess获取,它指向_EPROCESS结构体image-7.png。

然后就可以用汇编实现来查找EPROCESS结构体代码语言: c++ copy __asm{mov eax, fs: [0x] ;mov eax, [ eax + 0x];mov pEprocess, eax;} ??首先定义一个指向EPROCESS的指针构造并初始化指向ActiveProcessLinks的指针 代码语言:c++ copy pCurProcess = pEprocess; curNode = (PLIST_ENTRY)((ULONG)pCurProcess + 0x88);然后判断使用EPROCESS中0x处的ImageFileName判断该进程名是否是我们要隐藏的进程 image-6.png 代码语言:c++ copy ImageFileName = (PCHAR)pCurProcess + 0x;if (strcmp(ImageFileName, "notepad .exe") == 0) 如果是我们要隐藏的进程,执行链接破坏操作代码语言:c++ copy curNode = (PLIST_ENTRY)((ULONG)pCurProcess + 0x88);nextNode = curNode->Flink;preNode = curNode->Blink;preNode->Flink = curNode->Flink;nextNode->Blink = curNode->Blink;如果不是我们想要的进程,继续往下走,获取ActiveProcessLinks的值。代码语言:c++ copy pCurProcess = (PEPROCESS)(*(PULONG)((ULONG)pCurProcess + 0x88) - 0x88);完整代码如下。

基于PEB断链的进程-模块隐藏

站长声明

版权声明:本文内容由互联网用户自发贡献,本站不拥有所有权,不承担相关法律责任。如果发现本站有涉嫌抄袭的内容,欢迎发送邮件 举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。

标签:

相关文章

  • 生物科技公司珠海贝斯昂科获近亿元天使轮融资

    生物科技公司珠海贝斯昂科获近亿元天使轮融资

    投资圈(ID:pedaily)据7月26日消息,生物科技公司珠海贝斯昂科(以下简称:贝斯生物)近日完成天使轮融资近亿元。 本轮融资,本轮主要投资方为弘晖资本、弘励 Ventures 和 Panacea Ventures。 横琴金投也参与了本轮投资。 本轮融资将主要用于贝斯生物独有的基因编辑NK平台和

    06-18

  • ONES半年融资近亿美元,打破国内研发管理领域历史记录

    ONES半年融资近亿美元,打破国内研发管理领域历史记录

    投资社区(ID:pedaily)9月22日,ONES宣布完成1万美元C轮融资。 这距离今年6月底ONES宣布连续完成3亿元B1、B2轮融资仅2个多月。 据悉,本轮融资领投方为新加坡政府投资公司GIC,老股东源码资本、XVC已连续三轮融资。 从投资者的角度来看,企业级研发管理工具ONES在半年内已连

    06-17

  • 力金科技获工机基金、中金资本、基石资本7.3亿战略投资

    力金科技获工机基金、中金资本、基石资本7.3亿战略投资

    投资界消息(ID:pedaily),力金科技(8)12月5日宣布引入战略投资者,工机基金、中金资本、基石资本、东方汇嘉等多家机构认购旗下深圳利金科技合计7.3亿元股权。 此次增资,距国投上次增资11.5亿仅两个多月。 先后获得多家战略投资者注资,带来一定估值溢价。 可见,一体化

    06-17

  • 马鞍山注册百亿新基金

    马鞍山注册百亿新基金

    据投资界(ID:pedaily)获悉,马鞍山高质量发展产业基金有限公司于2020年3月29日完成中国基金会计协会注册基金总规模1亿元,首期20亿元,由市财政出资。 该基金面向马鞍山市“1+N”产业,聚焦企业全生命周期,重点支持设立天使投资、科技创新、产业投资基金群,形成高质量发

    06-17

  • 美国:2022年光伏装机将超越风能

    美国:2022年光伏装机将超越风能

    据美国能源信息署(EIA)预测,到2022年,美国大规模太阳能装机将首次超过风电。 随着各国政府减少对陆上风电的支持,电网规模的光伏装机预计将超过风电16GW,而风电则为6GW。 美国能源信息署预计,2019年风电新增装机总量将达到18GW,略高于光伏的16GW。 随着光伏装机加速,

    06-08

  • 共享健身仓“公园盒子”获数千万元A+轮融资,华住酒店领投

    共享健身仓“公园盒子”获数千万元A+轮融资,华住酒店领投

    据投资界4月17日消息,共享健身仓“公园盒子”宣布,获得华住酒店集团领投的数千万投资。 人民币A+融资。   这是Park Box成立一年以来获得的第四笔投资。 此前于2018年3月获得个人天使轮融资; 2018年7月获得熊猫资本数百万元Pre-A轮融资;并于2020年11月获得海鲸资本数千

    06-18

  • 5G研究院、5G产业基金落地北京亦庄

    5G研究院、5G产业基金落地北京亦庄

    继北京50%的5G基站部署在北京经济技术开发区后,记者今日从开发区获悉,北京50亿5G产业基金和5G研究院正式落户北京亦庄。 据介绍,北京5G产业基金是北京市政府参与设立的首支5G产业专项基金,规模50亿元。 拟由开发区国有投融资平台亦庄国投、北京科技创新投资管理有限公司和

    06-06

  • 百康生物完成近亿元A轮融资,方盛基金领投

    百康生物完成近亿元A轮融资,方盛基金领投

    投资界(ID:pedaily)1月12日消息,体外诊断(IVD)及上游核心原材料开发商南京百康生物科技必康生物医药材料股份有限公司(以下简称“必康生物”)宣布完成近亿元A轮融资。 本轮融资是百康生物科技首笔市场化融资。 由方盛基金领投,新产业投资、国谦创投、邦盛资本跟投,青

    06-17

  • 商务部:与部分CPTPP成员国进行了非正式接触

    商务部:与部分CPTPP成员国进行了非正式接触

    商务部:与部分CPTPP成员国进行了非正式接触。

    06-18

  • 酷家乐全面收购Modelo,正式进军房地产和建筑领域

    酷家乐全面收购Modelo,正式进军房地产和建筑领域

    据投资界消息,酷家乐近日宣布完成全资收购“建筑地产设计资产管理及三维数据可视化平台”王牌” 。 收购后,Modelo品牌保持独立,在酷家乐技术、资本和业务的全力支持下,为建筑和房地产领域的企业客户提供一体化设计和营销解决方案。 随着精装修房的流行,家居企业的渠道发

    06-17

  • 手游新媒体小品:直投版与“三屏合一”

    手游新媒体小品:直投版与“三屏合一”

    在今年年初举办的中国手游产业峰会上,GMGC全球手游联盟秘书长宋炜发表了题为的主题演讲,据他预计,今年手游市场整体规模将突破1亿元。 而到年底我们看这个数字,已经突破了1亿,明年甚至会达到1亿。 如此繁荣的手游市场,自然会催生出大量参差不齐的手游媒体。 除了彼此之间

    06-18

  • 减少浪费的制造方法和技术

    减少浪费的制造方法和技术

    随着环境问题日益严峻,消费者对环保产品的需求不断上升,各行业再也不能忽视可持续发展的重要性。 当我们回顾历史时,我们会发现制造业的发展往往伴随着大量的资源浪费。 自工业革命以来,企业更加关注生产效率和产品数量,而不是资源的有效利用。 那个时候,资源似乎取之不

    06-17