Frida - mengaitkan suatu fungsi di dalam suatu fungsi

Saya menjalankan Frida melalui skrip python di perangkat Android untuk mengubah fungsionalitas aplikasi. Saya mencoba menghubungkan suatu fungsi yang ada di dalam fungsi lain, tetapi saya tidak dapat menemukan cara untuk melakukannya. Di sini saya memberikan bagian dari kode relevan yang saya coba kaitkan:

public class ClockInActivity extends Activity {
...

  public void onCreate(Bundle savedInstanceState) {
    ...
  }

  public void btnClockIn(View view) {
    ...
    new AsyncTask<Void, Void, Integer>() {
        public java.lang.Integer doInBackground(java.lang.Void... r14) {
        ...
        }

        public void onPostExecute(Integer result) {
        ...
        }
    } 
  }
}

(Dimana… itu kode yang tidak relevan).

Saya ingin mencapai metode onPostExecute yang ada di dalam btnClockIn.

Kode python saya saat ini adalah seperti ini:

import frida, sys

jscript = """
Java.perform(function() {
console.log("Injection");
    var change = Java.use('MyApplicationName.ClockInActivity');
    
    change.btnClockIn.implementation = function()
    {   
        console.log("check");
     }
   });
  """

 process = frida.get_usb_device(1).attach("MyApplicationName")
 script1 = process.create_script(jscript)
 script1.load()

 sys.stdin.read()

Ceknya berfungsi dengan baik. Terima kasih untuk bantuannya!


person Yuval Mor    schedule 22.08.2020    source sumber
comment
Coba kaitkan AsyncClass seperti Java.use(android.os.AsyncTask).doInBackground.implementation   -  person morsisko    schedule 23.08.2020


Jawaban (1)


Metode onPostExecute bukan milik kelas MyApplicationName.ClockInActivity tetapi milik kelas dalam anonim. Kelas dalam anonim tidak memiliki nama sendiri, melainkan hanya memiliki nomor yang ditambahkan ke kelas tempat tinggalnya:

Oleh karena itu, kelas dalam anonim pertama di ClockInActivity memiliki nama MyApplicationName.ClockInActivity$1, untuk kelas dalam anonim kedua akan menjadi MyApplicationName.ClockInActivity$2 dan seterusnya.

Jika Anda ingin mendapatkan nama persis dari kelas dalam anonim, dekompilasi file APK menggunakan Jadx versi terbaru yang tidak stabil. Ini akan menunjukkan kepada Anda di komentar nama persis kelas dalam anonim (Anda memerlukan yang terbaru tidak stabil karena fitur ini ditambahkan setelah rilis terbaru 1.1.0).

Dengan asumsi bahwa AsyncTask yang ingin Anda kaitkan adalah kelas dalam anonim pertama, Anda harus menggunakan kode berikut:

    var change = Java.use('MyApplicationName.ClockInActivity$1');
    
    change.onPostExecute.implementation = function()
    {   
        console.log("check");
     }
   });
person Robert    schedule 23.08.2020