Overview
Cheat Point Blank V2 MinHook merupakan studi reverse engineering terkontrol terhadap sebuah binary Windows x86 untuk memahami hubungan antara struktur PE, machine identifier, hashing, komunikasi network, response handling, state internal, anti-analysis surface, dan runtime instrumentation berbasis MinHook.
Pendekatan utama yang digunakan adalah observe/delegate. Hook diposisikan sebagai lapisan telemetry: argument dan output dicatat, original trampoline tetap dipanggil, lalu hasil original dikembalikan tanpa mengganti keputusan program. Model ini penting karena tujuan utamanya adalah menghasilkan observasi runtime yang dapat dibandingkan dengan temuan static analysis.
Ringkasan binary
Binary yang dianalisis merupakan PE32 untuk arsitektur x86 / IMAGE_FILE_MACHINE_I386 dengan subsystem Windows Console. Versi awal diketahui menggunakan UPX 5.20. Pada bentuk packed, section yang dominan adalah UPX0, UPX1, dan resource section.
Setelah unpacking, layout PE kembali menyerupai executable native yang normal. Perubahan ini membuat code, data, import, relocation, TLS, dan resource jauh lebih mudah dipetakan serta dibandingkan dengan control flow yang terlihat saat runtime.
Section layout setelah unpack
.text — executable code
.data — initialized writable data
.rdata — read-only data dan string
.eh_fram — exception/unwind related data
.bss — uninitialized data
.idata — import table
.tls — thread local storage
.rsrc — resources
.reloc — relocation data
Dalam reverse engineering, perbedaan antara packed layout dan unpacked layout sangat signifikan. Packed entry point sering kali lebih banyak merepresentasikan unpacking stub daripada logic aplikasi sebenarnya. Setelah code asli tersedia, cross-reference terhadap string, import, dan fungsi menjadi jauh lebih bermakna.
Model activation secara keseluruhan
Analisis menunjukkan sebuah pipeline berurutan yang menggabungkan informasi mesin, transformasi hash, pembentukan serial, request network, pembacaan response, normalisasi string, dan keputusan akhir.
GetVolumeInformationA
GetComputerNameA
GetSystemInfo
|
v
machine-data formatting
|
v
MD5
|
v
32-character lowercase serial
|
v
network request
|
v
InternetReadFile
|
v
raw response
|
v
trim / normalization
|
v
final comparator
|
v
boolean result
Model ini berguna karena setiap tahap mempunyai boundary yang relatif jelas. Daripada mengamati satu return value di akhir, instrumentation dapat membangun timeline penuh dari input mesin hingga result yang dikeluarkan validator.
1. Machine/HWID data builder
Tahap pertama bertanggung jawab menyusun data mesin. Fungsi ini menerima output buffer dan kapasitasnya, lalu mengumpulkan beberapa elemen informasi host menggunakan Windows API.
GetVolumeInformationA
GetComputerNameA
GetSystemInfo
Nilai yang diperoleh kemudian digabungkan menjadi representasi tekstual terstruktur. Dokumentasi binary menunjukkan penggunaan pola formatting yang mengombinasikan data numerik dan computer name menjadi satu string machine-data.
volume/system information
+
computer name
+
system information
|
v
formatted machine_data
Output dari tahap ini belum merupakan serial final. Machine-data hanya berfungsi sebagai material input bagi helper hashing. Ini menjadi titik telemetry penting karena perubahan kecil pada data host dapat langsung dibandingkan dengan perubahan serial pada tahap selanjutnya.
2. MD5 helper dan serial generation
Machine-data diteruskan ke helper yang menggunakan Windows CryptoAPI untuk menghasilkan digest MD5. API yang ditemukan dalam jalur ini meliputi:
CryptAcquireContextA
CryptCreateHash
CryptHashData
CryptGetHashParam
CryptDestroyHash
CryptReleaseContext
Algorithm yang dipakai adalah CALG_MD5. Digest MD5 berukuran 16 byte kemudian dikonversi menjadi lowercase hexadecimal, sehingga output akhirnya memiliki panjang 32 karakter sebelum terminator NUL.
machine_data
|
v
MD5 digest (16 bytes)
|
v
lowercase hexadecimal formatting
|
v
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
Secara konseptual:
serial = MD5_HEX(machine_data)
Dalam instrumentation, helper ini sangat bernilai karena memiliki input/output yang konkret. Satu event trace dapat menyimpan machine-data, output serial, output capacity, dan caller context sehingga korelasi antar-stage tidak bergantung pada snapshot debugger.
3. Main activation validator
Validator utama mengorkestrasi seluruh pipeline. Ia memanggil machine-data builder, meneruskan output ke MD5 helper, membentuk parameter network, menjalankan request, membaca server response, menormalisasi response, lalu meneruskan hasil tersebut ke comparator internal.
BuildMachineId
|
v
machine_data
|
v
Md5Hex
|
v
serial
|
v
build request
|
v
WinINet request
|
v
read response
|
v
normalize / trim
|
v
final comparator
|
v
bool result
Dari sudut reverse engineering, fungsi validator adalah titik sentral untuk memahami dependency antar-subsystem. Dari sudut runtime instrumentation, mengamati fungsi ini sebaiknya dilakukan dengan mempertahankan original semantics agar hasil trace tetap merepresentasikan behavior asli.
4. Request construction
Serial lowercase hexadecimal yang telah dibentuk digunakan sebagai parameter pada request activation. Binary membangun URL dari base endpoint dan nilai serial melalui concatenation sederhana.
base endpoint
+
serial
|
v
final request URL
Boundary ini memungkinkan analyst mengonfirmasi bahwa serial yang dihasilkan helper hashing memang identik dengan nilai yang akhirnya keluar melalui network layer. Ini juga membantu membedakan bug pada serial generation dari bug pada request construction.
5. WinINet request path
Jalur network menggunakan keluarga WinINet. Import utama yang terhubung dengan activation flow adalah:
InternetOpenA
InternetOpenUrlA
InternetReadFile
InternetCloseHandle
Flow tingkat tinggi:
prepare request
|
v
InternetOpenA
|
v
InternetOpenUrlA
|
v
InternetReadFile
|
v
response buffer
|
v
InternetCloseHandle
Untuk observability, hook pada exported WinINet API biasanya lebih stabil daripada hook pada instruction call-site individual. Export API mempunyai boundary dan ABI yang lebih jelas, sedangkan call-site compiler-generated dapat berubah ketika binary dibangun ulang.
Telemetry yang relevan
- Jenis API yang dipanggil dan urutannya.
- Request URL setelah selesai dibangun.
- Handle yang digunakan oleh operasi read.
- Requested read size dan actual bytes read.
- ASCII preview dari response.
- HEX preview untuk membedakan karakter printable dan terminator.
- Caller context untuk menghubungkan API event dengan activation session tertentu.
6. Response handling
Response yang dibaca melalui InternetReadFile ditempatkan ke local buffer dan kemudian diberi NUL terminator. Setelah itu terdapat tahap normalisasi whitespace sebelum data masuk ke comparator final.
raw bytes from network
|
v
NUL-terminated buffer
|
v
trim / whitespace normalization
|
v
normalized response
|
v
final comparison
Pemisahan antara raw server response, normalized response, dan comparator input merupakan bagian penting dari debugging. Response yang secara visual terlihat sama dapat berbeda pada byte level karena carriage return, newline, trailing spaces, atau karakter terminator.
7. Final comparator dan decision ownership
Keputusan akhir dihasilkan oleh comparator string setelah response selesai dinormalisasi. Pada model observe/delegate, comparator original tetap menjadi pemilik keputusan tersebut.
Ini membedakan instrumentation dari behavior modification. Hook hanya membangun telemetry di sekitar decision boundary:
capture input
|
v
call original logic
|
v
capture original result
|
v
return original result unchanged
Dengan model ini, data yang dikumpulkan masih dapat digunakan untuk menjelaskan mengapa aplikasi mengambil suatu branch tertentu tanpa menjadikan instrumentation itu sendiri sebagai sumber perubahan behavior.
8. MinHook observation strategy
Dokumentasi analisis mengutamakan pemasangan hook pada fungsi utuh daripada instruction di tengah fungsi. Function-level hook mempunyai beberapa keuntungan: boundary lebih mudah diidentifikasi, prototype lebih mudah diverifikasi, trampoline lebih mudah dipahami, dan perubahan minor compiler output cenderung tidak sefragile mid-function patch.
Activation checker telemetry
function entry
|
+----> capture input/output buffer metadata
+----> capture call count
+----> capture caller context
|
v
original trampoline
|
v
capture original result
|
v
return unchanged
MD5 helper telemetry
Untuk hashing stage, trace yang paling relevan meliputi:
- Input machine-data.
- Output MD5 serial.
- Output capacity.
- Caller context.
WinINet tracing
Untuk response read, telemetry sebaiknya membedakan raw network data dari application-level normalization:
InternetReadFile
|
v
raw response snapshot
|
v
application trim/normalization
|
v
comparator input
9. Address dan build validation
Static analysis dapat menghasilkan lokasi relatif yang berguna untuk build tertentu, tetapi instrumentation yang robust tidak seharusnya menganggap satu lokasi numerik sebagai satu-satunya sumber kebenaran. Recompile, perubahan linker, compiler optimization, atau perubahan dependency dapat menggeser layout code.
Model validasi yang lebih aman:
module base + known location
|
v
validate function prologue/signature
|
+-----+-----+
| |
match mismatch
| |
v v
observe rescan code section
Tujuan validasi bukan sekadar menemukan alamat yang executable, tetapi memastikan code pada lokasi tersebut benar-benar mempunyai shape dan calling semantics yang sesuai dengan fungsi yang diharapkan.
10. Calling convention dan ABI x86
Pada x86, calling convention merupakan bagian kritis dari reliability hook. Prototype yang terlihat masuk akal pada source level belum tentu benar di machine-code level.
Analyst perlu memeriksa:
- Bagaimana argument diletakkan pada stack.
- Siapa yang melakukan stack cleanup.
- Register mana yang dipertahankan.
- Bagaimana output buffer diteruskan.
- Bagaimana return value dibentuk.
- Caller sequence dan function epilogue.
Prototype detour yang salah dapat merusak ESP, register state, atau return path. Crash akibat ABI mismatch sering terlihat seperti masalah MinHook padahal hook library hanya menerima prototype yang keliru.
11. Anti-analysis surface
Binary mempunyai cukup banyak string yang mengindikasikan awareness terhadap tool reverse engineering, debugger, network inspection, dan process inspection. Indikator string yang ditemukan mencakup keluarga tool seperti:
Frida / frida-agent / frida-gadget / frida-server
Wireshark / tshark / dumpcap
Fiddler / Charles / mitmproxy / HTTP debugger
x32dbg / x64dbg / OllyDbg
IDA / WinDbg / DbgView
Process Hacker / Procmon / Process Explorer
dnSpy / de4dot / ILSpy
Scylla / PE-sieve / Hollows Hunter
Selain string, import yang berkaitan dengan anti-debug dan process enumeration juga ditemukan:
IsDebuggerPresent
CheckRemoteDebuggerPresent
NtQueryInformationProcess
CreateToolhelp32Snapshot
Process32First / Process32Next
Module32First / Module32Next
Keberadaan import atau string belum otomatis membuktikan satu mekanisme deteksi tertentu benar-benar aktif pada seluruh lifecycle. Karena itu area anti-analysis perlu dipetakan sebagai control-flow tersendiri.
Pertanyaan yang perlu dijawab saat mapping
- Kapan routine pemeriksaan dijalankan?
- Apakah pengecekan dilakukan sebelum atau sesudah network activity?
- Apakah yang dicari berupa process, module, window, debugger state, atau string?
- Apa branch yang diambil ketika indicator ditemukan?
- Apakah hasil pemeriksaan hanya logging, early exit, atau memengaruhi state lain?
12. Downloader / injector subsystem
Selain activation/authentication flow, binary juga menunjukkan subsystem kedua dengan karakteristik downloader dan runtime loader. String UI/log yang ditemukan mengindikasikan tahap preparation, waiting for process, detection, injection attempt, serta success/failure reporting.
Import yang berkaitan dengan process manipulation dan dynamic loading antara lain:
OpenProcess
VirtualAllocEx
WriteProcessMemory
CreateRemoteThread
GetProcAddress
LoadLibraryA
Keberadaan API tersebut menunjukkan bahwa subsystem ini perlu dianalisis terpisah dari validator. Secara high-level:
application
|
+----------+----------+
| |
v v
activation/auth loader subsystem
| |
machine data preparation
| |
hashing process discovery
| |
serial target process
| |
request runtime loading
| |
response result
|
decision
Pemisahan ini penting saat membuat telemetry. Event network activation tidak seharusnya dicampur dengan event process manipulation karena keduanya mewakili lifecycle dan tujuan yang berbeda.
13. Model reverse engineering saat ini
Model kerja yang paling berguna adalah melihat aplikasi sebagai rangkaian transformation boundary:
Windows machine information
|
v
machine-data builder
|
v
machine_data
|
v
MD5 helper
|
v
32-char lowercase serial
|
v
request construction
|
v
WinINet request
|
v
raw response
|
v
trim / normalization
|
v
final comparator
|
v
activation result
Dengan model ini, satu trace session dapat direpresentasikan sebagai sequence event yang deterministic dan mudah dibandingkan:
machine_data
-> serial
-> request metadata
-> raw response
-> normalized response
-> original result
14. Mengapa function-level instrumentation lebih berguna
Hook pada fungsi utuh memberikan konteks yang jauh lebih kaya dibandingkan patch pada satu conditional branch. Function boundary memungkinkan telemetry memiliki argument, output buffer, caller, duration, return value, dan call count.
Selain itu, model observe/delegate menjaga invariant penting: runtime behavior tetap dimiliki program original. Ini membuat hasil pengamatan valid untuk debugging dan reverse engineering karena instrumentation tidak menjadi penyebab perubahan branch yang sedang dianalisis.
15. Next analysis targets
Beberapa tahap lanjutan yang paling berguna untuk memperkuat model reverse engineering:
- Membangun signature atau prologue validation untuk fungsi-fungsi utama tanpa mengandalkan lokasi relatif saja.
- Mengonfirmasi calling convention dan argument layout dari caller serta epilogue.
- Membuat trace lengkap
machine_data → MD5 serial → request → raw response → normalized response → original validation result. - Memetakan anti-analysis routine serta caller masing-masing.
- Memisahkan loader/injector subsystem dari activation/authentication subsystem pada telemetry.
- Membandingkan beberapa runtime session untuk mencari invariant dan kondisi yang berubah.
- Mempertahankan return value original pada instrumentation utama sehingga observasi tetap merepresentasikan behavior native program.
Kesimpulan teknis
Analisis ini menunjukkan bahwa memahami binary Windows tidak cukup hanya dengan melihat satu comparator atau satu network call. Struktur sebenarnya baru terlihat ketika data dilacak sebagai pipeline: input mesin dibentuk, di-hash, dipakai sebagai serial, diteruskan ke network layer, response dibaca dan dinormalisasi, kemudian decision dibuat oleh logic internal.
Static analysis menyediakan peta awal berupa imports, strings, call relationships, section layout, dan kandidat function boundary. Runtime instrumentation kemudian mengubah peta tersebut menjadi telemetry nyata. Kombinasi keduanya memungkinkan analyst membedakan asumsi dari behavior aktual.
Pada saat yang sama, anti-analysis surface dan loader subsystem menunjukkan bahwa activation flow bukan satu-satunya control path penting. Memisahkan masing-masing subsystem membuat dokumentasi lebih konsisten dan mengurangi false correlation ketika event runtime dianalisis.
Penutup
Cheat Point Blank V2 MinHook menjadi contoh bagaimana binary PE32 x86 dapat dipetakan secara sistematis menggunakan kombinasi unpacking, static analysis, API inspection, dan MinHook-based runtime observation. Fokus utamanya bukan sekadar menemukan lokasi fungsi, tetapi membangun model data-flow dan control-flow yang dapat diverifikasi berulang kali.
Dengan instrumentation yang menjaga original semantics, setiap tahap dapat diobservasi tanpa mengaburkan behavior asli aplikasi. Hasilnya adalah fondasi yang lebih kuat untuk debugging, protocol observation, anti-analysis mapping, dan penelitian runtime berikutnya.