5.1
Kustomisasi Pola Sendiri
Pola pencarian dapat diganti seluruhnya lewat satu berkas JSON yang dikirim dengan opsi -p/--pattern (apkleaks/cli.py:261). Argumen itu disimpan di self.pattern: bila args.pattern bernilai None, nilainya diarahkan ke config/regexes.json, dan bila diisi, nilainya dipakai apa adanya tanpa validasi tambahan (apkleaks/apkleaks.py:352). README mendokumentasikan opsi yang sama sebagai --pattern /path/to/custom-rules.json dan menyebut regexes.json sebagai pola bawaan (README.md:86-983).
Bentuk berkas
Berkas kustom adalah satu objek JSON datar. Kuncinya adalah nama aturan, dan nilainya berupa satu regex atau daftar regex. README memberi contoh dengan kunci "Amazon AWS Access Key ID" dan nilai "AKIA[0-9A-Z]{16}" (README.md:92-984).
| Bagian JSON | Tipe nilai | Perilaku di scanning |
|---|---|---|
| kunci aturan | str | menjadi name yang diteruskan ke extract dan muncul sebagai header hasil |
| nilai tunggal | str | satu thread menjalankan extract(name, util.finder(pattern, self.tempdir)) |
| nilai berupa array | list | satu thread per elemen, semuanya memakai name yang sama |
Perbedaan cabang list dan non-list itu diputuskan oleh isinstance(pattern, list) (apkleaks/apkleaks.py:126-1385). Karena nama aturan dipakai berulang untuk setiap elemen array, satu aturan berisi lima regex menghasilkan lima entri terpisah dengan name identik di out_json["results"] (apkleaks/apkleaks.py:1146).
Perintah untuk menjalankannya menyertakan berkas kustom bersama APK target (README.md:100-1047):
$ apkleaks -f /path/to/file.apk -p rules.json -o ~/Documents/apkleaks-results.txt
Alur pemuatan pola
Berkas dibuka sekali di scanning lewat open(self.pattern) lalu diurai dengan json.load (apkleaks/apkleaks.py:123-1248). Setiap pasangan kunci-nilai kemudian dijalankan sebagai thread terpisah, dan setiap thread memanggil util.finder yang mengompilasi regex dengan re.compile(pattern) (apkleaks/utils.py:17-199).
graph TD
Arg["-p / --pattern"] --> Init["APKLeaks.__init__: self.pattern"]
Def["config/regexes.json"] -->|"args.pattern kosong"| Init
Init --> Scan["scanning"]
Scan --> Load["json.load(self.pattern)"]
Load --> Type{"isinstance pattern, list?"}
Type -->|"ya"| Each["for p in pattern"]
Type -->|"tidak"| Single["satu pola string"]
Each --> Spawn["threading.Thread target=extract"]
Single --> Spawn
Spawn --> Find["util.finder: re.compile + walk tempdir"]
Find --> Ext["extract name, matches"]
Ext --> LF{"name == LinkFinder?"}
LF -->|"tidak"| Out["tulis ke fileout"]
LF -->|"ya"| Filt["re.match filter ekstensi"]
Filt -->|"cocok"| Skip["continue: match dibuang"]
Filt -->|"lolos"| Strip["potong kutip di kedua ujung"]
Strip --> Out
Out --> Json["out_json results"]
style Arg fill:#f59e0b,color:#000
style Def fill:#f59e0b,color:#000
style Init fill:#f59e0b,color:#000
style Find fill:#8b5cf6,color:#fff
style Ext fill:#2d7d46,color:#fff
style Strip fill:#2d7d46,color:#fff
style Out fill:#336791,color:#fff
style Json fill:#336791,color:#fff
style Skip fill:#dc2626,color:#fff
%% fig: Alur berkas pola kustom sampai ke hasil
%% desc: Argumen -p menggantikan lokasi berkas pola default, lalu setiap pasangan kunci-nilai dijalankan sebagai thread yang memanggil util.finder dan extract, dengan cabang khusus untuk LinkFinder.util.finder menyisir seluruh berkas di direktori hasil dekompilasi baris per baris dan menyimpan mo.group() dari setiap baris yang cocok (apkleaks/utils.py:17-3110). Nilai baliknya adalah sorted(list(set(found))), sehingga duplikat di dalam satu aturan sudah dipangkas dan diurutkan sebelum sampai ke extract (apkleaks/utils.py:3111). Galat saat membaca isi berkas ditelan oleh except Exception: pass, jadi berkas yang tidak dapat diurai dilewati tanpa pesan (apkleaks/utils.py:24-3012).
Pola kustom menggantikan pola bawaan
scanning hanya membuka satu berkas, yaitu self.pattern (apkleaks/apkleaks.py:123-1248). Tidak ada pembacaan kedua ke config/regexes.json dan tidak ada operasi penggabungan kamus. Konsekuensinya: berkas kustom harus memuat semua aturan yang ingin dijalankan, karena pola bawaan tidak lagi aktif begitu -p dipakai (apkleaks/apkleaks.py:352).
⚠️ Berkas kustom yang hanya memuat satu aturan mematikan seluruh pola lain, termasuk
LinkFinderyang pada berkas bawaan berada di kunci tersendiri dengan regex panjang (config/regexes.json:3813). Tanpa kunci bernama tepatLinkFinder, tidak ada ekstraksi URL danendpointsama sekali.
Cabang LinkFinder di extract
Nama aturan LinkFinder diperlakukan istimewa. extract membandingkan name == "LinkFinder" secara literal, lalu menerapkan filter tambahan terhadap setiap match (apkleaks/apkleaks.py:106-10914): match yang cocok dengan re.match(r"^.(L[a-z]|application|audio|fonts|image|kotlin|layout|multipart|plain|text|video).*\/.+", secret) dilewati dengan continue, dan match yang lolos dipotong kutip pembuka serta penutupnya lewat secret[len("'"):-len("'")] (apkleaks/apkleaks.py:107-10915).
| Keadaan | Perilaku | Rujukan |
|---|---|---|
len(matches) bernilai 0 | header, daftar isi, dan entri hasil tidak ditulis sama sekali | apkleaks/apkleaks.py:101-10416 |
name == "LinkFinder" dan match cocok filter | match dibuang, tidak masuk keluaran teks | apkleaks/apkleaks.py:107-10817 |
name == "LinkFinder" dan match lolos filter | kutip di awal dan akhir string dipotong | apkleaks/apkleaks.py:10918 |
| semua aturan | matches asli tetap disimpan ke out_json["results"] | apkleaks/apkleaks.py:1146 |
⚠️ Filter
LinkFinderhanya memengaruhi keluaran teks. Daftarmatchesyang dikirim keout_json["results"]adalah daftar sebelum penyaringan dan sebelum pemotongan kutip, sehingga keluaran--jsondapat memuat lebih banyak entri daripada keluaran teks (apkleaks/apkleaks.py:1146).
Dua hal lain yang membatasi isi berkas kustom. Pertama, regex dikompilasi dengan re.compile di luar blok try pada finder, jadi pola dengan sintaks Python re yang tidak valid tidak ditangkap di sana (apkleaks/utils.py:17-199). Kedua, json.load dipanggil langsung tanpa penanganan galat di scanning, sehingga berkas harus JSON ketat; contoh di README yang memuat komentar // hanya ilustrasi bentuk (README.md:92-984). Untuk perilaku keluaran setelah pola dijalankan, lihat Format Keluaran Hasil Pemindaian; untuk mesin pencarian dan pewarnaan yang dipakai bersama, lihat Mesin Pencarian Regex dan Keluaran Warna.