
Biblioteca personalizada de carga y manipulación de PE para mapeo manual, enganche de IAT, volcado de memoria y reconstrucción de imports para análisis de malware e ingeniería inversa.
Una biblioteca para cargar y manipular archivos PE.
El objetivo de libPEConv era crear una "navaja suiza" para la carga personalizada de archivos PE. Reúne varias funciones auxiliares que puedes integrar rápidamente en tu propio loader. Por ejemplo: reasignar secciones, aplicar reubicaciones, cargar importaciones, analizar recursos.
No solo permite cargar archivos PE, sino también personalizar algunos pasos, es decir, el hooking de IAT (proporcionando resolvers de IAT personalizados) y la redirección de funciones. Sin embargo, NO se centra en el hooking en línea y no debe confundirse con bibliotecas como MS Detours o MinHook.
LibPeConv se puede utilizar para crear binders de PE, ya que permite cargar un PE directamente desde el recurso e integrarlo como si fuera código local.
También puede ayudarte a volcar (dump) PEs desde la memoria y reconstruir sus IATs.
ADVERTENCIA: las aplicaciones que usan MUI no son compatibles.
El caso de uso más simple: usa libPeConv para cargar y ejecutar manualmente un EXE de tu elección.
#include <Windows.h>
#include <iostream>
#include <peconv.h> // include libPeConv header
int main(int argc, char *argv[])
{
if (argc < 2) {
std::cout << "Args: <path to the exe>" << std::endl;
return 0;
}
LPCSTR pe_path = argv[1];
// manually load the PE file using libPeConv:
size_t v_size = 0;
#ifdef LOAD_FROM_PATH
//if the PE is dropped on the disk, you can load it from the file:
BYTE* my_pe = peconv::load_pe_executable(pe_path, v_size);
#else
size_t bufsize = 0;
BYTE *buffer = peconv::load_file(pe_path, bufsize);
// if the file is NOT dropped on the disk, you can load it directly from a memory buffer:
BYTE* my_pe = peconv::load_pe_executable(buffer, bufsize, v_size);
#endif
if (!my_pe) {
return -1;
}
// if the loaded PE needs to access resources, you may need to connect it to the PEB:
peconv::set_main_module_in_peb((HMODULE)my_pe);
// load delayed imports (if present):
const ULONGLONG load_base = (ULONGLONG)my_pe;
peconv::load_delayed_imports(my_pe, load_base);
// if needed, you can run TLS callbacks before the Entry Point:
peconv::run_tls_callbacks(my_pe, v_size);
//calculate the Entry Point of the manually loaded module
DWORD ep_rva = peconv::get_entry_point_rva(my_pe);
if (!ep_rva) {
return -2;
}
ULONG_PTR ep_va = ep_rva + (ULONG_PTR) my_pe;
//assuming that the payload is an EXE file (not DLL) this will be the simplest prototype of the main:
int (*new_main)() = (int(*)())ep_va;
//call the Entry Point of the manually loaded PE:
return new_main();
}
Ver también: https://github.com/hasherezade/libpeconv_tpl/blob/master/project_template/main.cpp