夺取应用程序 “制空权“:内存数据

28 篇文章 2 订阅
19 篇文章 1 订阅

1.技术背景

在病毒查杀,应用安全对抗,静态逆向应用,动态逆向应用,最重要的对象就是,应用程序的内存数据。

病毒查杀对抗:需要获取查杀对象的内存数据进行和病毒库的特征做比对。

应用安全对抗:需要保护自身的内存数据不被转存。

静态逆向应用:遇到应用程序加密保护,那这用IDA就歇菜了,这时获取解密后内存数据就非常重要。

动态逆向应用:用ollydbg进行动态调试应用主要还是调试运行时释放的内存数据。

综上:应用程序的重重之中就是内存数据,我们就来用代码实现获取应用程序的 “制空权”。

2.效果展示

下面展示的是,读取并操作,正在运行的ClearData进程的内存数据。

图片第一部分是正确读取到的内存数据,并写入到新创建的文件里面,文件大小和进程的原始文件是一致的。

图片第二部分是工作窗口,展示的是读取操作的一些信息。

图片第三部分展示,正在运行的进程信息。

在这里插入图片描述

3.代码实现

功能:获取正在运行进程的Pid

实现原理:通过创建一个系统快照,进行遍历所有的进程名称。通过比对进程

名称,来获取进程的PID值。
在这里插入图片描述

功能:获取正在运行进程的指定模块的基地址数据

实现步骤:通过PEB获取进程所加载的模块。

1、获取正在运行指定进程的_PEB结构。

2、通过_PEB的Ldr成员获取_PEB_LDR_DATA结构。

3、通过_PEB_LDR_DATA的InMemoryOrderModuleList成员获取_LIST_ENTRY结构。

4、通过_LIST_ENTRY的Flink成员获取_LDR_DATA_TABLE_ENTRY结构,注意:这里的Flink指向的是_LDR_DATA_TABLE_ENTRY结构中的InMemoryOrderLinks成员,因此需要计算真正的_LDR_DATA_TABLE_ENTRY起始地址。

5、输出_LDR_DATA_TABLE_ENTRY的BaseDllName或FullDllName成员信息。

在这里插入图片描述
在这里插入图片描述

功能:获得到整个进程的内存数据

实现步骤:

1、打开要操作的指定进程,并获取进程的句柄。

2、通过读取PE文件结构方式,进行读取正在运行的内存数据: DosHeader->NtHeader->区段表。

3、将读取到的内存数据,写入到文件。
在这里插入图片描述
在这里插入图片描述

4. 知识清单

PE结构概述

PE(Portable Execute)文件,它是Windows下可执行文件的总称,也是windows系统下标准的文件格式。

在window系统上常见的后缀为DLL,EXE,OCX,SYS等文件都是属于PE文件。但事实上,一个文件是否是PE文件与其扩展名无关,PE文件可以是任何扩展名。

PE文件结构概括起来就是:它主要由 “头”(DOS头,NT头,可选头)和“节”(text节,data节)组成。

在代码中去实现,判断一个可执行文件,是否是PE文件结构。主要有两个判断:

1.DOS头的魔法值字段是否是 “MZ” ,也就是 0x5A4D 值。

2.NT头的签名字段信息是否是 “PE00” ,也就是 0x00004550 值。

下图是一个标准PE文件结构图

在这里插入图片描述

PEB结构概述

PEB结构(Process Envirorment Block Structure):进程环境信息块。

PEB:它主要是用于存放进程信息,每个进程都有属于自己的PEB信息。

PEB:它位于用户地址空间。

调用系统未导出函数方法

在这里插入图片描述

5. 关键函数及结构解析

1.ReadProcessMemory函数

在这里插入图片描述

2. _LIST_ENTRY结构

在这里插入图片描述

3. _PEB_LDR_DATAS结构

在这里插入图片描述

4. _LDR_MODULE 结构

在这里插入图片描述

  • 6
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 8
    评论
抢夺宝箱算法,也称拼手气算法或各取所需算法,是一种竞争策略。在该算法中,多个竞争者竞争获得一个宝箱。每个竞争者都有一个样本值,用于确定其获胜几率。 以下是使用C语言编写的抢夺宝箱算法的示例代码: ``` #include <stdio.h> #include <stdlib.h> #include <time.h> #define MAX_VALUE 100 // 随机生成样本值 int get_sample() { return rand() % MAX_VALUE; } // 进行抢夺宝藏算法的单次竞争 int compete(int samples[], int count) { int max_index = -1; int max_value = -1; // 找到样本中的最大值 for (int i = 0; i < count; i++) { if (samples[i] > max_value) { max_index = i; max_value = samples[i]; } } // 返回最大值的索引 return max_index; } int main() { // 随机生成样本值 int samples[10]; srand(time(NULL)); for (int i = 0; i < 10; i++) { samples[i] = get_sample(); printf("%d ", samples[i]); } // 进行10次单次竞争 printf("\n-----------\n"); for (int i = 0; i < 10; i++) { int result = compete(samples, 10); printf("第%d次竞争,胜者是第%d个样本\n", i + 1, result + 1); } return 0; } ``` 在这个例子中,我们首先随机生成了一个长度为10的样本集合,每个样本值在0到99之间。然后进行了10次单次竞争,每次竞争都返回最大样本值的索引。我们可以看到,每次竞争的结果都不一样,因为每次随机生成的样本集合都不同。 注:AI模型不支持rand函数,在线模式下此代码无法运行,请在本地环境下运行此代码。
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小道安全

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值