
マルウェア解析とリバースエンジニアリングのためのカスタムPE読み込み・操作ライブラリ。手動マッピング、IATフッキング、メモリダンプ、インポート再構築に対応。
PEファイルをロードおよび操作するためのライブラリ。
libPeConv の目標は、PEファイルのカスタムロードのための「スイスアーミーナイフ」を作成することでした。独自のローダーにすばやく統合できるさまざまなヘルパー関数を集めています。例:セクションの再マッピング、リロケーションの適用、インポートのロード、リソースの解析。
PEファイルのロードだけでなく、いくつかのステップのカスタマイズも可能です。すなわち、IATフック(カスタムIATリゾルバを提供することによる)、および関数のリダイレクトです。ただし、インラインフックに焦点を当てているわけではなく、MS DetoursやMinHookなどのライブラリと混同しないでください。
libPeConv は、PEバインダーの作成に使用できます。リソースから直接PEをロードし、あたかもローカルコードであるかのように統合できるためです。
また、メモリからPEをダンプし、それらのIATを再構築するのにも役立ちます。
警告:MUIを使用するアプリケーションはサポートされていません。
最も単純なユースケース: libPeConv を使用して、任意のEXEを手動でロードして実行します。
#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();
}
参照: https://github.com/hasherezade/libpeconv_tpl/blob/master/project_template/main.cpp