Lompat ke konten
dokumentasi.id
Commit dd5271a
v2
Star6,4 rb

Kamu membaca versi lama. Halaman ini hanya bisa dibaca.

5.1

Kustomisasi Pola Sendiri

Pola pencarian dapat diganti seluruhnya lewat satu berkas JSON yang dikirim dengan opsi -p/--pattern (apkleaks/cli.py:26). 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:35). README mendokumentasikan opsi yang sama sebagai --pattern /path/to/custom-rules.json dan menyebut regexes.json sebagai pola bawaan (README.md:86-98).

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-98).

Bagian JSONTipe nilaiPerilaku di scanning
kunci aturanstrmenjadi name yang diteruskan ke extract dan muncul sebagai header hasil
nilai tunggalstrsatu thread menjalankan extract(name, util.finder(pattern, self.tempdir))
nilai berupa arraylistsatu thread per elemen, semuanya memakai name yang sama

Perbedaan cabang list dan non-list itu diputuskan oleh isinstance(pattern, list) (apkleaks/apkleaks.py:126-138). 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:114).

Perintah untuk menjalankannya menyertakan berkas kustom bersama APK target (README.md:100-104):

$ 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-124). 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-19).

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.
Fig. 1: Alur berkas pola kustom sampai ke hasilArgumen -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-31). Nilai baliknya adalah sorted(list(set(found))), sehingga duplikat di dalam satu aturan sudah dipangkas dan diurutkan sebelum sampai ke extract (apkleaks/utils.py:31). Galat saat membaca isi berkas ditelan oleh except Exception: pass, jadi berkas yang tidak dapat diurai dilewati tanpa pesan (apkleaks/utils.py:24-30).

Pola kustom menggantikan pola bawaan

scanning hanya membuka satu berkas, yaitu self.pattern (apkleaks/apkleaks.py:123-124). 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:35).

⚠️ Berkas kustom yang hanya memuat satu aturan mematikan seluruh pola lain, termasuk LinkFinder yang pada berkas bawaan berada di kunci tersendiri dengan regex panjang (config/regexes.json:38). Tanpa kunci bernama tepat LinkFinder, tidak ada ekstraksi URL dan endpoint sama 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-109): 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-109).

KeadaanPerilakuRujukan
len(matches) bernilai 0header, daftar isi, dan entri hasil tidak ditulis sama sekaliapkleaks/apkleaks.py:101-104
name == "LinkFinder" dan match cocok filtermatch dibuang, tidak masuk keluaran teksapkleaks/apkleaks.py:107-108
name == "LinkFinder" dan match lolos filterkutip di awal dan akhir string dipotongapkleaks/apkleaks.py:109
semua aturanmatches asli tetap disimpan ke out_json["results"]apkleaks/apkleaks.py:114

⚠️ Filter LinkFinder hanya memengaruhi keluaran teks. Daftar matches yang dikirim ke out_json["results"] adalah daftar sebelum penyaringan dan sebelum pemotongan kutip, sehingga keluaran --json dapat memuat lebih banyak entri daripada keluaran teks (apkleaks/apkleaks.py:114).

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-19). 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-98). 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.