综合百科

确实msvcp140.dll

确实msvcp140.dll

LoadPE——PE加载器的进化前身

想要访问一个程序运行时的内存,通常可以采取跨进程读写内存的方式。但这种方法需要频繁调用API,使用起来不太方便。如果我们想直接访问内存地址,该怎么做呢?一种方法是注入DLL到目标进程中,使得注入的代码与目标进程在同一个地址空间内。如果不想进行注入操作,也不想跨进程读写地址,那么有没有其他方法直接读取进程地址呢?如果仅在导入表中添加DLL,这样很容易就会被检测出来。在模块中简单遍历就能轻松识别。

实际上,我们可以尝试换一种思路:不是向目标进程中添加内容,而是将目标进程加载到我们的进程中。这样,访问目标进程的内存就变成了访问我们自己的内存。那么,LoadPE作为一种PE加载器的前身技术,它的作用是什么呢?

一、系统加载exe的标准流程

1. 准备一个新的内存空间;

2. 按照节表的顺序将内容映内存中;

3. 填写导入表。而LoadPE的目的在于可以在自己的进程中更改目标PE的内存状态。它的重点在于:

二、LoadPE的关键点

1. 在自己的代码前留出足够的空间,即目标进程的SizeOfImage大小;

2. 将自己程序的ImageBase更改并加载到目标ImageBase处,例如设置为:/base:0xXXXXXXX。通过这种方式,目标进程的PE头会占据我们进程的PE头位置,它的数据节也会覆盖我们自己的数据节。因此我们需要将我们的代码向后移动,为目标进程留出足够的空间。

三、LoadPE的实现思路

我们需要设置我们进程的ImageBase与目标进程的ImageBase保持一致。具体步骤包括:

使用汇编实现LoadPE的加载过程

通过winhex查看目标进程的ImageBase和SizeOfImage。

新建工程,并设置工程选项中的ImageBase与目标进程的一致。

移动自己的代码,可以在开头定义SizeOfImage大小的全局变量或通过指令调整偏移。

注意,许多C库函数不会保存ecx、edx环境,使用前请先保存。

通过winhex查看进程的模块基址和数据大小。

包含必要的头文件和库。

定义SizeOfImage和g_szFile(要加载的进程路径)等全局变量。

LoadPe过程:

获取文件句柄、创建文件映射和将文件映内存。

通过PE文件结构获取DOS头和NT头。

处理导入表,加载DLL,获取导入函数进程加载后的地址,并写入INT表。

清理资源。

执行加载的PE代码。

在main函数中调用LoadPe过程。

通过特定的工具或方法(如winhex)获取目标进程的ImageBase和SizeOfImage信息。

新建项目并设置相应的ImageBase,确保与目标进程一致。

初始化一个缓冲区或数组来模拟目标进程的内存布局。该缓冲区的大小至少为SizeOfImage。

从文件系统中加载目标PE文件的内容到该缓冲区中,同时考虑偏移量。

解析PE文件的各个部分(如DOS头、NT头、节表等),并根据需要调整内存布局。特别注意导入表的解析和处理。


确实msvcp140.dll

你可能也会喜欢...