其他分享
首页 > 其他分享> > PEB断链隐藏模块

PEB断链隐藏模块

作者:互联网

结构体介绍

_LDR_DATA_TABLE_ENTRY包含三个双向链表的结构体

1 typedef struct _PEB_LDR_DATA
2 {
3     ULONG  Length;
4     BOOLEAN Initialized;
5     PVOID SsHandle;
6     LIST_ENTRY              InLoadOrderModuleList;  //模块加载顺序
7      LIST_ENTRY              InMemoryOrderModuleList;  //模块在内存中顺序
8     LIST_ENTRY              InInitializationOrderModuleList;  //模块初始化的顺序
9 }_PEB_LDR_DATA,*PPEB_LDR_DATA;

 

_LIST_ENTRY指向双向链表的结构体指针

1 typedef struct _LIST_ENTRY 
2 {
3     struct _LIST_ENTRY *Flink;                    // 指向下一个节点的指针
4     struct _LIST_ENTRY *Blink;                    // 指向前一个节点的指针
5 } LIST_ENTRY, *PLIST_ENTRY, *RESTRICTED_POINTER PRLIST_ENTRY;

 

_LDR_DATA_TABLE_ENTRY保存模块信息的结构体

 1 typedef struct _LDR_DATA_TABLE_ENTRY
 2 {
 3     _LIST_ENTRY InLoadOrderLinks;
 4     _LIST_ENTRY  InMemoryOrderLinks;
 5     _LIST_ENTRY InInitializationOrderLinks;
 6     PVOID     DllBase;
 7     PVOID   EntryPoint;  //入口地址
 8     ULONG SizeOfImage;
 9     _UNICODE_STRING     FullDllName;  //所有模块名称
10     _UNICODE_STRING     BaseDllName;  //模块名称的base
11     ULONG Flags;     
12     USHORT LoadCount;
13     USHORT TlsIndex;
14     union
15     {
16         _LIST_ENTRY  HashLinks;
17         struct
18         {
19             PVOID SectionPointer;
20             ULONG CheckSum;
21         };
22     };
23     ULONG TimeDateStamp;
24 }_LDR_DATA_TABLE_ENTRY,*PLDR_DATA_TABLE_ENTRY;

 

断链隐藏指定模块

 1 VOID BrokenHidden(HMODULE hModule)
 2 {
 3     PPEB_LDR_DATA pLdr;
 4     PLDR_DATA_TABLE_ENTRY pLdrData;
 5     PLIST_ENTRY pHead;
 6     PLIST_ENTRY  Cur;
 7       
 8 
 9     _asm 
10     {
11         mov eax,fs:[0x18]   //指向TEB地址
12         mov eax, [eax+0x30]  //指向PEB地址
13         mov ecx,[eax+0xc]   ////指向PEB_LDR_DATA 地址
14         mov pLdr,ecx
15     }
16         pLdrData = (PLDR_DATA_TABLE_ENTRY)pLdr->InLoadOrderModuleList.Flink;
17     //pHead = pLdr;
18     pHead = &(pLdr->InLoadOrderModuleList);
19     Cur = pHead->Flink;
20     
21     //循环遍历找到要隐藏的模块并隐藏
22         do 
23         {
24             pLdrData = (PLDR_DATA_TABLE_ENTRY)Cur;
25             if (pLdrData->BaseAddress == hModule)
26             {
27                 //printf("success!");
28                 pLdrData->InLoadOrderLinks.Blink->Flink = pLdrData->InLoadOrderLinks.Flink;
29                 pLdrData->InInitializationOrderLinks.Blink->Flink=pLdrData->InInitializationOrderLinks.Flink;
30                 pLdrData->InMemoryOrderLinks.Blink->Flink=pLdrData->InMemoryOrderLinks.Flink;
31             }
32             Cur = Cur->Flink;
33         } while (pHead != Cur); //判断链表是否遍历完
34 }

    实现断链隐藏模块中,当用od加载时断链隐藏模块的效果还是不能实现。

 

标签:pLdrData,Flink,LIST,LDR,模块,ENTRY,断链,DATA,PEB
来源: https://www.cnblogs.com/flagby/p/16209955.html