Anti-cheat modular user-mode untuk Ragnarok (RRO.exe) ditulis dalam C++17 (VS2022, Win32/x86). Fokus utama: deteksi tool injeksi umum, hook (IAT / inline / prolog), modifikasi memory section kritikal (.text sistem), aktivitas overlay, dan integritas file/signature.
- DLL Client (Oblivion_Client) diinject / diload ke proses game.
- Server contoh (Oblivion_Server) menerima log (Named Pipe) dan mengirim perintah kontrol (command pipe).
- Komunikasi teks sederhana: setiap pesan satu line (terminated
\n). - Skema obfuscation opsional: XOR statik / rolling XOR + nonce + CRC32.
- Policy file eksternal untuk memuat blacklist, whitelist publisher / overlay, target prolog, chunk integrity whitelist, dan interval override detector.
- Semua detector (kecuali bootstrap ProcessWatcher WMI thread) berjalan dalam satu
DetectorScheduler(tick-based) sehingga manajemen interval & profiling terpusat.
- Process & Thread Watcher (WMI + fallback snapshot)
- HandleProtection (mencegah open handle berbahaya – pendekatan dasar)
- Heartbeat (interval tetap atau adaptif)
- Overlay Scanner (window title & class blacklist) + Publisher Whitelist
- Driver Scanner (enumerasi driver user-mode via SCM / snapshot)
- AntiDebug (heuristik anti attach debugger)
- AntiSuspend (monitor thread freeze / suspend)
- AntiInjection (proses / modul blacklist, heuristic injeksi dasar)
- DigitalSignatureScanner (verifikasi file kritikal + whitelist publisher)
- AntiTestMode & TestModeSpoofChecker
- SignatureScanner (pattern memory sederhana)
- HijackedThreadDetector (context / start address anomaly check)
- IATHookChecker (validasi pointer import)
- PrologHookChecker (inline prolog baseline + penambahan target dinamis + PROLOG_LIST)
- Integrity (.text hashing + delta per-chunk 4096B) untuk: Ntdll / Kernel32 / User32 / Gdi32
- Rolling XOR + Nonce per pesan + rotasi kunci runtime (PIPE_SET_XOR_KEY) + optional reset nonce
- CRC32 tagging opsional (integritas pesan)
- PolicyManager (load/save runtime konfigurasi; mendukung [interval])
- IntegrityChunkWhitelist (persist ke policy)
- RuntimeStats (GET_STATUS: deteksi, info, heartbeat, uptime)
- Command rate limiting (global 20 per 3s) + cooldown khusus perintah berisiko
- DetectorScheduler: profiling (runCount, last ms, avg ms), adaptive interval, interval override per detector
- Self-test framework (SELFTEST) untuk mengukur durasi eksekusi langsung tiap detector
- Perintah manajemen interval: SET_INTERVAL / CLEAR_INTERVAL / CLEAR_INTERVAL_ALL / LIST_INTERVALS / RESET_PROFILER
- Risk command cooldown (KILL_PROCESS & QUARANTINE_FILE minimal 2s + abuse counter)
- Overlay Scanner diperluas dengan heuristik struktur window (deteksi varian Cheat Engine rebrand)
- SignatureScanner memuat pola dasar CE (speedhack jump stub, UI string cluster)
- PrologHookChecker kini juga baseline timing API (GetTickCount/QueryPerformanceCounter/NtQueryPerformanceCounter/NtDelayExecution)
- AntiInjection menambahkan probing artefak device driver CE (\.\DBKKernel / DBKProc / DBKPhys) dengan cooldown
- Dynamic Signature Loading via policy section baru
[signature](memungkinkan update pola tanpa rebuild) - External Intrusive Handle Detection (enumerasi system handle mendeteksi proses lain memegang akses WRITE/VM/DEBUG ke proses game)
- Weighted Multi-Source Correlation Engine (korelasi hook + partial heuristic/signature + external handle untuk peningkatan confidence dan reduksi false positive)
- Setiap detector memiliki interval dasar (
IntervalMs()). - Profiling otomatis mengukur
lastDurationMsdanavgDurationMs. - Adaptive mode internal: jika rata-rata > ADAPT_INCREASE_THRESHOLD (default 75ms) dan belum override manual → interval dinaikkan bertahap (maks ADAPT_INTERVAL_MULT_MAX x base, default 4x). Jika < ADAPT_DECREASE_THRESHOLD (default 25ms) dan sudah melebar → diturunkan bertahap ke base.
- Override manual (SET_INTERVAL) menonaktifkan adaptasi untuk detector tersebut sampai di-clear.
- RESET_PROFILER menghapus statistik (tidak mengubah interval).
- SELFTEST mengeksekusi semua
Tick()secara sinkron untuk audit cepat (hasil dalam ms atau ERR).
INFO|Tag|DetailDETECTION|Feature|Detail- PROLOG_LIST:
INFO|PROLOG|BEGIN_PROLOG_LIST count=NINFO|PROLOG|<module> <function> <minBytes>(tiap target)INFO|PROLOG|END_PROLOG_LIST
- STATUS:
INFO|STATUS|STATUS detections=X info=Y heartbeats=Z uptime_sec=T - Hasil command / operasi runtime lain menggunakan tag khusus:
INFO|RESULT|...,INFO|INTERVALS|...,INFO|SELFTEST|...
CLOSE_CLIENT
UPDATE_BLACKLIST <process.exe>
UPDATE_MODULE_BLACKLIST <dllname>
UPDATE_OVERLAY_BLACKLIST_TITLE <title>
UPDATE_OVERLAY_BLACKLIST_CLASS <class>
UPDATE_DRIVER_BLACKLIST <driver.sys>
WHITELIST_PUBLISHER_ADD <CN>
WHITELIST_FILE_ADD <full_path>
KILL_PROCESS <pid>
QUARANTINE_FILE <full_path>
REQUEST_HEARTBEAT_NOW
PROLOG_ADD_TARGET <module> <func> [bytes]
PROLOG_REBASELINE
PROLOG_LIST
PIPE_SET_XOR_KEY <hex_byte>
PIPE_SET_CRC_ON
PIPE_SET_CRC_OFF
PIPE_ROLLING_XOR_ON
PIPE_ROLLING_XOR_OFF
HEARTBEAT_ADAPTIVE_ON
HEARTBEAT_ADAPTIVE_OFF
POLICY_LOAD <full_path_policy>
POLICY_SAVE <full_path_policy>
WHITELIST_CHUNK_ADD <module> <chunkIndex>
SET_INTERVAL <DetectorName> <ms>
CLEAR_INTERVAL <DetectorName>
CLEAR_INTERVAL_ALL
LIST_INTERVALS
RESET_PROFILER
SELFTEST
GET_STATUS
DUMP_CONFIG
SIGNATURE_LIST
CORR_STATUS
CORR_STATUS_JSON
CORR_RESET
SET_INTERVAL/CLEAR_INTERVALmemodifikasi interval scheduler tanpa rebuild.LIST_INTERVALSmenampilkan<nama>=<ms>(tanda*jika override manual aktif).RESET_PROFILERmenghapus statistik (interval tetap).SELFTESTmengukur durasi aktual tick masing-masing detector satu kali.- Cooldown:
KILL_PROCESS&QUARANTINE_FILEminimalCMD_RISK_COOLDOWN_MS(default 2000 ms) antar eksekusi; percobaan terlalu cepat menghasilkan pesan COOLDOWN (dibatasiCMD_ABUSE_THRESHOLDnotifikasi, sisanya silent). DUMP_CONFIGmenampilkan nilai konfigurasi aktif (constant compile-time) untuk audit cepat.SIGNATURE_LISTmenampilkan daftar signature aktif (nama dan panjang pola) setelah load policy.
Section order bebas; baris kosong / # diabaikan.
[process]
cheatengine.exe
[module]
dbghelp.dll
[driver]
dbk32.sys
[overlay_title]
cheat engine
[overlay_class]
discordoverlay
[publisher]
microsoft corporation
gravity co., ltd.
[prolog]
kernel32.dll VirtualProtect 8
ntdll.dll NtOpenProcess 8
[chunk_whitelist]
ntdll.dll 5
kernel32.dll 12
[interval]
heartbeat 10000
antiinjection 7000
[signature]
# Format: <nama>|<pola_hex>
# Gunakan spasi antar byte; wildcard byte gunakan ??
# Contoh sederhana speedhack stub tambahan (dummy):
ce_speed_stub2|E9 ?? ?? ?? ?? 90 90
ui_first_next_cluster|46 69 72 73 74 20 53 63 61 6E 00 00 00 4E 65 78 74 20 53 63 61 6E
Catatan:
- Semua entry dipaksa lowercase saat load.
prolog:<module> <func> <minBytes>.chunk_whitelist:<module> <chunkIndex>(index 0, chunk 4096B).interval:<detector_name_lower> <ms>; override adaptif dan manual di-set sebelum scheduler start.signature:<name>|<hex pattern>; hex harus dipisah spasi (AA BB CC),??= wildcard. Saat policy load, signature bawaan di-clear lalu diganti pattern baru (gunakan kembali pattern bawaan jika masih ingin aktif).
Section [signature] memperbolehkan menambahkan / mengganti pola runtime tanpa rebuild. Implementasi saat load:
- Ketika parser menemukan
[signature], vector internal signature dibersihkan. - Setiap baris non-komentar dengan format
<nama>|<pola>diparse:
- Nama disimpan apa adanya (case dilestarikan untuk log).
- Pola: token dipisah spasi;
??→ wildcard (mask=false), hex (1–2 digit) → byte (mask=true).
- SignatureScanner menggunakan daftar baru pada tick berikutnya.
Command SIGNATURE_LIST dapat dipakai sewaktu-waktu untuk memverifikasi signature mana yang aktif (berguna setelah POLICY_LOAD).
Implikasi:
- Semua signature build-in hilang setelah
[signature]section ditemukan; pastikan salin pola default jika masih ingin menggunakannya. - Dapat dipakai untuk eksperimen cepat terhadap varian baru tanpa distribusi binary baru.
- Validasi minimal: token >2 hex digit akan mengabaikan baris (silent). Pertimbangkan menambah log error jika perlu.
Rekomendasi:
- Simpan file policy baseline yang berisi pola default + tambahan Anda.
- Gunakan nama konsisten (prefix
ce_,tool_, dll) untuk mempermudah korelasi log.
Contoh minimal hanya signature:
[signature]
ce_speedhack_jmp|E9 ?? ?? ?? ?? 90 90
ce_ui_first_next|46 69 72 73 74 20 53 63 61 6E 00 00 00 4E 65 78 74 20 53 63 61 6E
- Build solution (Client DLL + Server exe).
- Injeksi / load DLL client ke proses game (launcher internal / manual). Pipe server opsional (client retry connect).
- (Opsional)
PIPE_SET_XOR_KEY 5a,PIPE_ROLLING_XOR_ON,PIPE_SET_CRC_ON. POLICY_LOAD file.policyuntuk konfigurasi awal (atau fallback embedded).- Pantau
DETECTION|...� proses akan dihentikan olehShowDetectionAndExituntuk event kritis. - Kelola hooks prolog:
PROLOG_ADD_TARGET, laluPROLOG_REBASELINE, cekPROLOG_LIST. - Whitelist chunk OS update: pakai output Integrity mismatch ?
WHITELIST_CHUNK_ADD, laluPOLICY_SAVE. - Atur interval dynamic:
SET_INTERVAL AntiInjection 8000, atau reset:CLEAR_INTERVAL AntiInjection/CLEAR_INTERVAL_ALL. - Audit kinerja:
SELFTEST, atau profiling ringkas viaGET_STATUS.
- Interval dasar (misal 10s) dapat dinaikkan ketika sistem idle; pengaturan adaptif ON/OFF via command.
- Format:
NONCE=xxxxxxxx;<payload_obfuscated> PIPE_SET_XOR_KEY <hex>mereset nonce.
Handshake server kini dapat mengumumkan bahwa setiap payload log wajib menyertakan HMAC (SHA-256) dengan respon OK HMAC alih-alih hanya OK.
Alur:
-
Client kirim
HELLO <nonceCli> -
Server kirim
CHALLENGE <nonceSrv> -
Client kirim
AUTH <sha256(key + nonceCli + nonceSrv)> -
Server validasi dan balas:
OK HMACjikaConfig::PIPE_HMAC_REQUIRED_DEFAULT == trueOKjika tidak diwajibkan
-
Client bila menerima
OK HMACotomatis mengaktifkan mode HMAC (menambahkan suffix|H=<sha256(key_or_sessionKey + payload_plain)>).
Server Verifikasi:
- Jika
PIPE_HMAC_REQUIRED_DEFAULTtrue dan paket tidak memiliki|H=→ paket dibuang ([Client][HMACFAIL]). - HMAC diverifikasi menggunakan
sessionKey(hasil derivasi handshake) atau fallback shared key jika session key kosong.
Konfigurasi:
| Konstanta | Efek |
|---|---|
PIPE_HMAC_REQUIRED_DEFAULT |
True → server balas OK HMAC dan drop semua payload tanpa HMAC |
Backward Compatibility:
- Klien lama (tidak paham
OK HMAC) akan gagal mengirim karena tidak pernah menambahkan HMAC dan paket akan didrop → lakukan rollout serempak.
Rollback Cepat:
- Set
PIPE_HMAC_REQUIRED_DEFAULTkefalsedan rebuild server + client. - Server kembali membalas
OK; klien baru tetap bisa mengirim HMAC (server toleran) karena verifikasi hanya menandai error jika mismatch, bukan ketidakhadiran (kecuali required).
Keamanan:
- HMAC menutup celah modifikasi payload pasca-obfuscation XOR/CRC.
- Disarankan pasang bersama strict handshake ON untuk menghindari downgrade.
Pembaharuan fokus meningkatkan baseline integrity mirip filosofi proteksi Gepard Shield:
- Hash Upgrade: Semua hashing integrity
.textkini memakai SHA-256 truncated 64-bit (8 byte LE) menggantikan FNV1a lama (reduksi collision, masih ringkas untuk logging / storage). - Optional HWID-Derived HMAC: Baseline
NtdllIntegritykini diproteksi HMAC-SHA256 menggunakan kunci obfuscated + campuran hash HWID (aktif secara default lewatINTEGRITY_HMAC_HWID_ENABLED_DEFAULT). Mencegah baseline spoof sederhana lintas mesin. - Disk Cross-Check Generalized: Delta chunk kini diberi label
(=disk)bila nilai chunk runtime cocok dengan salinan bersih di disk (module: ntdll, user32; dapat diperluas). Membantu klasifikasi injection in-memory vs patch on-disk. - Whitelist Per-Range:
IntegrityChunkWhitelistmendukungAddRange(interval [start,end]) dan melakukan kompresi interval internal. Policy future dapat mengekspose sintaks range tanpa menimbulkan overhead besar. - Audit Mode (
MODSEC_AUDIT=1): Mengaktifkan mode hanya-log (tidak memanggilExitProcess) memudahkan tuning di environment QA / staging tanpa mengganggu runtime pemain. - Chained Baseline Persistence: Format baseline
ntdll_baseline.txtversi 2 memasukkan HMAC versi saat ini dan (opsional) HMAC sebelumnya untuk memitigasi poisoning (injeksi baseline baru tanpa lineage). KonstantaINTEGRITY_BASELINE_VERSIONmenjaga path migrasi. - Kernel Surface Stub: Detector placeholder
KernelSurfaceStubmerekam snapshot ringan PEB (pointer Ldr, ProcessParameters, jumlah modul) untuk mendeteksi drift kasar (indikasi manipulasi struktur userland sebelum driver kernel tersedia). - Memory Heuristics Detector:
MemoryHeuristicsmelakukan sweep region committed mencari halaman eksekusi yang juga writable (RWX) dan mendeteksi entropi tinggi (> ~7.3) pada sampel 4KB. Mengurangi blind spot shellcode JIT / packer yang belum dihook. - Config Flags Baru (lihat
Config.h):
INTEGRITY_HMAC_HWID_ENABLED_DEFAULTINTEGRITY_CHAIN_BASELINE_DEFAULTMODSEC_AUDIT_MODE_DEFAULTINTEGRITY_BASELINE_VERSIONINTEGRITY_AUTO_WHITELIST_DISK_MATCH_DEFAULT
Semua modul inti OS yang dimonitor kini konsisten memakai pipeline integrity yang sama:
- Hashing: SHA-256 truncated 64-bit (
HashUtil::Sha256Trunc64). - Chunking: Ukuran mengikuti
Config::CHUNK_SIZE(seragam di semua modul). - Disk Cross-Check: Baseline menyimpan hash
.textbersih per-chunk untuk anotasi(=disk)/(!disk)saat delta. - Auto-Whitelist Disk-Match: Jika SEMUA delta chunk cocok disk dan
INTEGRITY_AUTO_WHITELIST_DISK_MATCH_DEFAULTtrue → otomatis di-whitelist + rebaseline (tanpa terminate) + telemetry counter meningkat (awNtdll,awKernel32,awUser32,awGdi32). - HMAC Persistence (Chained):
ntdll_baseline.txt,kernel32_baseline.txt,user32_baseline.txt,gdi32_baseline.txtmemakai format versi 2 (lihat di atas) dengan HMAC SHA-256 dan opsional previous-chain HMAC jikaINTEGRITY_CHAIN_BASELINE_DEFAULTaktif. - Key Derivation Refactor: Semua modul sekarang memakai util bersama
IntegrityHmacUtil::BuildModuleKeyyang:- Merakit kunci obfuscated 32-byte.
- Opsional XOR hash HWID (konfigurasi
INTEGRITY_HMAC_HWID_ENABLED_DEFAULT). - Diversifikasi per modul (XOR nama modul) untuk meminimalkan korelasi antar baseline.
- File Baseline: Disimpan di direktori kerja proses; mismatch HMAC → baseline diabaikan dan baseline fresh direcapture (mencegah poisoning sederhana).
Format Baseline Versi 2 (semua modul):
<version> <baselineHash> <chunkCount> <chunkHashes...> <diskHash> <diskChunkCount> <diskChunkHashes...> <hmacHex> [prevHmacHex]
Contoh (dipotong) kernel32_baseline.txt:
2 123456789012345 128 <...128 angka...> 987654321012345 128 <...128 angka...> a1b2c3... (64 hex) d4e5f6...(64 hex optional)
Telemetry Tambahan:
- Counter auto-whitelist per modul membantu audit patch OS vs anomali injeksi. Lonjakan tak biasa di satu modul → sinyal investigasi.
Policy Shortcut: mX-Y tetap default ke ntdll.dll; gunakan bentuk eksplisit (kernel32.dll m10-12, user32.dll m5-9, gdi32.dll m3-4) untuk modul lain.
Jika INTEGRITY_AUTO_WHITELIST_DISK_MATCH_DEFAULT = true, dan semua chunk yang berubah relatif terhadap baseline lama ternyata identik dengan salinan bersih di disk ((=disk)), maka:
- Chunk tersebut otomatis dimasukkan ke whitelist (runtime) untuk modul terkait.
- Baseline hash dan chunk hash diperbarui (rebaseline) tanpa men-trigger termination.
- Log info dicetak:
auto-whitelisted disk-matching chunks. - Gunakan bersama
MODSEC_AUDIT=1untuk fase kalibrasi patch OS → aktifkan flag → jalankan game → kumpulkan log → setelah stabil simpan whitelist permanen via policy (future parser range support).
Keamanan: hanya berlaku jika SEMUA deltas bernilai (=disk). Jika ada satu chunk yang tidak cocok disk ((!disk)), proses deteksi normal tetap berjalan.
Section [chunk_whitelist] kini mendukung variasi:
ntdll.dll 12→ single chunk (format legacy tetap berlaku)ntdll.dll 12-18→ range inklusifntdll.dll m12-18→ alternatif prefiksm(menegaskan “chunk”)user32.dll:m4-9→ inline modul + tokenmm10-20→ shortcut modul defaultntdll.dll(heuristik umum patch Windows)user32.dll:m7→ single chunk via token
Catatan:
- Rentang otomatis digabung (interval merging) sehingga input tumpang tindih jadi satu interval.
- Output penyimpanan policy saat ini tetap melakukan enumerasi setiap chunk (optimisasi future: persist bentuk range).
- Batas enumerasi ekspor saat ini: maks 1024 item per interval saat serialisasi
GetAll()(untuk mencegah dump raksasa tidak perlu).
set MODSEC_AUDIT=1 # Windows PowerShell / CMDSemua detection akan tetap dipublish (dengan label (AUDIT)), tetapi proses tidak diterminate. Gunakan untuk mengumpulkan delta whitelist setelah patch Windows.
- File baseline lama (versi 1) otomatis di-parse dan diserialisasi ulang dalam format versi 2 saat capture baru.
- Jika HMAC mismatch pada load → baseline diabaikan dan baseline fresh ditangkap ulang.
- Policy syntax ring-kompresi whitelist (persist bentuk range langsung).
- Driver kernel: snapshot SSDT + verifikasi PEB pointer chain -> disuplai ke
KernelSurfaceStubuntuk perbandingan silang. - Ekstensi heuristik memory: marking halaman JIT + analitik transisi proteksi.
- Replay mitigasi lanjutan: binding sequence + time window adaptif (sudah sebagian dengan SEQ + NONCE, bisa diperketat).
Roadmap Opsional:
- Negotiated capabilities line (misal
OK CAPA:HMAC,CRC) untuk future extensibility. - Sequence number + binding ke HMAC untuk ordering guarantee.
Fitur ini menambahkan |SEQ=<uint64> pada akhir payload sebelum tag HMAC (|H=). Sequence dilindungi oleh HMAC sehingga tidak bisa dimodifikasi tanpa terdeteksi.
Format Wire (simplified):
NONCE=aaaaaaaa; <payload_utf8>|SEQ=42|H=<sha256(sessionKey + payload_utf8|SEQ=42)>
Server Behavior:
-
Verifikasi HMAC (jika required / ada tag) atas string yang masih mengandung
|SEQ=.... -
Parse SEQ (harus segment terakhir sebelum HMAC atau akhir jika HMAC off).
-
Monotonic check:
- Pertama: tetapkan baseline (accept).
seq <= lastSeq: drop ([SEQFAIL][ORDER]) bila enforcement aktif.seq == lastSeq + 1: normal.seq > lastSeq + 1: log gap ([SEQGAP] expected=<last+1> got=<seq>) dan accept.
-
Payload final untuk log dibersihkan dari
|SEQ=(metadata internal).
Konfigurasi:
| Konstanta | Efek |
|---|---|
PIPE_SEQ_ENFORCE_DEFAULT |
True → drop out-of-order atau missing SEQ |
Deployment Notes:
- Klien lama (tanpa SEQ) akan di-drop jika enforcement aktif.
- Untuk migrasi bertahap: set
PIPE_SEQ_ENFORCE_DEFAULT=falsesementara; server hanya log[SEQWARN]. - HMAC + SEQ = proteksi integritas & ordering. Nonces tetap dibutuhkan untuk replay window time-based.
Limitasi & Future:
- Tidak ada wrap handling khusus (praktis tak tercapai dalam runtime normal).
- Belum ada counter statistik gap teragregasi (bisa ditambah untuk telemetri).
- Belum ada command runtime untuk toggle SEQ enforce (mirip ide toggle HMAC).
Implementasi sebelumnya menggunakan std::vector dengan prune linear O(n) dan pencarian duplikat O(n). Sudah diganti menjadi kombinasi std::deque (menjaga urutan waktu untuk eviksi window) + std::unordered_set (cek keanggotaan O(1) rata-rata). Hasil:
- Insert + lookup → O(1) average.
- Prune window → loop hanya over entri expired di depan (amortized O(k) kecil).
- Capacity enforcement → while loop pop front menjaga memori stabil.
Konstanta terkait masih sama (PIPE_REPLAY_WINDOW_MS, PIPE_REPLAY_CACHE_MAX). Tidak ada perubahan format protokol.
Server log pipe kini mendukung perintah inline (dikirim sebagai payload biasa) untuk men-toggle fitur tanpa rebuild.
Format:
#SET HMACREQ=0|1
#SET SEQENFORCE=0|1
#DUMP STATE
Perilaku:
- Baris diawali
#SETdiproses sebelum parsing normal dan tidak dilog sebagai payload client. HMACREQmengubah enforcement HMAC runtime (paket tanpa HMAC akan drop jika 1).SEQENFORCEmengubah enforcement sequence monotonic runtime.
Keamanan Tambahan:
PIPE_SET_REQUIRE_HMAC(config compile-time) jikatruememaksa setiap baris#SEThanya diterima bila paket memuat HMAC valid. Gunakan ini untuk mencegah downgrade konfigurasi oleh injeksi plaintext.
Catatan Keamanan:
- Tidak ada autentikasi tambahan; hanya gunakan di lingkungan trusted atau layer-kan ACL Named Pipe.
- Pertimbangkan menambah whitelist origin / HMAC wajib sebelum memproses
#SET(future hardening).
Contoh:
#SET HMACREQ=1
#SET SEQENFORCE=0
#DUMP STATE
Roadmap Opsional:
- Tambah
#SET REPLAYWINDOW=<ms>untuk tuning dinamis. - Komando
#DUMP STATEmemberikan snapshot HMAC/SEQ flags, lastSeq, replay cache size, dan counter setiap event (c_<EVENT>flatten) dalam JSON satu baris. - Diaktifkan via
PIPE_SET_CRC_ON; pesan memiliki suffix|CRC=XXXXXXXXsebelum obfuscation.
Server kini mengemisi baris JSON satu-per-event (Line-Oriented) untuk semua kejadian keamanan kritikal / anomali protokol. Format ini memudahkan ingestion ke sistem SIEM / log aggregator tanpa perlu parsing regex rapuh atas log teks legacy.
Karakteristik:
- Satu objek JSON per line (tanpa spasi awal / indent) → aman dipipe ke collector.
- Field minimal selalu ada:
ts(epoch ms, string),evt(kode event),v(versi schema saat ini1). - Field tambahan (key/value) hanya muncul jika relevan (schema forward-compatible: jangan hard-fail bila menemukan field baru).
- Semua nilai direpresentasikan sebagai string untuk kesederhanaan (hindari masalah tipe lintas bahasa ingestion awal).
Contoh (diringkas, wrapping manual hanya dokumentasi – implementasi real: satu line):
{"ts":"1726423456789","evt":"HANDSHAKE_FAIL","reason":"TIMEOUT_HELLO","v":1}
{"ts":"1726423456791","evt":"HANDSHAKE_OK","hmacRequired":"1","v":1}
{"ts":"1726423456890","evt":"REPLAY_DROP","nonce":"7fa3bc21","v":1}
{"ts":"1726423457002","evt":"HMAC_FAIL","crcOk":"1","v":1}
{"ts":"1726423457010","evt":"SEQ_FAIL","type":"ORDER","seq":"105","last":"110","v":1}
{"ts":"1726423457022","evt":"SEQ_GAP","expected":"210","got":"214","v":1}
{"ts":"1726423457100","evt":"CFG_SET","key":"HMACREQ","value":"1","v":1}
{"ts":"1726423457105","evt":"CFG_DENY","reason":"NO_HMAC","key":"SEQENFORCE","v":1}
{"ts":"1726423457110","evt":"CFG_UNKNOWN","key":"FOO","v":1}
| Event | Deskripsi | Field Tambahan |
|---|---|---|
HANDSHAKE_FAIL |
Handshake gagal (fase HELLO / AUTH) | reason (TIMEOUT_HELLO / BAD_AUTH_FORMAT / BAD_DIGEST) |
HANDSHAKE_OK |
Handshake sukses | hmacRequired (1/0) |
REPLAY_DROP |
Paket ditolak karena nonce sudah pernah diterima dalam window | nonce (hex, lower) |
HMAC_FAIL |
Verifikasi HMAC gagal (mismatch) | crcOk (1/0) menandai apakah CRC (jika ada) lolos |
SEQ_FAIL |
Sequence error dan paket di-drop (enforce aktif) | type (ORDER/MISSING/ABSENT), seq, last (hanya ORDER) |
SEQ_WARN |
Sequence anomali tapi tidak di-drop (enforce off) | type, seq, last (conditional) |
SEQ_GAP |
Diterima dengan gap (seq > last+1) | expected, got |
CFG_SET |
Runtime config #SET diterapkan |
key, value |
CFG_DENY |
#SET ditolak (biasanya karena tidak ada HMAC) |
reason (NO_HMAC), key |
CFG_UNKNOWN |
#SET dengan key tak dikenali |
key |
Catatan Sequence:
SEQ_FAILtipeORDER:seq <= lastSeq(rewind / duplikat)SEQ_FAILtipeMISSING: Tag|SEQ=hilang pada paket yang seharusnya memilikinyaSEQ_FAILtipeABSENT: Paket sama sekali tanpa field sequence saat enforcement aktifSEQ_GAPditerbitkan terpisah meskipun paket diterima (observabilitas gap vs rewind)
Langkah umum ingestion:
- Baca stdout/stderr server → filter baris yang dimulai
{"ts":(atau parse penuh JSON line-based). - Normalisasi: convert string numerik ke tipe asli bila diperlukan (timestamp, seq).
- Index dengan key
evtuntuk query cepat (contoh di Elastic / Loki / Splunk). - Tambah pipeline rule: alert jika
HMAC_FAIL> N dalam window pendek atau adaHANDSHAKE_FAILberurutan > M.
- Versi schema awal:
v=1. Penambahan field baru tidak akan mengubah arti field lama. - Perubahan nama event akan melalui penambahan alias transisi (misal
evt2) – belum direncanakan dalam waktu dekat.
| Tahap | Fitur | Status |
|---|---|---|
| 1 | Emisi event protokol dasar (handshake, replay, hmac, seq, cfg) | Selesai |
| 2 | Counter agregasi & #DUMP STATE (JSON snapshot) |
Selesai |
| 3 | Rate limit / sampling event banjir (misal HMAC_FAIL) |
Planned |
| 4 | Sink file rotasi (security_events.log + size/time rotate) |
Planned |
| 5 | Ekspor opsional ke TCP/UDP syslog / webhook | Exploratory |
| 6 | Penandaan sesi (session id) di setiap event | Planned |
- Simpan raw events minimal 7 hari untuk forensik replay / ordering.
- Monitor anomali burst
REPLAY_DROP(indikasi brute-force nonce / injeksi ulang payload). CFG_DENYberulang bisa menandakan probing downgrade oleh proses tidak authorized.- Aktifkan
PIPE_SET_REQUIRE_HMACuntuk menutup vektor downgradeHMACREQ.
import json, sys
for line in sys.stdin:
if not line.startswith('{"ts"'):
continue
try:
evt = json.loads(line)
except json.JSONDecodeError:
continue
if evt.get('evt') == 'HMAC_FAIL':
# increment metric / alert
passDengan struktur ini Anda dapat menambah pipeline analytics tanpa perlu memodifikasi kode C++ inti saat menambah tipe event baru.
- Full mismatch ? re-hash per chunk 4KB; hanya chunk bukan whitelist ? deteksi.
GET_STATUSmenampilkan ringkas rata-rata ms (maks 10 detector pertama yang sudah run >0 kali).LIST_INTERVALSmenampilkan interval aktif (tanda*= override manual; adaptif tidak diberi tanda khusus saat ini).
Menjalankan satu siklus semua detector secara serial untuk benchmarking cepat performa.
Menggabungkan sinyal (hook, partial heuristic/signature, external handle) dalam jendela CORR_WINDOW_MS dan hanya memicu detection korelasi untuk kombinasi bernilai tinggi.
Jalur:
- HookCorrelation – kombinasi hook (EAT/IAT/PROLOG/SYSCALL) ketika totalScore >=
CORR_SCORE_THRESHOLD. - MultiSourceCorrelation – distinct kategori >=
CORR_TRIGGER_DISTINCTdan mengandung CE_PARTIAL / SIG_PARTIAL / EXT_HANDLE.
Kategori aktif:
- EAT, IAT, PROLOG, SYSCALL (indikasi hook / manipulasi eksekusi)
- CE_PARTIAL (heuristik UI CE kuat tapi <
CE_SCORE_THRESHOLD; bobotCE_PARTIAL_SCORE) - SIG_PARTIAL (cluster string/UI saja tanpa stub eksekusi; memberi bobot
SIG_PARTIAL_SCOREsaat belum ada signature kuat lain) - EXT_HANDLE (proses eksternal memegang akses tinggi: WRITE/VM/THREAD/DEBUG → bobot
EXT_HANDLE_SCORE)
Skoring & Evaluasi:
- Setiap Report(category, detail, weight) disimpan dengan timestamp.
- Prune tiap
CORR_PRUNE_INTERVAL_MSuntuk buang entri tua. - Kombinasi unik hanya sekali dilaporkan (cache internal) agar log tidak banjir.
Command: CORR_STATUS → contoh score=5 eat=0 iat=0 prolog=1 syscall=0 ceP=1 sigP=0 handle=1.
Command JSON: CORR_STATUS_JSON → kunci numerik termasuk metrics internal.
Reset state: CORR_RESET → flush semua entri, cooldown, dan counter metrics.
Contoh Alur:
- CE_PARTIAL (2) + EXT_HANDLE (3) → score=5 distinct=2 (belum multi-source).
- PROLOG hook terdeteksi → distinct=3 → MultiSourceCorrelation tercapai.
Manfaat:
- Turunkan false positive single-signal.
- Tingkatkan confidence sebelum tindakan fatal.
- Observabilitas progres investigasi via
CORR_STATUS.
Roadmap: aktifkan SIG_PARTIAL nyata; bobot dinamis via policy.
Catatan: Partial event tidak menghentikan proses sendiri; hanya detection akhir atau detector kritikal lain yang memicu exit.
Overlay Scanner tidak lagi hanya mengandalkan substring judul / class. Ia sekarang memberi skor pada window top-level (visible, min 400x300) untuk mengidentifikasi pola UI CE yang di-rebrand:
- +2: class root mengandung
TMainFormatauTApplication - +2: judul masih mengandung
cheat engine - +1: >=2 ListView child
- +1: >=8 Edit control
- +1: child text mengandung
pointeratauscan - +1: menu memiliki >=3 kata: File / Edit / Table / Memory / Scan
Trigger skor >=4 → DETECTION|OverlayScanner|CEHeuristic ... dan proses dihentikan. Cooldown global 5 menit & setiap HWND hanya dilaporkan sekali per sesi. Ini meningkatkan cakupan terhadap build Cheat Engine yang rename file & title namun masih mempertahankan struktur UI dasar.
Semua angka penting ditempatkan di include/Config.h untuk menghindari hard-code tersebar:
| Kategori | Konstanta | Default | Deskripsi |
|---|---|---|---|
| Command Rate | CMD_WINDOW_MS |
3000 | Jendela sliding ms untuk rate limiting perintah |
| Command Rate | CMD_MAX_RECENT |
20 | Maks perintah dalam window sebelum ditolak |
| Risk Cooldown | CMD_RISK_COOLDOWN_MS |
2000 | Cooldown perintah berisiko (kill/quarantine) |
| Risk Cooldown | CMD_ABUSE_THRESHOLD |
5 | Notifikasi cooldown maksimum sebelum silent |
| Adaptive | ADAPT_INCREASE_THRESHOLD |
75.0 | Ambang naikkan interval (ms avg) |
| Adaptive | ADAPT_DECREASE_THRESHOLD |
25.0 | Ambang turunkan interval |
| Adaptive | ADAPT_INTERVAL_MULT_MAX |
4 | Batas kelipatan interval dasar |
| Scheduler | SCHED_MIN_SLEEP_MS |
10 | Clamp sleep loop minimum |
| Slow Alert | DEFAULT_SLOW_THRESHOLD_MS |
120.0 | Ambang ms dianggap lambat |
| Slow Alert | DEFAULT_SLOW_ALERT_STREAK |
3 | Streak lambat sebelum alert |
| Proc Watch | PROC_WATCH_POLL_IDLE_MS |
1200 | Delay fallback saat idle |
| Proc Watch | PROC_WATCH_POLL_ACTIVE_MS |
750 | Delay fallback saat ada perubahan |
| Pipe | PIPE_RECONNECT_MS |
2000 | Delay reconnect pipe gagal |
| Pipe | PIPE_IDLE_SLEEP_MS |
200 | Delay idle saat queue kosong |
| TCP | TCP_IDLE_SLEEP_MS |
200 | Delay idle send loop TCP |
| Buffers | PIPE_CMD_BUFFER |
1024 | Ukuran buffer baca command pipe |
| Buffers | TCP_HOST_MAX |
256 | Batas panjang hostname UTF-8 |
| Buffers | MODULE_ENUM_MAX |
1024 | Maks modul saat enumerasi IAT / signature |
| Buffers | PROCESS_ENUM_RESERVE |
1024 | Reserve vector snapshot proses |
| Buffers | WINDOW_TITLE_MAX |
256 | Buffer judul window overlay |
| Buffers | CHUNK_SIZE |
4096 | Ukuran chunk hashing integritas |
| Buffers | SIGNATURE_SCAN_MAX |
16MB | Batas maksimum bytes discan signature |
| Buffers | CAPTURE_MAX |
256 | Panjang capture stub syscall |
| CE Heuristic | CE_MIN_WIDTH |
400 | Minimum lebar window untuk evaluasi CE |
| CE Heuristic | CE_MIN_HEIGHT |
300 | Minimum tinggi window untuk evaluasi CE |
| CE Heuristic | CE_SCORE_THRESHOLD |
4 | Skor final memicu detection CE |
| CE Heuristic | CE_COOLDOWN_MS |
300000 | Cooldown global laporan CE |
| CE Heuristic | CE_REQ_LISTS |
2 | Jumlah minimal ListView child untuk +1 skor |
| CE Heuristic | CE_REQ_EDITS |
8 | Jumlah minimal Edit control untuk +1 skor |
| CE Heuristic | CE_UI_HITS_SCORE1 |
1 | Ambang UI hits pertama early stop (dipakai + pola lain) |
| CE Heuristic | CE_UI_HITS_SCORE2 |
2 | Ambang UI hits kedua early stop (skip sisa) |
| CE Heuristic | CE_EARLYSTOP_UI |
3 | Early-stop jika hits UI mencapai nilai ini + indikator lain |
| CE Heuristic | CE_EARLYSTOP_LISTS |
2 | Early-stop jika ListView sudah cukup & indikator lain kuat |
| CE Heuristic | CE_EARLYSTOP_EDITS |
6 | Early-stop jika Edit control banyak comb dengan indikator lain |
| Handle Scan | HANDLE_SCAN_COOLDOWN_MS |
10000 | Cooldown minimal antar enumerasi system handle |
| Handle Scan | HANDLE_SCAN_MAX_DUP |
32 | Batas laporan suspicious agar log tidak banjir |
| Correlation | CORR_WINDOW_MS |
60000 | Window ms event dikumpulkan untuk korelasi |
| Correlation | CORR_PRUNE_INTERVAL_MS |
5000 | Interval prune entri lama |
| Correlation | CORR_SCORE_THRESHOLD |
5 | Ambang skor jalur HookCorrelation |
| Correlation | CORR_TRIGGER_DISTINCT |
3 | Ambang distinct kategori jalur MultiSourceCorrelation |
| Correlation | CE_PARTIAL_SCORE |
2 | Bobot partial CE heuristic (< threshold final) |
| Correlation | SIG_PARTIAL_SCORE |
2 | Bobot partial signature (placeholder) |
| Correlation | EXT_HANDLE_SCORE |
3 | Bobot event external intrusive handle |
| Correlation | CORR_STATUS_SNAPSHOT_MS |
1500 | Interval evaluasi pasif minimal (non highPriority) |
| Correlation | CORR_DETECTION_COOLDOWN_MS |
10000 | Cooldown minimal sebelum kombinasi korelasi dikirim lagi |
Ubah nilai sesuai kebutuhan tanpa menyentuh modul lain; rebuild akan menerapkan semuanya.
SELFTESTmenjalankan satu siklusTick()semua detector secara serial dan mengembalikan durasi ms per nama.- Berguna untuk baseline performa / investigasi lag.
- User-mode only; tidak mencegah driver ring-0.
- Inline hook detection terbatas prolog awal.
- Hash .text sensitif terhadap patch OS (gunakan whitelist).
- Obfuscation channel bukan kriptografi kuat.
- Rate limit command global & cooldown risk command mencegah flood dasar; tidak menggantikan ACL pipe.
- Handshake autentikasi pipe (baru) mengurangi risiko spoof command / sniff sederhana.
Untuk menghindari proses asing langsung mengirim command atau membaca log, channel pipe sekarang mendukung handshake ringan berbasis shared key dan nonce:
Alur (client → server command pipe):
- Client membuka pipe dan mengirim:
HELLO <nonceCliHex>(nonceCliderivatif dariGetTickCount64()+ pointer internal) - Server membalas:
CHALLENGE <nonceSrvHex>(nonceSrvcampuran tick + handle pointer) - Client menghitung:
digest = SHA256( keyUtf8 + nonceCliHex + nonceSrvHex )(hex lower-case 64 char) dan mengirim:AUTH <digest> - Server validasi digest; jika cocok →
OK, jika tidak →FAILdan koneksi ditutup.
Setelah OK, client baru mengirim paket log normal (NONCE=...;...). Sebelum autentikasi selesai, queue pesan ditahan (tidak dikirim).
Fallback Legacy: (DINONAKTIFKAN DEFAULT) Sebelumnya, jika server menerima line pertama bukan HELLO, ia menganggap client lama dan langsung memproses line itu tanpa autentikasi. Sekarang strict default aktif (PIPE_HANDSHAKE_STRICT_DEFAULT = true), koneksi tanpa HELLO langsung ditolak. Aktifkan kembali mode lama hanya jika perlu rollback cepat dengan mengubah konstanta / command runtime (jika disediakan).
Shared Key Runtime:
- Nilai awal diambil dari
Config::PIPE_SHARED_KEYsaat start. - Dapat diganti runtime melalui command baru:
PIPE_SET_SHARED_KEY <plain_utf8_key>(tidak disimpan ke policy; rotasi ephemeral). - Manajer:
SharedKeyManagermenyimpan key dalam UTF-8 (mutex-protected) dipakai saat menghitung digest handshake.
Pertimbangan Keamanan Tambahan:
- Gunakan ACL/SDDL pada named pipe di server final untuk membatasi siapa bisa connect (handshake bukan substitusi penuh ACL).
- Ganti RNG nonce menjadi
BCryptGenRandomuntuk entropi lebih kuat bila diperlukan. - Tambahkan rate limit terhadap kegagalan handshake (drop setelah N gagal berturut dalam window pendek).
- Pertimbangkan HMAC per pesan (misal
|H=<sha256(key+payload)>) jika channel dianggap hostile.
Command Baru:
PIPE_SET_SHARED_KEY <key_utf8>
PIPE_HANDSHAKE_STRICT_ON
PIPE_HANDSHAKE_STRICT_OFF
PIPE_HMAC_ON
PIPE_HMAC_OFF
Respon: INFO|RESULT|PIPE_SET_SHARED_KEY OK bila sukses.
Catatan Implementasi:
- Digest diserialisasi hex lower-case.
- Key kosong diabaikan (tidak mereset ke string kosong untuk mencegah degradasi keamanan tidak sengaja).
- Handshake timeout:
PIPE_HANDSHAKE_TIMEOUT_MS(default 3000 ms) untuk masing-masing fase baca. - Jika handshake gagal: server kirim
FAIL, menutup handle; client menutup pipe dan retry setelahPIPE_RECONNECT_MS.
Fitur Tambahan Baru:
- Strict mode (
PIPE_HANDSHAKE_STRICT_ON): menolak klien tanpaHELLO. SEKARANG DEFAULT ON (PIPE_HANDSHAKE_STRICT_DEFAULT = true), sehingga fallback legacy non-handshake tidak diterima kecuali Anda override. - Rate limiting gagal handshake: dalam window
PIPE_HANDSHAKE_FAIL_WINDOW_MSjika gagal ≥PIPE_HANDSHAKE_FAIL_MAX, penalti sleepPIPE_HANDSHAKE_PENALTY_MSditerapkan sebelum menerima koneksi baru (memperlambat brute-force digest). - RNG nonce memakai
BCryptGenRandom(fallback ke kombinasi tick+pointer bila gagal) di kedua sisi (client & server) untuk meningkatkan entropi. - HMAC payload opsional: bila diaktifkan (
PIPE_HMAC_ON), setiap payload log sebelum CRC/XOR ditambahkan suffix|H=<sha256(key+payload_plain)>. Verifikasi sisi server saat ini belum diterapkan (mode satu arah untuk anti-tamper ringan). Aktifkan setelah memastikan panjang pesan tidak melebihi batas pipeline parsing Anda. - Migrasi hashing internal dari CryptoAPI (Wincrypt) ke CNG (
BCrypt*) untuk konsistensi modern, mengurangi overhead context acquire per hash, dan mempermudah adopsi algoritma lanjutan (misal SHA-512 atau KDF) tanpa refactor besar.
Format Paket Saat HMAC Aktif:
NONCE=xxxxxxxx;NONCRC|FIELD1|FIELD2|...|H=64hex[|CRC=XXXXXXXX]
Urutan Transformasi:
- Bangun payload log dasar (sudah disanitasi)
- (Opsional) Tambah
|H=jika HMAC ON - (Opsional) Tambah
|CRC=jika CRC ON - (Opsional) Rolling XOR seluruh bagian setelah header
NONCE=...;
Verifikasi Server (Future Work):
- Tambah parsing trailing
|H=setelah de-obfuscate & sebelum gunakan isi. - Validasi dengan key runtime; mismatch → drop / flag tamper.
(Update 2025-09-16) Implementasi dasar verifikasi HMAC server sudah ditambahkan di
PipeServer.cppdengan fallback langsung memakai shared key (belum derivasi session nonce). Jika|H=ada, server recomputesha256(key+payload_without_H)dan drop bila mismatch. Flag baruPIPE_HMAC_REQUIRED_DEFAULTdisiapkan diConfig.h(sisi client) untuk memudahkan enforce mode; saat ini server contoh masihhmacRequired=false(hard-coded) — ubah sesuai kebutuhan operasi. Tahap berikut: derivasi session key:sessionKey = SHA256(sharedKeyUtf8 + nonceCliHex + nonceSrvHex)dipakai untuk HMAC sehingga shared key statis tidak langsung terekspos via analisis pola. Replay guard (nonce) telah ditambahkan di server contoh: setiapnonce(8 hex dari headerNONCE=) dilacak dalam windowPIPE_REPLAY_WINDOW_MSdengan batas cachePIPE_REPLAY_CACHE_MAX; duplikat dalam window ditandai[REPLAY]dan dibuang. Session Key (Log Channel): Server melakukan handshake HELLO/CHALLENGE/AUTH untuk channel log (bukan hanya command). Setelah validasi digest (SHA256(sharedKey + nonceCli + nonceSrv)), diturunkansessionKey = SHA256(sharedKey + nonceCli + nonceSrv)yang digunakan menggantikan shared key dasar saat verifikasi HMAC payload. Legacy klien tanpa HELLO TIDAK lagi diterima karena strict default aktif.
Parameter Baru di Config.h:
| Konstanta | Deskripsi |
|---|---|
PIPE_HANDSHAKE_STRICT_DEFAULT |
Default strict mode (false = masih izinkan legacy) |
PIPE_HANDSHAKE_FAIL_WINDOW_MS |
Window perhitungan gagal handshake |
PIPE_HANDSHAKE_FAIL_MAX |
Ambang gagal sebelum penalti |
PIPE_HANDSHAKE_PENALTY_MS |
Lama penalti sleep tambahan |
PIPE_HMAC_DEFAULT_ENABLED |
HMAC payload aktif (default false) |
PIPE_HMAC_REQUIRED_DEFAULT |
Server mewajibkan HMAC (default false) |
PIPE_REPLAY_WINDOW_MS |
Window waktu nonce dianggap valid untuk anti-replay |
PIPE_REPLAY_CACHE_MAX |
Maksimum entri cache nonce sebelum eviksi sederhana |
Roadmap Opsional:
- Komando persist key ke policy terenkripsi (belum ada).
- Strict mode: tolak legacy tanpa HELLO.
- Replay guard: cache pasangan nonce (client+server) untuk mencegah reuse dalam window singkat.
- Penggabungan digest handshake ke header paket (nonce+HMAC) agar setiap pesan terikat pada sesi.
Setiap sesi pipe sekarang diberi sessionId 128-bit (hex) yang dihasilkan secara kriptografis pada saat handshake sukses.
Karakteristik:
- Format: 32 hex lowercase (128-bit RNG via
BCryptGenRandom, fallback entropy jika gagal). - Dikirim ke klien di baris handshake:
OK HMAC SESSIONID=<hex>atauOK SESSIONID=<hex>. - Otomatis ditambahkan ke setiap event JSON
SecEventsebagai field:"sessionId":"<hex>"(kecuali sebelum handshake selesai / legacy path). - Muncul di output
#DUMP STATE(evt":"STATE") untuk korelasi alat observasi. - Tidak digunakan sebagai key kriptografi; murni identitas korelasi / forensic timeline.
Manfaat:
Empat modul inti OS yang dimonitor (ntdll.dll, kernel32.dll, user32.dll, gdi32.dll) kini memiliki command operasi untuk inspeksi status integritas, rebaseline manual, dan verifikasi on-demand tanpa menunggu interval scheduler.
| Command | Deskripsi | Argumen | Output Utama |
|---|---|---|---|
INTEGRITY_STATUS |
Status ringkas seluruh modul (plain text) | - | Line tunggal per semua modul disatukan |
INTEGRITY_STATUS_JSON |
Status terstruktur (JSON satu line) | - | Objek JSON berisi 4 key modul |
INTEGRITY_REBASELINE <mod|ALL> |
Paksa tangkap baseline baru (manual) | Nama modul atau ALL | RESULT per modul OK/FAIL |
INTEGRITY_VERIFY <mod|ALL> |
Hash .text saat ini vs baseline (tanpa rebaseline) |
Nama modul atau ALL | RESULT per modul OK/FAIL |
Modul bisa disebut dengan / tanpa .dll (otomatis ditambah). ALL menjalankan perintah keempat modul berurutan.
Field yang diekspor di INTEGRITY_STATUS_JSON (semua numerik kecuali timestamp):
| Field | Arti |
|---|---|
baselineLoadsOk |
Jumlah load / capture baseline sukses (persisted atau fresh) |
hmacMismatch |
Baseline dibuang karena HMAC tidak cocok (indikasi tamper) |
rebaselineCount |
Total baseline baru (manual + auto whitelist) |
manualRebaselineCount |
Subset rebaseline yang dipicu operator (INTEGRITY_REBASELINE) |
chainAdvanceCount |
Jumlah kali HMAC lama dipindah ke rantai (chained baseline) |
autoWhitelistCount |
Auto rebaseline karena seluruh delta chunk = disk bersih |
verifyNowRequests |
Panggilan INTEGRITY_VERIFY |
forceVerifyFailures |
Verifikasi on-demand gagal (mismatch) |
totalChunks |
Jumlah chunk .text pada baseline terbaru |
whitelistedChunks |
Snapshot banyak chunk di whitelist runtime |
hmacValid |
1 bila baseline aktif lulus verifikasi HMAC |
chainDepth |
Panjang rantai HMAC (1 = hanya current, 2 = current+prev) |
lastBaselineTime |
ISO8601 UTC baseline / rebaseline terakhir (manual / auto) |
lastAutoWhitelistTime |
Waktu terakhir auto-whitelist rebaseline |
lastManualRebaselineTime |
Waktu terakhir perintah manual rebaseline |
Nilai timestamp bisa kosong ("") bila belum pernah terjadi event terkait.
Plain text (INTEGRITY_STATUS):
ntdll.dll bl=3 hm=0 rb=2 (man=1) aw=1 vfy=4 vfFail=0 wl=12/128 hmac=OK chain=2 | kernel32.dll bl=3 hm=0 rb=1 (man=0) aw=1 vfy=2 vfFail=0 wl=5/96 hmac=OK chain=1 | user32.dll bl=2 hm=0 rb=1 (man=1) aw=0 vfy=1 vfFail=0 wl=0/110 hmac=OK chain=1 | gdi32.dll bl=2 hm=0 rb=1 (man=0) aw=1 vfy=1 vfFail=0 wl=0/104 hmac=OK chain=1
JSON (INTEGRITY_STATUS_JSON diringkas, satu line real):
{"ntdll.dll":{"baselineLoadsOk":3,"hmacMismatch":0,"rebaselineCount":2,"manualRebaselineCount":1,"chainAdvanceCount":1,"autoWhitelistCount":1,"verifyNowRequests":4,"forceVerifyFailures":0,"totalChunks":128,"whitelistedChunks":12,"hmacValid":1,"chainDepth":2,"lastBaselineTime":"2025-09-16T12:34:10Z","lastAutoWhitelistTime":"2025-09-16T12:33:50Z","lastManualRebaselineTime":"2025-09-16T12:34:10Z"},"kernel32.dll":{...},"user32.dll":{...},"gdi32.dll":{...}}- Manual (
INTEGRITY_REBASELINE) selalu meningkatkanmanualRebaselineCountdan mengisilastManualRebaselineTime. - Auto rebaseline hanya terjadi jika SEMUA delta chunk yang bukan whitelist cocok dengan hash chunk disk
(=disk). Jika satu saja(!disk), proses detection normal (exit) berjalan. - Keduanya meningkatkan
rebaselineCountdan memperbaruilastBaselineTime.
Jika INTEGRITY_CHAIN_BASELINE_DEFAULT aktif dan baseline lama memiliki HMAC valid, HMAC lama disalin sebagai prevChain saat baseline baru dibuat. Ini menambah lineage sehingga injeksi baseline baru tanpa jejak lebih sulit.
chainDepth = 1 berarti hanya baseline aktif; =2 berarti baseline saat ini + satu link sebelumnya (implementasi saat ini tidak menyimpan lebih dari 1 link historis untuk footprint ringkas).
INTEGRITY_VERIFY <mod> menghitung hash .text modul saat ini dan membandingkan dengan baseline tanpa memicu rebaseline. Kegagalan (mismatch) menambah forceVerifyFailures (indikasi potensi racing patch / injeksi) – keputusan lanjutan (terminate / escalate) dapat dihubungkan ke pipeline detection lain.
- Setelah patch Windows → jalankan klien dengan
MODSEC_AUDIT=1beberapa menit. - Pantau
INTEGRITY_STATUS_JSONuntuk modul denganautoWhitelistCountbertambah. - Review delta log awal (jika ada) → persist whitelist range ke policy permanen bila stabil.
- Jalankan
INTEGRITY_REBASELINE ALLuntuk menutup chain dan memperbarui timestamp. - Kembali ke mode normal (tanpa
MODSEC_AUDIT).
hmacMismatch > 0segera investigasi: baseline file bisa rusak / dimodifikasi.forceVerifyFailuresbertambah tanpa rebaseline sah → indikator race benign vs malicious patch; pertimbangkan memperketat interval check atau escalate ke kill.whitelistedChunks/totalChunksterlalu besar (misal >25%) → evaluasi ulang whitelist; potensi over-whitelisting menurunkan sensitivitas.
- Jangan jalankan
INTEGRITY_REBASELINEsembarang di environment produksi tanpa audit log; baseline poisoning bisa menyembunyikan patch injeksi sementara. - Gunakan chaining + HMAC HWID untuk mitigasi baseline copy-replay antar mesin.
| Item | Status | Catatan |
|---|---|---|
| Export manual rebaseline reason | Planned | Argumen opsional di command |
| Multi-link chain >2 | Planned | Perlu format baseline v3 |
| Policy persist baseline HMAC | Exploratory | Untuk offline attestation |
| Server side integrity mirror | Planned | Kirim status periodik ke server pusat |
| Built-in telemetry export (TCP) | Selesai (basic) | INTSTAT|{...} push via TcpClient |
Dengan command ini operasional anti-cheat dapat melakukan inspeksi cepat & tindakan korektif tanpa rebuild / redeploy.
Fitur opsional untuk mengirim snapshot JSON integritas ke server pusat secara periodik memakai koneksi TCP bawaan (TcpClient).
Format frame terbaru (sementara plaintext):
INTSTAT|sid=<32hex>|seq=<n>|{jsonSnapshot}[|X=<hmacHex64>|ALG=hmac256]\n
Keterangan:
sid: 128-bit random (hex 32) di-generate sekali per sesi eksport.seq: counter increment per frame (mulai dari 1). Dipakai server untuk deteksi out-of-order / replay.- Bagian JSON sama dengan output
INTEGRITY_STATUS_JSON(empat modul sebagai key). - HMAC opsional:
X=berisi HMAC-SHA256 (64 lowercase hex) atas seluruh payload sebelum|X=(termasuk sid & seq). Tag algoritma saat iniALG=hmac256.
Aktivasi Runtime:
INTEGRITY_EXPORT_ON
INTEGRITY_EXPORT_INTERVAL 15000 # ms
INTEGRITY_EXPORT_NOW # push segera (tidak mempengaruhi jadwal berikutnya)
INTEGRITY_EXPORT_OFF
INTEGRITY_EXPORT_STATUS # tampilkan state & interval
TCP_CLIENT_START 203.0.113.10 9000
TCP_CLIENT_STOP
Konstanta:
| Konstanta | Default | Deskripsi |
|---|---|---|
INTEGRITY_EXPORT_ENABLED_DEFAULT |
false | Auto aktif awal jika true |
INTEGRITY_EXPORT_INTERVAL_MS_DEFAULT |
15000 | Interval push default (ms) |
INTEGRITY_EXPORT_MAX_JSON |
2048 | Batas panjang snapshot dipotong |
INTEGRITY_EXPORT_HMAC_ENABLED_DEFAULT |
false | Aktifkan penambahan |X=<hmac64>|ALG=hmac256 |
INTEGRITY_EXPORT_HMAC_REQUIRE_DEFAULT |
false | Wajibkan frame memiliki |X= (kalau gagal generate: frame dibatalkan) |
INTEGRITY_EXPORT_TLS_ENABLED_DEFAULT |
false | Placeholder untuk future TLS |
Catatan Implementasi:
- Adapter detector
IntegrityExportdi scheduler memanggilTick()tiap 1s; hanya mengirim bila interval terlampaui & fitur enabled. - JSON isi identik struktur dengan
INTEGRITY_STATUS_JSON(field sama) sehingga backend bisa reuse parser. - Payload dipotong bila melebihi batas (fail-safe agar tidak flood karena bug penambahan field besar).
- Koneksi TCP harus sudah diinisialisasi via
TcpClient::Start()(pastikan host/port dipanggil dari integrasi Anda—placeholder belum ditambahkan per sample ini bila host dinamis).
Integrasi Backend:
- Listeni newline-delimited frames.
- Filter prefix
INTSTAT|(abaikan baris lain seperti log biasa). - Parse sisa sebagai JSON; index per modul.
- Alert jika
hmacMismatch > 0atau lonjakan tiba-tibaautoWhitelistCount.
Roadmap Lanjutan (update):
| Fitur | Status | Catatan |
|---|---|---|
| Transport control via commands | Selesai | START/STOP, interval, status |
| HMAC-SHA256 envelope | Selesai | CNG HMAC 64 hex + ALG tag |
| Session id + sequence | Selesai | Anti replay / korelasi server |
| Key rotation manual & interval | Selesai | Random 32B → hex 64 |
| TLS / mTLS koneksi telemetry | Skeleton | Abstraksi siap (transport interface) |
| Delta-only snapshot | Planned | Optimisasi bandwidth |
| Buffering offline & resend | Planned | Saat koneksi drop |
| Compression (opsional) | Planned | Setelah TLS (negotiation) |
| Server side anomaly scoring | Planned | Sequence gap / hmac fail weighting |
| Multi-endpoint failover | Planned | Redundansi collector |
Implementasi saat ini: HMAC-SHA256 (Windows CNG) atas substring sebelum |X= (seluruh header + JSON). Hasil 32 byte → 64 hex lowercase.
Fallback: Jika HMAC gagal (misal CNG error) dan require=OFF, akan fallback ke truncated hash lemah dengan ALG=weak. Jika require=ON, frame dibatalkan dan error di-log.
Contoh frame:
INTSTAT|sid=3e7f4a2d9b6c412e8d90bc7711fa55d1|seq=5|{"ntdll.dll":{"baselineLoadsOk":1,...}}|X=2f0d9a2a...c5d0|ALG=hmac256
Runtime Commands (export & security):
INTEGRITY_EXPORT_ON
INTEGRITY_EXPORT_OFF
INTEGRITY_EXPORT_INTERVAL <ms>
INTEGRITY_EXPORT_NOW
INTEGRITY_EXPORT_STATUS # tampilkan interval, hmac on/off, require, rotasi
INTEGRITY_EXPORT_SET_KEY <utf8_key> # set manual key (plaintext utf8)
INTEGRITY_EXPORT_ROTATE_KEY # generate random 32B → hex 64 dan pakai segera
INTEGRITY_EXPORT_ROTATE_INTERVAL <ms> # auto-rotate periodik (>=1000ms; 0 untuk off)
INTEGRITY_EXPORT_HMAC_ON / OFF
INTEGRITY_EXPORT_HMAC_REQUIRE_ON / OFF
INTEGRITY_EXPORT_TLS_ON / OFF # skeleton (belum enkripsi)
TCP_CLIENT_START <host> <port>
TCP_CLIENT_STOP
File: server_example/TelemetryServer.cpp
Build cepat (Developer Command Prompt VS / x64 Native Tools):
cl /EHsc server_example\TelemetryServer.cpp /Fe:TelemetryServer.exe ws2_32.libJalankan:
TelemetryServer.exe 0.0.0.0 9000 SECRET_KEY_123Server (versi baru) akan log: sid=<sid> seq=<n> hmac=OK alg=hmac256 order=OK drops=0 raw=<frame>.
Deteksi server:
hmac=FAIL→ potensi manipulasi / key mismatch / replay modifikasi.order=OUT→ out-of-order atau replay (cekdropscounter per sid).- Gap besar seq → kehilangan frame (network loss) atau filtering.
Rekomendasi manajemen key:
- Set key awal via pipeline command setelah koneksi aman.
- Aktifkan rotasi interval (misal 300000 ms = 5 menit) bila overhead koordinasi server siap.
- Sinkronisasi key ke server: gunakan channel terpisah (pipe) atau protokol TLS dengan rekey handshake (belum diimplement di sample).
Saat ini hanya ada abstraksi transport (ITelemetryTransport) + implementasi PlainTelemetryTransport. Command INTEGRITY_EXPORT_TLS_ON hanya men-set flag (belum mengganti transport). Langkah lanjutan:
- Tambah kelas
TlsTelemetryTransport(Schannel) dengan state credential + context. - Ganti pointer transport di
TcpClientsaatUseTls(true)sebelum koneksi. - Validasi sertifikat: pin public key hash SHA-256 atau CA internal.
- (Opsional) mutual TLS: server validasi client cert untuk anti impersonation.
- Rekey periodik / session ticket reuse (optimisasi handshake).
- Korelasi multi-log (server console, collector eksternal) ke satu sesi koneksi.
- Investigasi insiden (misal banyak
HMAC_FAIL→ tahu sesi mana tanpa perlu hashing ulang nonce).
Catatan: event handshake / state JSON belum diimplement karena plaintext; akan relevan setelah TLS & kontrol reliabilitas ditambah.
Integrasi Klien:
- Simpan
sessionIdpada penerimaan handshake untuk tagging log lokal atau channel lain. - (Opsional) kirim ulang di jalur command terpisah untuk audit silang.
Keamanan:
- Tidak rahasia; jangan gunakan menggantikan token auth.
- Jangan masukkan ke HMAC source kecuali ingin mengikat payload ke sesi secara eksplisit (dapat ditambahkan di fase lanjutan).
Langkah Lanjut Potensial:
- Rotasi sessionId jika inactivity > X atau setelah N pesan.
- Tambah event
SESSION_ROTATE. - Tambah rate-limit keyed by sessionId.
Untuk mencegah banjir log saat kondisi abnormal (misal banyak paket invalid atau replay), sistem menambahkan rate limiting pada subset event keamanan.
Event yang Saat Ini Di-rate-limit:
HMAC_FAILREPLAY_DROPSEQ_FAILSEQ_WARNSEQ_GAP
Algoritma:
- Sliding window durasi
SEC_EVT_RATE_WINDOW_MS(default 5000 ms) per jenis event. - Jika jumlah event dalam window melewati
SEC_EVT_RATE_THRESHOLD(default 25) → mode suppress aktif untuk jenis itu. - Saat suppress aktif, event asli dibuang (tidak dicetak) dan counter suppressed bertambah.
- Ketika jumlah dalam window turun <= (threshold *
SEC_EVT_RATE_RESUME_PCT/ 100) → sistem mengeluarkan ringkasan dan keluar dari suppress mode.
Event Tambahan yang Dihasilkan:
RATE_SUPPRESS_START: menandakan mulai menahan jenis event target.RATE_SUPPRESS_SUMMARY: ringkasan jumlah event yang ditahan selama fase suppress.
Contoh (disederhanakan):
{"evt":"RATE_SUPPRESS_START","tick":123456,"sessionId":"...","target":"HMAC_FAIL","countWindow":"26"}
{"evt":"RATE_SUPPRESS_SUMMARY","tick":123980,"sessionId":"...","target":"HMAC_FAIL","suppressed":"340"}Konfigurasi (di Config.h):
| Konstanta | Deskripsi |
|---|---|
SEC_EVT_RATE_WINDOW_MS |
Panjang window sliding (ms) |
SEC_EVT_RATE_THRESHOLD |
Ambang jumlah event sebelum suppression mulai |
SEC_EVT_RATE_RESUME_PCT |
Persentase ambang turun untuk keluar suppression |
#DUMP STATE kini menyertakan snapshot ringkas status rate limiting:
rl_active: Jumlah event type yang saat ini berada dalam fase suppression.rl: Array objek per event yang pernah muncul sejak start (atau sejak pertama kali event muncul) dengan kolom:evt: Nama event (disanitasi, hanya alnum +_).suppress:1jika sedang suppress, else0.window: Jumlah event yang masih berada dalam sliding window (ukuran deque stempel waktu).suppressed: Jumlah event yang telah ditahan selama fase suppress aktif sekarang (reset ke 0 saat suppression berakhir atau belum pernah suppress).
Contoh potongan STATE (dipadatkan):
{"evt":"STATE","tick":1300455,"sessionId":"9f2c...1130","hmacRequired":"1","seqEnforce":"1","hasSeqBaseline":"1","lastSeq":"42","replayCache":"5","c_HANDSHAKE_OK":"1","c_STATE_DUMP":"2","rl_active":"1","rl":[{"evt":"HMAC_FAIL","suppress":"1","window":"37","suppressed":"12"},{"evt":"SEQ_WARN","suppress":"0","window":"3","suppressed":"0"}]}Catatan:
- Event type hanya muncul di array setelah minimal satu kejadian tercatat.
windowbisa lebih kecil dari total kumulatif karena entri lama keluar dari sliding window.suppressedhanya meningkat selamasuppress=1.- Setelah suppression berakhir dan bucket kembali normal,
suppressedreset ke0pada snapshot berikutnya. totalSuppadalah total kumulatif suppressed sejak start (tidak direset ketika fase suppression berakhir, hanya reset oleh RLRESET).
Selama koneksi aktif (dan melewati syarat HMAC bila diaktifkan), server mendukung penyesuaian parameter rate limit tanpa restart melalui #SET:
#SET RTHRESH=<N>: Ubah ambang jumlah event sebelum suppression. Valid 1 .. 100000.#SET RWINMS=<MS>: Ubah panjang window sliding (ms). Valid 100 .. 600000.#SET RRESUME=<PCT>: Ubah persentase threshold untuk resume (resume ketika jumlah dalam window <= (threshold * pct / 100)). Valid 1 .. 99.#SET RLRESET=1: Reset seluruh bucket rate limiting (menghapus histori window dan suppression counters).
Setiap perubahan menghasilkan event CFG_SET dengan key salah satu dari RTHRESH|RWINMS|RRESUME.
Jika nilai tidak valid → CFG_DENY dengan reason=RANGE.
STATE kini juga mengekspor 3 field konfigurasi terkini:
rl_thr: Threshold aktif sekarang.rl_win: Window ms aktif sekarang.rl_resume: Persentase resume aktif sekarang.
Contoh modifikasi runtime:
#SET RTHRESH=40|H=<hmac>
#SET RWINMS=8000|H=<hmac>
#SET RRESUME=70|H=<hmac>
#DUMP STATE|H=<hmac>Cuplikan STATE setelah perubahan (disingkat):
{"evt":"STATE","rl_thr":"40","rl_win":"8000","rl_resume":"70", ... }Perintah RLRESET ketika dieksekusi akan:
- Menghapus semua bucket (histori window & status suppression).
- Menghasilkan event
RATE_RESETdengan field:buckets: jumlah bucket sebelum dihapus.totalSupp: akumulasi suppressed (lifetime) semua bucket sebelum reset.
Contoh event:
{"evt":"RATE_RESET","tick":1310001,"buckets":"2","totalSupp":"352"}Fitur ini (opsional) menulis setiap baris JSON SecEvent ke file .jsonl dengan rotasi berbasis ukuran untuk forensic / post-mortem analisis.
Status default: non-aktif (LOG_EVENT_PERSIST_ENABLED_DEFAULT=false). Aktifkan runtime via:
#SET LOGPERSIST=1|H=<hmac>Nonaktifkan kembali:
#SET LOGPERSIST=0|H=<hmac>- Basename:
SecEvents(konfigurasi:LOG_EVENT_FILE_BASENAME). - Format file:
SecEvents.<N>.jsonl(ring index 0 ..LOG_EVENT_MAX_ROTATIONS-1). - Ukuran max per file:
LOG_EVENT_MAX_BYTES(default 524288 bytes ≈ 512 KB). - Setelah melewati batas, indeks maju (mod rotasi) dan file baru di-truncate.
- Share mode read diizinkan untuk kolektor eksternal tailing.
- Field
logPersist:"1"jika mode persist aktif, else"0".
- Perubahan status menghasilkan
CFG_SETdengankey=LOGPERSIST. - File rotasi sendiri tidak memicu event tambahan (sederhana / low noise). Bisa ditambah di masa depan (misal
LOG_ROTATE).
- Aktifkan:
#SET LOGPERSIST=1|H=<hmac>→ muncul eventCFG_SET. - Jalankan beban / serangan simulasi → file
SecEvents.0.jsonlterisi. - Setelah ukuran ~512KB tercapai → pindah ke
SecEvents.1.jsonl. #DUMP STATE|H=<hmac>menampilkan"logPersist":"1".- Nonaktifkan:
#SET LOGPERSIST=0|H=<hmac>→ berhenti menulis, file tetap utuh.
- Tidak ada flush buffer eksplisit (mengandalkan CloseFile per write, I/O sync tapi overhead lebih tinggi).
- Belum ada timestamp resolusi tinggi (menggunakan
GetTickCountdi payload event seperti sebelumnya). - Belum ada kompresi / pemusnahan aman.
- Belum ada proteksi anti-tamper / signing log.
- Potensi peningkatan: event
LOG_ROTATE, hash chaining, CRC footer per file, background batching.
Detektor ini melakukan baseline hash section PE (ntdll.dll, kernel32.dll, user32.dll) dan memverifikasi periodik untuk mendeteksi patching runtime (inline hook massal, overwrites) yang tidak ter-cover penuh oleh prolog/IAT/EAT checker.
Rasional: Memberi sinyal coarse-grained bila ada perubahan besar pada section eksekusi/data yang menunjukan injeksi / loader abnormal.
- Tick pertama: enumerasi hingga
MEM_SEC_MAX_SECTIONSper modul. - Simpan: nama, RVA, ukuran, hash FNV32 sederhana (fase awal; bukan kripto).
- Setiap
MEM_SEC_INTEGRITY_INTERVAL_MSms: re-hash baseline section. - Perbedaan → event mismatch dan terminasi (fase 1 agresif, akan ditambah mode audit).
| Konstanta | Deskripsi |
|---|---|
MEM_SEC_INTEGRITY_INTERVAL_MS |
Interval pemeriksaan ulang |
MEM_SEC_MAX_SECTIONS |
Batas section yang direkam |
MEM_SEC_HASH_ALGO |
Placeholder nama algoritma (saat ini FNV32 internal) |
| Event | Arti |
|---|---|
ModuleSectionIntegrity BASELINE |
Baseline modul selesai |
ModuleSectionIntegrity MISMATCH |
Delta hash / kehilangan section ditemukan |
Contoh (disederhanakan):
[Detection] ModuleSectionIntegrity BASELINE mod=ntdll.dll sections=10
[Detection] ModuleSectionIntegrity MISMATCH mod=kernel32.dll deltas=[diff:.text]
- Hash mudah di-collide secara teoritis (bukan anti-tamper kuat).
- Tidak ada whitelist offset intra-section.
- Tidak validasi terhadap image disk segar.
- Mismatch langsung exit (false positive risk di beberapa environment hooking legitimate).
- Ganti ke SHA-256 truncated 64-bit.
- Tambah cross-check mapping disk (lihat pola
NtdllIntegrity). - Whitelist offset / rentang via policy.
- Mode audit-only dan escalation progresif.
Keterbatasan Saat Ini:
- Per-event type (tidak global agregat).
- Tidak ada prioritas (semua jenis di daftar diperlakukan sama).
- Tidak persist antar sesi.
Future Enhancement Ide:
- Mode adaptive (threshold naik/turun berdasar baseline rata-rata harian).
- Per-session dan global bucket terpisah.
- Integrasi dengan external metrics sink (emit delta suppressed per interval tetap).
- Sertakan embedded fallback policy.
- Sign DLL client.
- Atur ACL pipe (PRODUCTION) untuk batasi akses.
- Rotasi kunci XOR berkala.
- Simpan policy terenkripsi (opsional) & verifikasi signature.
- VS2022, C++17.
- Release Win32.
- Jalankan PipeServer & PipeCommandServer.
- Load DLL di game.
GET_STATUS(cek uptime, profiling bertambah).PROLOG_LISTvalid.- Patch byte dummy (simulasi) ? trigger detection.
- Tambah whitelist chunk ? simpan policy ? verifikasi tidak deteksi lagi.
SELFTESTdan periksa waktu eksekusi.
Suite test lama & harness telah dinetralkan dan tidak lagi dibangun. Sebagai gantinya tersedia self-check ringan opsional untuk memverifikasi komponen inti tanpa membuka permukaan kode uji lengkap.
Aktivasi:
Set environment variable sebelum proses host memuat DLL:
set OBLIVION_SELFTEST=1Saat DllMain (PROCESS_ATTACH), fungsi RunInternalSelfCheck() akan:
- Mengecilkan ring logger lalu mengisi >N entri untuk memastikan cap bekerja.
- Memverifikasi determinisme
Sha256HexLowerdan derivasi session key. - Mengirim ping log ke pipe jika pipe client sudah berjalan.
- Merekam hasil ke log Security (
LogSec).
Output ringkas: baris status [SC PASS]/[SC FAIL] di buffer log (dapat diambil via mekanisme snapshot / server log pipe).
Tidak Ada Coverage Untuk:
- Correlation scoring & cooldown.
- Scheduler exception resilience (hanya implicit melalui operasional biasa).
- Integrity hashing modul.
Ekstensi Rekomendasi (Opsional):
| Area | Ide Self-Check Tambahan |
|---|---|
| Replay Guard | Injeksi dua NONCE sama → pastikan kedua tidak diterima (butuh hook server) |
| HMAC | Bangun payload sintetis + recompute server-side hasil sama |
| Scheduler | Tambah dummy detector tick counter selama 100–200 ms |
| Correlator | Simulasi beberapa kategori event dan baca skor final |
Rollback: hapus OBLIVION_SELFTEST atau buang pemanggilan RunInternalSelfCheck() di dllmain.cpp.
Hanya untuk proteksi aplikasi Anda sendiri. Tidak untuk distribusi publik tanpa izin penulis.
Logger ditingkatkan dari sekadar OutputDebugString menjadi sistem multi-fitur:
- Level: Debug, Info, Warn, Error, Security.
- Ring buffer in-memory (default 256 entri) dapat di-snapshot untuk diagnosa atau test.
- File sink opsional (
EnableFileSink(path, append)) dengan append atau truncate. - Filter level dinamis (
SetLevel(LogLevel::Warn)menahan log level lebih rendah). - API kompatibel lama:
Log(L"msg")masih bekerja (mapped ke Info). - API baru:
LogDbg,LogWarn,LogErr,LogSec.
Contoh penggunaan:
using namespace OblivionEye;
LoggerBackend::Instance().SetLevel(LogLevel::Debug);
LoggerBackend::Instance().EnableFileSink(L"oblivioneye.log");
LogDbg(L"detector start");
LogSec(L"suspicious handle detected");Snapshot ring buffer (misal untuk diagnosa):
auto entries = LoggerBackend::Instance().Snapshot();
for (auto &e : entries) {/* dump / analyze */}Workflow GitHub Actions (.github/workflows/ci.yml) ditambahkan untuk:
- Build proyek
Oblivion_Tests(Debug x64) - Menjalankan executable test
- Memutus workflow (fail) jika exit code != 0
Trigger: push / PR ke branch main atau master, dan manual dispatch.
YAML ringkas:
name: CI
on: [push, pull_request]
jobs:
build-test-windows:
runs-on: windows-latest
steps:
- uses: actions/checkout@v4
- uses: microsoft/setup-msbuild@v2
- run: msbuild OblivionEye.sln /t:Oblivion_Tests /p:Configuration=Debug /p:Platform=x64 /m
- run: .\\x64\\Debug\\Oblivion_Tests.exeRencana lanjutan CI:
- Matrix build (x86 + Release)
- Artifact upload (log file, policy baseline)
- Static analysis (clang-tidy / CodeQL)
- Caching build (incremental) untuk percepatan. kontak ku : https://rathena.org/board/profile/24595-monyet/