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

Kamu membaca versi lama. Halaman ini hanya bisa dibaca.

2.2

Siklus Hidup Objek APKLeaks

APKLeaks adalah objek berumur pendek. main() membuatnya satu kali lewat APKLeaks(args), menjalankan tiga fase di dalam blok try, lalu menaruh init.cleanup() di blok finally sehingga pembersihan tetap berjalan ketika salah satu fase memanggil sys.exit (apkleaks/cli.py:32-41). Seluruh atribut yang dipakai ketiga fase disiapkan di __init__ sebelum satu pun fase berjalan (apkleaks/apkleaks.py:26-38).

Status yang disimpan instance

Tabel berikut merangkum nilai awal setiap atribut dan bagian yang mengubahnya (apkleaks/apkleaks.py:26-38).

AtributNilai awalDiubah oleh
self.apkNoneintegrity() mengisinya dengan self.apk_info()
self.fileos.path.realpath(args.file)tidak berubah
self.jsonargs.jsontidak berubah
self.disargargs.argstidak berubah
self.prefix"apkleaks-"tidak berubah
self.tempdirtempfile.mkdtemp(prefix=self.prefix)diisi hasil dekompilasi jadx
self.main_diros.path.dirname(os.path.realpath(__file__))tidak berubah
self.outputhasil tempfile.mkstemp(...) atau args.outputtidak berubah
self.fileoutopen(self.output, "w" if json else "a")ditutup oleh cleanup()
self.patternconfig/regexes.json atau args.patterntidak berubah
self.jadxwhich("jadx") atau binary bawaan paketdependencies() mengatur izinnya lewat os.chmod
self.out_json{}scanning() mengisi package dan results
self.scannedFalseextract() menetapkan True

Hanya dua atribut yang berganti makna selama objek hidup. self.apk bergerak dari None menjadi instance APK pyaxmlparser lewat apk_info() (apkleaks/apkleaks.py:41-42, apkleaks/apkleaks.py:80), sedangkan self.scanned bergerak dari False menjadi True begitu extract() menemukan setidaknya satu match (apkleaks/apkleaks.py:115). self.out_json sudah memiliki kunci results sebelum pola pertama dipindai, sehingga extract() boleh langsung melakukan append (apkleaks/apkleaks.py:121-122).

Perpindahan status

stateDiagram-v2
    [*] --> Initialized
    Initialized --> IntegrityCheck : main memanggil init.integrity
    IntegrityCheck --> DownloadingJadx : jadx tidak ada dan pengguna menjawab y
    DownloadingJadx --> IntegrityCheck : dependencies selesai
    DownloadingJadx --> Aborted : exception saat unduh
    IntegrityCheck --> Aborted : jawaban n atau berkas bukan APK valid
    IntegrityCheck --> APKLoaded : self.apk = self.apk_info
    APKLoaded --> Decompiled : decompile menulis ke self.tempdir
    Decompiled --> Scanning : scanning dijalankan
    Scanning --> Scanning : satu thread per pola menjalankan extract
    Scanning --> Scanned : extract menetapkan self.scanned = True
    Scanning --> Empty : tidak ada match
    Scanned --> Cleanup : finally memanggil init.cleanup
    Empty --> Cleanup : finally memanggil init.cleanup
    Aborted --> Cleanup : finally memanggil init.cleanup
    Cleanup --> [*]
    classDef store fill:#336791,color:#fff
    classDef careful fill:#f59e0b,color:#000
    classDef derived fill:#8b5cf6,color:#fff
    classDef ok fill:#2d7d46,color:#fff
    classDef fail fill:#dc2626,color:#fff
    class Initialized,Cleanup store
    class IntegrityCheck,DownloadingJadx careful
    class APKLoaded,Decompiled,Scanning derived
    class Scanned ok
    class Empty,Aborted fail
%% fig: Siklus hidup instance APKLeaks
%% desc: Objek berpindah dari inisialisasi ke pemeriksaan dependensi, dekompilasi, pemindaian, lalu cleanup pada setiap jalur keluar.
Fig. 1: Siklus hidup instance APKLeaksObjek berpindah dari inisialisasi ke pemeriksaan dependensi, dekompilasi, pemindaian, lalu cleanup pada setiap jalur keluar.

Satu-satunya keadaan yang dapat berputar adalah IntegrityCheck. Bila self.jadx tidak ada, integrity() menanyakan unduhan, memanggil dependencies() yang mengambil jadx-1.2.0.zip, lalu memeriksa ulang berkas masukan sebelum memuat APK (apkleaks/apkleaks.py:55-87, apkleaks/apkleaks.py:44-53). Keadaan Aborted menampung tiga jalan keluar berbeda: jawaban n, berkas yang bukan APK valid, dan sys.exit dari dependencies() saat unduhan gagal — semuanya tetap melewati cleanup() (apkleaks/apkleaks.py:51-53, apkleaks/apkleaks.py:73-77, apkleaks/apkleaks.py:86-87).

scanning() menolak berjalan bila self.apk masih None, sehingga keadaan APKLoaded wajib dilalui sebelum Scanning (apkleaks/apkleaks.py:118-119).

Metode dan efeknya pada objek

MetodePrasyaratEfek pada objekRujukan
integrity()self.jadx dan self.filemengisi self.apk atau menghentikan prosesapkleaks/apkleaks.py:55-87
dependencies()dipanggil dari integrity()mengekstrak jadx lalu os.chmod(self.jadx, 33268)apkleaks/apkleaks.py:44-53
decompile()self.jadx adamenjalankan os.system dengan -d self.tempdirapkleaks/apkleaks.py:89-98
scanning()self.apk tidak Nonemengisi self.out_json dan memulai thread extractapkleaks/apkleaks.py:117-138
extract()dipanggil dari threadmenulis self.fileout dan menetapkan self.scannedapkleaks/apkleaks.py:100-115
cleanup()apa pun hasil fase sebelumnyamenghapus self.tempdir dan menutup self.fileoutapkleaks/apkleaks.py:140-149

Rincian argumen jadx dan perilaku util.finder dibahas di Dekomplikasi dan jadx serta Mesin Pemindaian Pola.

Artefak sementara dan berkas keluaran

graph LR
  init["APKLeaks.__init__()"] --> tempdir["self.tempdir: tempfile.mkdtemp"]
  init --> fileout["self.fileout: open(self.output)"]
  tempdir --> jadx["decompile(): jadx -d self.tempdir"]
  jadx --> finder["util.finder() membaca tempdir"]
  finder --> extract["extract() menulis hasil"]
  fileout --> extract
  extract --> flag["self.scanned = True"]
  flag --> cleanup["cleanup()"]
  cleanup --> rmtree["shutil.rmtree(self.tempdir)"]
  cleanup --> saved["berkas hasil dipertahankan"]
  cleanup --> removed["os.remove(self.output)"]
  style init fill:#f59e0b,color:#000
  style tempdir fill:#336791,color:#fff
  style fileout fill:#336791,color:#fff
  style jadx fill:#8b5cf6,color:#fff
  style finder fill:#8b5cf6,color:#fff
  style extract fill:#8b5cf6,color:#fff
  style flag fill:#2d7d46,color:#fff
  style saved fill:#2d7d46,color:#fff
  style cleanup fill:#f59e0b,color:#000
  style rmtree fill:#dc2626,color:#fff
  style removed fill:#dc2626,color:#fff
%% fig: Artefak yang lahir dan berakhir dalam satu siklus
%% desc: Konstruktor mengalokasikan tempdir dan berkas keluaran, lalu cleanup menghapus tempdir selalu dan berkas keluaran hanya pada jalur tanpa hasil.
Fig. 2: Artefak yang lahir dan berakhir dalam satu siklusKonstruktor mengalokasikan tempdir dan berkas keluaran, lalu cleanup menghapus tempdir selalu dan berkas keluaran hanya pada jalur tanpa hasil.

self.tempdir dan self.output adalah dua artefak yang lahir di __init__. tempdir menjadi direktori -d bagi jadx dan target pembacaan util.finder, sementara self.output dibuka sekali sebagai self.fileout dengan mode w bila --json dipakai dan a bila tidak (apkleaks/apkleaks.py:31-34, apkleaks/apkleaks.py:89-98).

cleanup() selalu menjalankan shutil.rmtree(self.tempdir), lalu bercabang pada nilai self.scanned. Pada cabang True, self.out_json di-json.dumps bila --json aktif, self.fileout ditutup, dan lokasi hasil dicetak. Pada cabang False, self.fileout ditutup dan self.output dihapus (apkleaks/apkleaks.py:140-149).

⚠️ Bila self.scanned masih False, os.remove(self.output) menghapus berkas keluaran. Karena berkas itu sudah dibuat di __init__ lewat tempfile.mkstemp atau dibuka lewat open(self.output, ...), berkas yang ditunjuk --output dan dibuka dengan mode a akan ikut terhapus ketika pemindaian tidak menemukan apa pun (apkleaks/apkleaks.py:33-34, apkleaks/apkleaks.py:146-148).

⚠️ scanning() memanggil thread.start() untuk setiap pola tanpa pernah join, sehingga cleanup() dapat menghapus self.tempdir dan menutup self.fileout selagi thread extract masih berjalan (apkleaks/apkleaks.py:129-130, apkleaks/apkleaks.py:140-149).

Urutan fase beserta pola yang dijalankan tiap thread dijelaskan di Alur Pemindaian.