PE basics
Базовые PE-понятия в контексте Memory API и практической reverse engineering работы
PE basics для Memory API
PE это формат .exe и .dll в Windows. В контексте Memory API это важно потому, что большая часть удобной работы идёт не с "произвольным адресом", а с конкретным модулем: его секциями, импортами, экспортами и RVA. Для внешнего контекста полезны Game Fundamentals, DLL Injector и PE/COFF Spec.
Минимум терминов
- модуль — загруженный
.exeили.dll RVA— адрес относительно базы модуляVA— абсолютный адрес в памяти процесса- секция — кусок PE-образа вроде
.text,.rdata,.data - экспорт — то, что модуль отдаёт наружу
- импорт — то, что модуль подтягивает из других DLL
Если база модуля 0x7FF700000000, а RVA равен 0x1234, то VA будет BaseAddress + 0x1234.
Главное правило
Нормальный маршрут почти всегда такой:
- открыть процесс
- взять модуль
- работать уже внутри этого модуля
Для этого и нужен MemoryOfModule(...):
using System.Diagnostics;
using System.Linq;
using EyeAuras.Memory;
using EyeAuras.Memory.Scaffolding;
using var process = LocalProcess.ByProcessId(Process.GetCurrentProcess().Id);
using var kernel32 = process.MemoryOfModule("kernel32.dll");
После этого kernel32 это уже не вся память процесса, а окно на конкретный PE-образ.
Что умеет Memory API
Для PE-практики чаще всего нужны:
ReadSections()ReadExports()ReadImports()
var sections = kernel32.ReadSections();
var exports = kernel32.ReadExports();
var mainModule = process.GetProcessModules()
.First(x => x.ModuleName.EndsWith(".exe", StringComparison.OrdinalIgnoreCase));
using var mainMemory = process.MemoryOfModule(mainModule);
var imports = mainMemory.ReadImports();
Этого обычно хватает, чтобы:
- понять layout модуля
- найти публичную функцию
- посмотреть внешние зависимости
- подготовить
IAT-patching,pattern scanningилиcode cave
Где это пригодится
PE-база нужна почти везде, где вы хотите уйти от мышления "вот случайный адрес" к более устойчивой модели:
- модуль
- секция
- экспорт
- импорт
RVA
Именно эта модель потом лучше всего стыкуется с сигнатурами, инжектом и patching-сценариями.