500B tokens later: Letting AI agents decompile a first-person shooter

Rekayasa Balik Skala Masif: Anatomi Eksperimen Dekompilasi 500 Miliar Token

Mendekompilasi binary C++ berukuran puluhan megabyte bukan pekerjaan yang bisa diselesaikan dengan sekali klik tombol "Export" pada Ghidra atau IDA Pro. Siapa pun yang pernah menghabiskan waktu berjam-jam menelusuri graph kontrol alur (Control Flow Graph/CFG), merekonstruksi Virtual Method Table (vtable), dan menebak tipe data pointer di balik instruksi assembly yang teroptimasi, paham betul bahwa dekompilasi adalah pekerjaan manual dengan cognitive load yang luar biasa tinggi.

Eksperimen momo5502 baru-baru ini menyentuh ranah ekstrem: menghabiskan kuota komputasi sebesar 500 miliar (500B) token pada LLM agentic pipeline untuk merekonstruksi kode sumber sebuah first-person shooter (FPS).

Alih-alih sekadar menghasilkan pseudocode mentah seperti output Hex-Rays, proyek ini berupaya mencapai holy grail rekayasa balik: kode sumber C++ yang idiomatik, memiliki tipe data semantik yang benar, dan dapat dikompilasi ulang menjadi binary yang fungsional.

Berikut adalah bedah arsitektur teknis, trade-off ekonomi, serta realitas implementasi di balik angka 500 miliar token tersebut.

---

Problem Statement: Keterbatasan Decompiler Tradisional

Decompiler berbasis rule/heuristik seperti Ghidra atau Hex-Rays bekerja pada level Intermediate Representation (IR). Keduanya sangat handal dalam mentransformasi instruksi machine code menjadi Static Single Assignment (SSA) form, lalu menyederhanakannya menjadi AST (Abstract Syntax Tree) berformat mirip C.

Namun, heuristik tersebut langsung mentok ketika berhadapan dengan abstraksi tingkat tinggi:

  1. Kehilangan Tipe Data Semantik: Decompiler hanya tahu ukuran register dan offset memori (misalnya (DWORD)(ecx + 0x24)). Menentukan apakah ini adalah health, player_state, atau sekadar array padding membutuhkan pemahaman konteks runtime dan relasi data global.
  2. Rekonstruksi Virtual Method Tables (vtables): Resolusi pemanggilan fungsi polimorfik C++ yang dilakukan via indirect call (call [eax + 0x10]) sering gagal di-resolve secara statis tanpa propagasi tipe pointer yang sangat presisi.
  3. Control Flow Flattening dan Optimasi Compiler: Inline function ekspansif, vectorization (SIMD), dan restrukturisasi loop oleh compiler sering kali menghasilkan spaghetti code di level pseudocode C decompiler konvensional.

Upaya manual untuk memulihkan satu game engine skala komersial (seperti idTech atau custom proprietary engine) biasanya membutuhkan waktu bertahun-tahun melalui reverse-engineering project komunitas. LLM ditugaskan untuk memangkas siklus tahunan ini menjadi hitungan hari melalui brute-force inference.

---

Arsitektur di Balik Layar: The Compiler-in-the-Loop Pipeline

Menghabiskan 500B token bukan berarti melempar ribuan file assembly ke dalam satu context window raksasa. Hal tersebut merupakan resep pasti untuk halusinasi dan memory corruption. Dari analisis implementasi momo5502 dan diskusi teknis yang berkembang, sistem ini bekerja melalui multi-stage autonomous pipeline:

1. Graph Partitioning dan Topological Sorting

Binary tidak diproses secara linier. Headless decompiler mengekstrak Call Graph dan Dependency Graph dari seluruh binary. Modul-modul dipisahkan menjadi fungsi-fungsi individual dan cluster fungsi independen. Pipeline memproses fungsi dari leaf nodes (fungsi terbawah yang tidak memanggil fungsi lain) naik ke root nodes, memastikan bahwa dependensi tipe data dan return types telah terdefinisi sebelum fungsi pemanggilnya diproses.

2. Struct Layout Engine

Masalah terbesar C++ adalah offset memori. Jika Agent salah menebak ukuran struct Entity sebanyak 4 byte, seluruh pembacaan memori berikutnya akan corrupt. Pipeline mempertahankan state table global untuk setiap struct yang terdeteksi. Setiap kali Agent mengusulkan definisi struct, definisi tersebut divalidasi silang terhadap semua akses offset di seluruh binary untuk memastikan tidak ada collision.

3. Execution Feedback Loop (Compiler-as-a-Critic)

Agen LLM tidak dibiarkan bekerja dalam kondisi open-loop. Begitu fungsi C++ di-generate:

  • Level 1 (Syntactic): Kode dilempar ke Clang. Jika kompilasi gagal, error log (misal: missing type, syntax error) dikembalikan ke LLM untuk iterasi perbaikan.
  • Level 2 (ABI & Semantic): Kode yang lolos kompilasi diubah kembali menjadi binary/assembly, lalu dibandingkan polanya dengan fungsi target awal (teknik yang serupa dengan proyek matching decompilation). Tujuannya bukan menghasilkan instruksi byte-per-byte yang 100% identik, melainkan memastikan side-effects memori, calling conventions (__thiscall, __cdecl, __fastcall), dan stack alignment tetap terjaga.

Iterasi berulang pada tahap inilah yang membakar token dalam skala masif. Satu fungsi kompleks bisa memerlukan belasan hingga puluhan iterasi prompt-compiler-fix sebelum menghasilkan output yang valid.

---

Trade-Off Analitik: Cost vs Complexity

Klaim 500 miliar token mengindikasikan investasi komputasi yang substansial. Jika dihitung dengan asumsi biaya model reasoning/coding modern (campuran antara context input dan output generation), kita berbicara tentang pengeluaran ribuan hingga puluhan ribu dolar AS hanya untuk satu proyek dekompilasi.

| Parameter | Dekompilasi Tradisional (Manual) | Dekompilasi Berbasis Heuristik Murni | Agentic LLM Pipeline (500B Tokens) | | :--- | :--- | :--- | :--- | | Kecepatan | Sangat Lambat (Bulan - Tahun) | Instan (Menit - Jam) | Menengah (Jam - Hari) | | Keterbacaan Kode | Sangat Tinggi (Ditulis manusia) | Rendah (Cast pointer tak berujung) | Tinggi (Idiomatic C++, nama bermakna) | | Presisi Semantik | Sangat Tinggi | Menengah (Secara assembly benar) | Rentan halusinasi logika tanpa test harness | | Biaya Finansial | Biaya gaji reverse engineer | Lisensi tools (IDA/Ghidra) | Biaya inferensi token cloud yang masif |

Realitas Perangkap "Compilable Fallacy"

Salah satu kritik terbesar yang muncul dalam diskusi Hacker News berakar pada ilusi fungsionalitas. Kode C++ yang dikompilasi tanpa error bukan jaminan kode tersebut benar secara logika.

Jika LLM salah mengasumsikan sebuah branch flag floating-point pada logika deteksi collision, game tetap bisa di-build dan berjalan, tetapi pemain akan menembus dinding atau mengalami silent crash akibat memory leak. Menghabiskan 500B token tanpa test suite dinamis yang komprehensif (dynamic testing/symbolic execution) hanya memindahkan beban kerja: dari beban mengetik kode menjadi beban melakukan debugging heksadesimal terhadap halusinasi halus yang dihasilkan AI.

---

Takeaways Konkret untuk Software Engineer

  1. Prompt Saja Tidak Cukup, Runtime Feedback Adalah Kunci

Mencoba menggunakan LLM untuk tugas rekayasa perangkat lunak tingkat rendah tanpa sistem verifikasi deterministik (compiler, linter, profiler) adalah kesia-siaan. Kunci keberhasilan proyek seperti ini bukan pada kelihaian prompt engineering, melainkan pada arsitektur pipeline yang menjadikan compiler error dan binary verification sebagai reinforcement mechanism langsung ke context window LLM.

  1. Skalabilitas Konteks Menghadapi State Divergence

Meski context window modern kini mencapai 1M+ token, brute-forcing seluruh basis kode ke dalam model tetap merupakan anti-pattern. Pendekatan graf ketergantungan (call-graph partitioning) dan pemeliharaan state table eksternal untuk skema struct/tipe data membuktikan bahwa metadata engineering di luar LLM tetap menjadi penentu keberhasilan rekonstruksi sistem.

  1. Perubahan Paradigma Audit Keamanan Binary

Kemampuan merekonstruksi source code yang idiomatik secara otonom dalam skala jutaan baris binary akan mengubah dinamika audit software legacy dan penemuan kerentanan (vulnerability research). Binary proprietary yang sebelumnya terlindungi oleh kompleksitas assembly kini dapat dipetakan secara terstruktur dengan modal API credits.

Eksperimen 500 miliar token ini mendemonstrasikan bahwa batas antara binary tertutup dan source code terbuka semakin tipis. Namun bagi praktisi sistem, pelajaran utamanya jelas: AI tidak menghilangkan kebutuhan akan pemahaman mendalam tentang compiler internals, calling convention, dan layout memori. AI hanya menaikkan level abstraksi di mana insinyur harus memvalidasinya.

Arsitektur & Alur Visual Sistem

Arsitektur dan Alur Sistem: 500B tokens later: Letting AI agents decompile a first-person shooter