0x4 PEB断链隐藏模块

1.如何找到_PEB_LDR_DATA

由_TEB找到_PEB,_PEB偏移0xC找到_PEB_LDR_DATA

2.基础知识

_LDR_DATA_TABLE_ENTRY结构

ntdll!_LDR_DATA_TABLE_ENTRY+0x000 InLoadOrderLinks : _LIST_ENTRY//_PEB_LDR_DATA的第一个_LIST_ENTRY结构指向这里+0x008 InMemoryOrderLinks : _LIST_ENTRY//_PEB_LDR_DATA的第二个_LIST_ENTRY结构指向这里+0x010 InInitializationOrderLinks : _LIST_ENTRY//_PEB_LDR_DATA的第三个_LIST_ENTRY结构指向这里+0x018 DllBase          : Ptr32 Void//DLL基址+0x01c EntryPoint       : Ptr32 Void+0x020 SizeOfImage      : Uint4B+0x024 FullDllName      : _UNICODE_STRING//带路径的dll的名称+0x02c BaseDllName      : _UNICODE_STRING//dll的名称+0x034 Flags            : Uint4B+0x038 LoadCount        : Uint2B+0x03a TlsIndex         : Uint2B+0x03c HashLinks        : _LIST_ENTRY+0x03c SectionPointer   : Ptr32 Void+0x040 CheckSum         : Uint4B+0x044 TimeDateStamp    : Uint4B+0x044 LoadedImports    : Ptr32 Void+0x048 EntryPointActivationContext : Ptr32 _ACTIVATION_CONTEXT+0x04c PatchInformation : Ptr32 Void+0x050 ForwarderLinks   : _LIST_ENTRY+0x058 ServiceTagLinks  : _LIST_ENTRY+0x060 StaticLinks      : _LIST_ENTRY+0x068 ContextInformation : Ptr32 Void+0x06c OriginalBase     : Uint4B+0x070 LoadTime         : _LARGE_INTEGER

_PEB_LDR_DATA结构

typedef struct _PEB_LDR_DATA
{ULONG Length; // +0x00BOOLEAN Initialized; // +0x04PVOID SsHandle; // +0x08LIST_ENTRY InLoadOrderModuleList; // +0x0c  加载顺序LIST_ENTRY InMemoryOrderModuleList; // +0x14 在内存中的顺序LIST_ENTRY InInitializationOrderModuleList;// +0x1c 初始化装载顺序PVOID EntryInProgress; // +0x24
} PEB_LDR_DATA,*PPEB_LDR_DATA;

_LIST_ENTRY结构

typedef struct _LIST_ENTRY {struct _LIST_ENTRY *Flink;struct _LIST_ENTRY *Blink;
} LIST_ENTRY, *PLIST_ENTRY, *RESTRICTED_POINTER PRLIST_ENTRY;

3.实现原理

_PEB_LDR_DATA后三个成员存储的是该程序所有模块的信息(用链表存储)
因此只要将这些信息抹除,就可以欺骗那些调用API扫描模块的程序了。
由于存储信息的是个链表,所以只要修改一下指针即可,并不复杂。

4.调试找模块



_PEB_LDR_DATA的第一个_LDR_DATA_TABLE_ENTRY是该程序的exe,windbg里显示不出来(3环程序!)

5.实现代码(不是驱动!在ring3执行就好)

隐藏所有模块

#include "stdafx.h"
#include "windows.h"typedef struct _PEB_LDR_DATA
{ULONG Length; // +0x00BOOLEAN Initialized; // +0x04PVOID SsHandle; // +0x08LIST_ENTRY InLoadOrderModuleList; // +0x0cLIST_ENTRY InMemoryOrderModuleList; // +0x14LIST_ENTRY InInitializationOrderModuleList;// +0x1cPVOID EntryInProgress;           // +0x24
} PEB_LDR_DATA,*PPEB_LDR_DATA; void HideModule()
{PPEB_LDR_DATA ldr; PLIST_ENTRY Head;__asm{mov eax,fs:[0x30]   //只有在ring3_TEB的值为fs[0],偏移0x30到_PEBmov ecx,[eax+0xC] //_PEB偏移0xC到PEB_LDRmov ldr,ecx}// 分别将三个链表断链处理Head = &(ldr->InLoadOrderModuleList);Head->Flink = Head->Blink = Head; //处理成空的双向循环链表Head = &(ldr->InMemoryOrderModuleList);Head->Flink = Head->Blink = Head;   //处理成空的双向循环链表Head = &(ldr->InInitializationOrderModuleList);Head->Flink = Head->Blink = Head;   //处理成空的双向循环链表
}
int main()
{printf("未断链\n");getchar();HideModule();printf("断链后\n");getchar();return 0;
}

效果如下:

隐藏某个模块

#include "stdafx.h"
#include "windows.h"typedef struct _UNICODE_STRING {USHORT Length;USHORT MaximumLength;PWSTR  Buffer;
}UNICODE_STRING, *PUNICODE_STRING;typedef struct _PEB_LDR_DATA
{ULONG Length; // +0x00BOOLEAN Initialized; // +0x04PVOID SsHandle; // +0x08LIST_ENTRY InLoadOrderModuleList; // +0x0cLIST_ENTRY InMemoryOrderModuleList; // +0x14LIST_ENTRY InInitializationOrderModuleList;// +0x1cPVOID EntryInProgress;           // +0x24
} PEB_LDR_DATA,*PPEB_LDR_DATA; typedef struct _LDR_DATA_TABLE_ENTRY
{LIST_ENTRY InLoadOrderLinks;LIST_ENTRY InMemoryOrderLinks;LIST_ENTRY InInitializationOrderLinks;PVOID DllBase;PVOID EntryPoint;ULONG SizeOfImage;UNICODE_STRING FullDllName;UNICODE_STRING BaseDllName;        //后面不写了,用不到
} LDR_DATA_TABLE_ENTRY, *PLDR_DATA_TABLE_ENTRY;int STRCMP(unsigned short *str1,unsigned short *str2)    //自己实现一个UNICODE字符串比较
{int flag = 0;while (*str1){if (*str1 != *str2){flag = 1;break;}str1++;str2++;}return flag;
}void HideModule(UNICODE_STRING DllName)
{PPEB_LDR_DATA ldr; PLDR_DATA_TABLE_ENTRY Node;PLIST_ENTRY Head,Temp;__asm{mov eax,fs:[0x30]   //只有在ring3_TEB的值为fs[0],偏移0x30到_PEBmov ecx,[eax+0xC] //_PEB偏移0xC到PEB_LDRmov ldr,ecx}// 分别将三个链表断链处理//1Head = &(ldr->InLoadOrderModuleList);   //第一项是自己的exe,windbg显示不出来Temp = Head->Flink;printf("以下为所有模块名:\n");do{//CONTAINING_RECORD宏的作用就是根据结构体类型和结构体中成员变量地址和名称,则可求出该变量所在结构体的指针Node = (PLDR_DATA_TABLE_ENTRY)Temp;  //InLoadOrderLinks就是结构体第一个成员,不必CONTAINING_RECORDprintf("%ls\n",Node->BaseDllName.Buffer);   //打印所有模块名if (!STRCMP(Node->BaseDllName.Buffer,DllName.Buffer)){      Node->InLoadOrderLinks.Blink->Flink = Node->InLoadOrderLinks.Flink;  Node->InLoadOrderLinks.Flink->Blink = Node->InLoadOrderLinks.Blink;         }Temp = Temp->Flink;} while(Head != Temp);//2Head = &(ldr->InMemoryOrderModuleList);  Temp = Head->Flink;do{//CONTAINING_RECORD宏的作用就是根据结构体类型和结构体中成员变量地址和名称,则可求出该变量所在结构体的指针Node = CONTAINING_RECORD(Temp, LDR_DATA_TABLE_ENTRY, InMemoryOrderLinks);if (!STRCMP(Node->BaseDllName.Buffer,DllName.Buffer)){      Node->InMemoryOrderLinks.Blink->Flink = Node->InMemoryOrderLinks.Flink;  Node->InMemoryOrderLinks.Flink->Blink = Node->InMemoryOrderLinks.Blink;         }Temp = Temp->Flink;} while(Head != Temp);//3Head = &(ldr->InInitializationOrderModuleList);  Temp = Head->Flink;do{//CONTAINING_RECORD宏的作用就是根据结构体类型和结构体中成员变量地址和名称,则可求出该变量所在结构体的指针Node = CONTAINING_RECORD(Temp, LDR_DATA_TABLE_ENTRY, InInitializationOrderLinks);if (!STRCMP(Node->BaseDllName.Buffer,DllName.Buffer)){      Node->InInitializationOrderLinks.Blink->Flink = Node->InInitializationOrderLinks.Flink;  Node->InInitializationOrderLinks.Flink->Blink = Node->InInitializationOrderLinks.Blink;         }Temp = Temp->Flink;} while(Head != Temp);
}
int main()
{printf("未断链\n");getchar();WCHAR MoudleName[] = L"ntdll.dll";      //要隐藏的dll名称UNICODE_STRING YourMoudle;YourMoudle.MaximumLength = strlen((char*)MoudleName) + 1;YourMoudle.Length = strlen((char*)MoudleName);YourMoudle.Buffer = MoudleName;HideModule(YourMoudle);printf("断链后\n");printf("隐藏的模块名为:%ls",YourMoudle.Buffer);getchar();return 0;
}

效果如图:

4.PEB断链隐藏模块相关推荐

  1. c语言断链隐藏dll,通过断链隐藏模块(DLL)

    主要是通过teb+peb实现模块隐藏 // HideDll.cpp : Defines the entry point for the console application. // #include ...

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

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

  3. (35)3环PEB断链

    一.断链原理 3环下PEB断链是一种常见的模块隐藏技术,原理是修改 _PEB_LDR_DATA 中的三个双向链表,删除链表中的项,让 CreateToolhelp32Snapshot 之类的API无法 ...

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

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

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

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

  6. 内核下断链隐藏进程(兼容多版本Windows系统,非硬编码)

    前言 在Windows内核下,我们可以通过获取EPROCESS结构来隐藏进程,EPROCESS是微软未公开的结构体,其本质上就是双向链表的一个节点,通过修改该双向链表即可达到隐藏进程的目的.但EPRO ...

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

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

  8. 二、C++反作弊对抗实战 (进阶篇 —— 4.遍历进程模块(暴力扫描整个内存找出被断链的))

    提示:以下是本篇文章正文内容,下面案例可供参考 一.前言 由于上一章节中的MsgBox已经被抹去PE头.断链隐藏了DLL,导致将无法正常遍历出当前进程的所有模块,这时候就需要用到暴力内存的方法了.因为 ...

  9. [Rootkit] 修改 peb 隐藏 dll(断链)

    PEB 中有一个成员 Ldr: typedef struct _PEB {UCHAR InheritedAddressSpace;UCHAR ReadImageFileExecOptions;UCHA ...

最新文章

  1. 独家 | 使EfficientNet更有效率的三种方法(附链接)
  2. 刷脸支付问题多,亚马逊选择刷「手掌」,在无人超市正式商用
  3. sharepoint指定的人可以看到列表项
  4. jzoj4739-[雅礼联考GDOI2017模拟9.2]Ztxz16学图论【LCT,树状数组】
  5. java io系列09之 FileDescriptor总结
  6. 【牛客 - 272B】Xor Path(树上操作,路径异或值)
  7. 2017《面向对象程序设计》课程作业五
  8. 当IDENTITY_INSERT设置为OFF时不能向表插入显示值。(源:MSSQLServer,错误码:544)
  9. linux ubuntu/centos相关收藏
  10. 郎文词根mdx_欧陆词典导入mdx_欧路词典导入音频
  11. Sketch 51 新功能介绍(包含破解版下载)
  12. 分享一款在线转换工具,轻松将PDF转换成JPG格式
  13. oracle中的Start With关键字
  14. 乔治城大学计算机专业,美国乔治城大学计算机
  15. 第六届苏州·张家港全球创新创业大赛等你来赛!
  16. DirectX11 平面镜像的实现
  17. 加州房价预测项目详细笔记(Regression)——(1)研究数据获得灵感
  18. LATEX--页边距设置
  19. 林达华博士对数学的见解
  20. linux计划任务1

热门文章

  1. 【蓝桥杯】2019年第十届蓝桥杯(个人赛) 大赛介绍、注意事项及赛后总结
  2. java生命之树_珍惜生命的心得感想与体会
  3. android 9.0 SystemUI导航栏添加虚拟按键功能(三)
  4. 卷积神经网路之感受野(receptive field)的理解
  5. 深度学习笔记~感受野(receptive field)的计算
  6. vue滑杆_非常简单的Vue滑杆组件
  7. python3爬虫豆瓣前一百_Python爬虫基础4-豆瓣top100
  8. 【读论文】基于深度学习的铁路道岔转辙机故障诊断(3DESIGN)
  9. Vue中使用Ckplayer播放器
  10. 1086 Tree Traversals Again (25分)