
Zigで書かれたリフレクティブPEローダー。ネイティブおよび.NETのPEファイルをメモリから直接読み込み、実行します。
Zigで書かれたリフレクティブPEローダー。ネイティブおよび.NETのPEファイルをメモリから直接ロードして実行します。
__security_cookie、/GSバッファセキュリティ用)SetProcessValidCallTargetsで有効なコールターゲットを登録ロードされたPEイメージからエクスポートを解決するためのユーティリティ関数:
getExportByName(base, ntheaders, name) — 名前で解決getExportByOrdinal(base, ntheaders, ordinal) — 序数で解決フォワードされたエクスポートも自動的に処理し、対象のDLL(例:"NTDLL.RtlAllocateHeap")をロードしてntdll.dll内の実際の関数に解決します。
PEBのApiSetMapを使用して、Windows APIセット(api-ms-win-*、ext-ms-win-*)を実際のホストDLLに自動的に解決します。これにより、仮想APIセットDLLからインポートしているPEをロードできます。
utils.detect_platform(buffer) — PEが32ビットか64ビットかを検出utils.is_dotnet_assembly(ntheaders) — PEが.NETアセンブリかどうかを確認utils.getDotNetVersion(buffer) — メタデータから.NETランタイムバージョン文字列を抽出utils.rvaToFileOffset(buffer, rva) — RVAをファイル内の生のオフセットに変換| アーキテクチャ | マシンコード | ビット数 |
|---|---|---|
| i386 | 0x014c | 32ビット |
| AMD64 | 0x8664 | 64ビット |
| IA64 | 0x0200 | 64ビット |
| ARM (ARMNT) | 0x01C4 | 32ビット |
| ARM64 | 0xAA64 | 64ビット |
リポジトリをクローン:
git clone https://github.com/Thoxy67/zig-pe.git
cd zig-pe
プロジェクトをビルド:
zig build
zig build -Ddotnet=false # .NETサポートを無効化(デフォルトで有効)
zig build # すべてのターゲットをビルド
zig build run-putty64 # 64ビットネイティブPEの例を実行
zig build run-putty32 # 32ビットネイティブPEの例を実行
zig build run-dotnet # .NETアセンブリの例を実行
zig build test # ユニットテストを実行
const pe = @import("pe");
pub fn main() !void {
// 埋め込まれたPEファイルをロードして実行
try pe.RunPE.init(@embedFile("bin/app.exe")).run();
}
const pe = @import("pe");
pub fn main() !void {
var loader = pe.RunPE.init(@embedFile("bin/app.exe"));
try loader.runWithArgs(&.{ "arg1", "arg2", "arg3" });
}
const std = @import("std");
const pe = @import("pe");
pub fn main() !void {
var gpa = std.heap.GeneralPurposeAllocator(.{}){};
defer _ = gpa.deinit();
const allocator = gpa.allocator();
const file_content = try std.fs.cwd().readFileAlloc(
allocator,
"path/to/executable.exe",
std.math.maxInt(usize),
);
defer allocator.free(file_content);
try pe.RunPE.init(file_content).run();
}
const pe = @import("pe");
// DLLをメモリにロードした後...
const base: [*]const u8 = @ptrCast(loaded_base);
const ntheaders = // ... NTヘッダーを取得
// 名前で解決
if (pe.getExportByName(base, ntheaders, "ExportedFunction")) |func_ptr| {
const func: *const fn () void = @ptrCast(@alignCast(func_ptr));
func();
}
// 序数で解決
if (pe.getExportByOrdinal(base, ntheaders, 42)) |func_ptr| {
// 関数ポインタを使用
}
GetCommandLineW()が指定された引数を返すようになります。Main(string[] args)に直接引数が渡されます。このプロジェクトは任意のコードをロードして実行することを伴うため、潜在的に危険です。信頼できるPEファイルのみを使用し、管理された環境でこのローダーを利用してください。著者らは、本ソフトウェアの誤用や損害について一切の責任を負いません。
zig-peへのコントリビューションを歓迎します!プルリクエストの送信、イシューの作成、情報の拡散を自由に行ってください。
git checkout -b feature/AmazingFeature)git commit -m 'Add some AmazingFeature')git push origin feature/AmazingFeature)このプロジェクトはMITライセンスの下でライセンスされています。詳細はLICENSEファイルを参照してください。
このプロジェクトは教育目的のみで提供されています。PEファイルをロードして実行する前に、必要な権利と許可を取得していることを確認してください。