文章目录
  1. 1. 读取进程模块
  2. 2. 读取进程到内存
  3. 3. 转储
今天破解软件时LoadPE突然不能用了- -!,没办法,要转储文件,自己写一个吧.
代码就不公开了,不献丑了



> 编写主要分为下面几个步骤,

1
2
3
4
加载进程;
读取进程模块,取可执行文件的映像;
读取进程当前内存;
PE头稍加修改,转储!


# 加载进程

> 这个不多说了,找到进程PID,直接OpenProcess会给你返回一个进程句柄,下面的操作都要用这个句柄.至于PID怎么获得?想要编程的话使用Process32First,Process32Next,想偷懒的话直接使用tasklist

读取进程模块

这里微软已经我们准备好了,有个API叫Module32First,Module32Next,至于怎么用,MSDN上说的很清楚,一般来说Module32First返回的 MODULEENTRY32 就是可执行映像文件,没办法,创建进程的时候他总是第一个加载的啊,别的DLL都是为他服务的.

读取进程到内存

这里唯一需要注意的一点是:读取的时候可能需要设置权限,使用VirtualProtectEx设置权限,使用ReadProcessMemory读取内存,记得设置完以后用VirtualProtectEx改回去^-^

转储

好了,进程的可执行文件的内存映像已经被我们读取下来了,这个时候先别急着存储,因为还有一些事要做.大家观察下LoadPE转储下来的文件,有一个规律



V.offset与R.offset,V.Size与R.Size一样吧

顺便说下,V.offset指的是程序加载到内存以后RVA(相对虚拟地址),R.offset是指程序在文件中实际的偏移地址,R.offset指实际大小,V.size指加载到内存以后的大小.一般程序这两组值是不相等的,但是为什么转储以后相等了呢?

这里个人觉得是作者偷了一下懒,因为加壳过程中,不能保证文件的大小不变,特别是压缩壳,是要尽可能减小程序在硬盘中的存储大小的,所以,一般壳都会去修改这个R.offset,R.size,让他们使用加壳以后比较合适的值,从而达到压缩,加密的目的,换句话说,这里的R.offset,R.size并不是未加壳前程序的偏移值及大小!所以说,直接保存很大可能性会出错!

怎么办呢?

  • 比较麻烦的方法是:既然程序已经解密完毕了(转储时务必确保到达OEP!),那我们能不能算出来较为合适的R.offset以及R.size呢?当然可以!
  • 比较简单的方法是:直接让R.offset=V.offset,R.size=V.size,V.size肯定是要大于R.size的,所以这样做无非就是多占一点空间而已(这也是为什么转储后的文件都要大于原文件),但是很保险,不会出错.

修改完每个SECTION的R.offset以及R.size后,如果有必要,修改下PE头中的ImageSize,保存文件,大功告成(当然修复输入表就是另外一回事了).

祝大家开心
文章目录
  1. 1. 读取进程模块
  2. 2. 读取进程到内存
  3. 3. 转储