4.2
Format Keluaran Hasil Pemindaian
APKLeaks menyimpan hasil pemindaian ke satu berkas keluaran. Flag --json memilih format, sedangkan -o memilih path berkasnya. Bila -o tidak diberikan, program membuat berkas sementara dengan prefix apkleaks- dan suffix .json atau .txt sesuai format. Berkas dibuka sekali di __init__, memakai mode w untuk JSON dan mode a untuk teks. apkleaks/apkleaks.py:33-341
Di sisi CLI, --json dideklarasikan sebagai store_true dan -o menerima type=str. apkleaks/cli.py:25-282 README menegaskan perilaku default: hasil juga disimpan dalam format teks, dan --json diperlukan untuk format JSON. README.md:79-843
Dua jalur penulisan
extract melayani dua jalur sekaligus. Pada format teks, setiap baris ditulis langsung ke self.fileout saat pemindaian berjalan. Pada format JSON, extract tidak menulis apa pun ke berkas (string kosong), dan hasil baru dikonversi menjadi teks JSON di cleanup.
graph LR
EX["extract(name, matches)"] --> TG["berkas teks<br/>mode a"]
EX --> OJ["out_json['results']"]
OJ --> CL["cleanup()"]
CL --> JF["berkas JSON<br/>mode w, indent=4"]
style EX fill:#f59e0b,color:#000
style TG fill:#2d7d46,color:#fff
style OJ fill:#8b5cf6,color:#fff
style CL fill:#f59e0b,color:#000
style JF fill:#336791,color:#fff
%% fig: Dua jalur keluaran dari extract ke berkas
%% desc: extract menulis baris teks secara bertahap atau menumpuk out_json, lalu cleanup menulis berkas JSON sekali di akhir.| Aspek | Teks polos (default) | JSON (--json) | Rujukan |
|---|---|---|---|
| Suffix berkas sementara | .txt | .json | apkleaks/apkleaks.py:33-341 |
| Mode buka berkas | a | w | apkleaks/apkleaks.py:33-341 |
| Waktu tulis | per kategori, saat extract berjalan | sekali, di cleanup | apkleaks/apkleaks.py:100-1154 |
| Header kategori | [<name>] | tidak ditulis | apkleaks/apkleaks.py:100-1154 |
| Baris hasil | - <secret> per match | {"name": ..., "matches": [...]} | apkleaks/apkleaks.py:100-1154 |
| Pemisah antar kategori | satu baris kosong | tidak ada | apkleaks/apkleaks.py:100-1154 |
Penulisan per kategori di extract
extract(name, matches) hanya bekerja bila len(matches) tidak nol. Header kategori dicetak ke stdout sebagai [name] dan ditulis ke berkas hanya ketika self.json is False. Setiap match dicetak sebagai - <secret> dengan cara yang sama, lalu satu baris kosong menutup kategori. Hasil yang sama selalu ditambahkan ke self.out_json["results"] sebagai objek {"name": name, "matches": matches}, dan self.scanned diubah menjadi True. apkleaks/apkleaks.py:100-1154
print(stdout) berjalan tanpa syarat format, jadi stdout tetap terisi penuh meskipun keluaran berkas dalam format JSON. Kerangka JSON disiapkan lebih dulu oleh scanning: out_json["package"] diisi self.apk.package dan out_json["results"] diisi list kosong sebelum thread pencarian dijalankan. apkleaks/apkleaks.py:121-1225
Pemfilteran match untuk kategori LinkFinder dan pewarnaan keluaran stdout dibahas di Mesin Pencarian Regex dan Keluaran Warna.
Siklus hidup cleanup dan flag scanned
cleanup() selalu menghapus self.tempdir lebih dulu, tanpa melihat apakah ada hasil. Setelah itu keputusan bergantung pada flag self.scanned, yang hanya bernilai True ketika minimal satu kategori menghasilkan match.
stateDiagram-v2
[*] --> Scanning
Scanning --> Scanned: extract menemukan match
Scanning --> NothingFound: semua match kosong
Scanned --> Saved: cleanup menulis json.dumps
NothingFound --> Deleted: cleanup menghapus berkas
Saved --> [*]
Deleted --> [*]
classDef ok fill:#2d7d46,color:#fff
classDef data fill:#8b5cf6,color:#fff
classDef bad fill:#dc2626,color:#fff
class Saved ok
class Scanned data
class Deleted bad
%% fig: Nasib berkas keluaran menurut flag scanned
%% desc: Bila scanned bernilai True berkas ditutup dan dilaporkan tersimpan, bila False berkas dihapus dan program melaporkan tidak ada hasil.Pada cabang scanned bernilai True, json.dumps(self.out_json, indent=4) ditulis ke berkas hanya ketika self.json benar, lalu fileout.close() dipanggil dan pesan ** Results saved into '...' dicetak. Pada cabang False, berkas ditutup, os.remove(self.output) menghapusnya, dan pesan ** Done with nothing. ¯\_(ツ)_/¯ dicetak. apkleaks/apkleaks.py:140-1496
Bentuk data JSON
Objek out_json hanya memuat dua kunci tingkat atas, dan setiap entri results memuat satu kategori beserta match-nya. apkleaks/apkleaks.py:121-1225
| Kunci | Tipe | Sumber nilai |
|---|---|---|
package | string | self.apk.package |
results | list | diinisialisasi kosong di scanning |
results[].name | string | nama kategori dari regexes.json |
results[].matches | list | hasil util.finder untuk kategori itu |
Satu kategori bisa menyumbang lebih dari satu entri results, karena scanning menjalankan extract per pola ketika nilai di regexes.json berupa list. Bentuk berkas pola itu sendiri diuraikan di Kumpulan Pola Pencarian. apkleaks/apkleaks.py:123-1387
⚠️ Format teks membuka berkas dengan mode
a. Bila-omenunjuk berkas yang sudah ada, hasil pemindaian baru menumpuk di belakang isi lama, bukan menimpanya. apkleaks/apkleaks.py:33-341
⚠️ Ketika tidak ada match,
os.remove(self.output)menghapus path yang diberikan lewat-o, bukan hanya berkas sementara. Jalankan dengan path keluaran yang memang disposable. apkleaks/apkleaks.py:140-1496