3环PEB断链实现

2024-03-07 15:04
文章标签 实现 peb 断链

本文主要是介绍3环PEB断链实现,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

那么我们首先定义_PEB_LDR_DATA_LDR_DATA_TABLE_ENTRY结构

// 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          InInitializationOrderModuleList;void*               BaseAddress;void*               EntryPoint;  ULONG               SizeOfImage;UNICODE_STRING        FullDllName;UNICODE_STRING      BaseDllName;ULONG               Flags;SHORT               LoadCount;SHORT               TlsIndex;HANDLE              SectionHandle;ULONG               CheckSum;ULONG               TimeDateStamp;
} LDR_DATA_TABLE_ENTRY, *PLDR_DATA_TABLE_ENTRY;

然后通过汇编定位到LDR

    __asm{mov eax,fs:[0x30] // PEB mov ecx,[eax + 0x0c] // LDRmov ldr,ecx  }

因为这里三个双向链表的结构都是一样的,这里就以InLoadOrderModuleList来进行断链示范,这里要实现断链,最简单的做法就是让Head的Flink和Blink指向它自己

首先通过获取到的ldr结构指向InLoadOrderModuleList

Head = &(ldr->InLoadOrderModuleList);

然后通过CONTAINING_RECORD这个宏返回结构体基址

Cur = Head->Flink;
ldte = CONTAINING_RECORD( Cur, LDR_DATA_TABLE_ENTRY, InInitializationOrderModuleLi

 

void CONTAINING_RECORD(address,type,field
);

进行断链操作

        ldte->InInitializationOrderModuleList.Blink->Flink = ldte->InInitializationOrderModuleList.Flink;  ldte->InInitializationOrderModuleList.Flink->Blink = ldte->InInitializationOrderModuleList.Blink;    

然后将指针指向下一个结构

Cur = Cur->Flink;

因为需要遍历链表进行断链指向自身的操作,这里就需要写一个循环进行断链,完整代码如下

// killPEB.cpp : Defines the entry point for the console application.
//#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
{DWORD Length;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_ENTRY          InMemoryOrderModuleList;LIST_ENTRY          InInitializationOrderModuleList;void*               BaseAddress;void*               EntryPoint;  ULONG               SizeOfImage;UNICODE_STRING        FullDllName;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 Head, 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->Blink = 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;
}

这里在没有开始断链的时候可以看到是由3个模块的

锻炼之后可以发现kerner32.dll已经被隐藏

如果要实现所有模块的隐藏,直接将模块判断的代码删除即可

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; Head = &(ldr->InLoadOrderModuleList);Head->Flink = Head->Blink = Head;Head = &(ldr->InMemoryOrderModuleList);Head->Flink = Head->Blink = Head;Head = &(ldr->InInitializationOrderModuleList);Head->Flink = Head->Blink = Head;    
}

实现效果如下

断链之后,模块已经全部看不到了

这篇关于3环PEB断链实现的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/783914

相关文章

hdu1043(八数码问题,广搜 + hash(实现状态压缩) )

利用康拓展开将一个排列映射成一个自然数,然后就变成了普通的广搜题。 #include<iostream>#include<algorithm>#include<string>#include<stack>#include<queue>#include<map>#include<stdio.h>#include<stdlib.h>#include<ctype.h>#inclu

【C++】_list常用方法解析及模拟实现

相信自己的力量,只要对自己始终保持信心,尽自己最大努力去完成任何事,就算事情最终结果是失败了,努力了也不留遗憾。💓💓💓 目录   ✨说在前面 🍋知识点一:什么是list? •🌰1.list的定义 •🌰2.list的基本特性 •🌰3.常用接口介绍 🍋知识点二:list常用接口 •🌰1.默认成员函数 🔥构造函数(⭐) 🔥析构函数 •🌰2.list对象

【Prometheus】PromQL向量匹配实现不同标签的向量数据进行运算

✨✨ 欢迎大家来到景天科技苑✨✨ 🎈🎈 养成好习惯,先赞后看哦~🎈🎈 🏆 作者简介:景天科技苑 🏆《头衔》:大厂架构师,华为云开发者社区专家博主,阿里云开发者社区专家博主,CSDN全栈领域优质创作者,掘金优秀博主,51CTO博客专家等。 🏆《博客》:Python全栈,前后端开发,小程序开发,人工智能,js逆向,App逆向,网络系统安全,数据分析,Django,fastapi

让树莓派智能语音助手实现定时提醒功能

最初的时候是想直接在rasa 的chatbot上实现,因为rasa本身是带有remindschedule模块的。不过经过一番折腾后,忽然发现,chatbot上实现的定时,语音助手不一定会有响应。因为,我目前语音助手的代码设置了长时间无应答会结束对话,这样一来,chatbot定时提醒的触发就不会被语音助手获悉。那怎么让语音助手也具有定时提醒功能呢? 我最后选择的方法是用threading.Time

Android实现任意版本设置默认的锁屏壁纸和桌面壁纸(两张壁纸可不一致)

客户有些需求需要设置默认壁纸和锁屏壁纸  在默认情况下 这两个壁纸是相同的  如果需要默认的锁屏壁纸和桌面壁纸不一样 需要额外修改 Android13实现 替换默认桌面壁纸: 将图片文件替换frameworks/base/core/res/res/drawable-nodpi/default_wallpaper.*  (注意不能是bmp格式) 替换默认锁屏壁纸: 将图片资源放入vendo

C#实战|大乐透选号器[6]:实现实时显示已选择的红蓝球数量

哈喽,你好啊,我是雷工。 关于大乐透选号器在前面已经记录了5篇笔记,这是第6篇; 接下来实现实时显示当前选中红球数量,蓝球数量; 以下为练习笔记。 01 效果演示 当选择和取消选择红球或蓝球时,在对应的位置显示实时已选择的红球、蓝球的数量; 02 标签名称 分别设置Label标签名称为:lblRedCount、lblBlueCount

Kubernetes PodSecurityPolicy:PSP能实现的5种主要安全策略

Kubernetes PodSecurityPolicy:PSP能实现的5种主要安全策略 1. 特权模式限制2. 宿主机资源隔离3. 用户和组管理4. 权限提升控制5. SELinux配置 💖The Begin💖点点关注,收藏不迷路💖 Kubernetes的PodSecurityPolicy(PSP)是一个关键的安全特性,它在Pod创建之前实施安全策略,确保P

工厂ERP管理系统实现源码(JAVA)

工厂进销存管理系统是一个集采购管理、仓库管理、生产管理和销售管理于一体的综合解决方案。该系统旨在帮助企业优化流程、提高效率、降低成本,并实时掌握各环节的运营状况。 在采购管理方面,系统能够处理采购订单、供应商管理和采购入库等流程,确保采购过程的透明和高效。仓库管理方面,实现库存的精准管理,包括入库、出库、盘点等操作,确保库存数据的准确性和实时性。 生产管理模块则涵盖了生产计划制定、物料需求计划、

C++——stack、queue的实现及deque的介绍

目录 1.stack与queue的实现 1.1stack的实现  1.2 queue的实现 2.重温vector、list、stack、queue的介绍 2.1 STL标准库中stack和queue的底层结构  3.deque的简单介绍 3.1为什么选择deque作为stack和queue的底层默认容器  3.2 STL中对stack与queue的模拟实现 ①stack模拟实现

基于51单片机的自动转向修复系统的设计与实现

文章目录 前言资料获取设计介绍功能介绍设计清单具体实现截图参考文献设计获取 前言 💗博主介绍:✌全网粉丝10W+,CSDN特邀作者、博客专家、CSDN新星计划导师,一名热衷于单片机技术探索与分享的博主、专注于 精通51/STM32/MSP430/AVR等单片机设计 主要对象是咱们电子相关专业的大学生,希望您们都共创辉煌!✌💗 👇🏻 精彩专栏 推荐订阅👇🏻 单片机