Frida - เชื่อมต่อฟังก์ชันภายในฟังก์ชัน

ฉันใช้ Frida ผ่านสคริปต์ python บนอุปกรณ์ Android เพื่อเปลี่ยนฟังก์ชันการทำงานของแอปพลิเคชัน ฉันกำลังพยายามเชื่อมต่อฟังก์ชันที่อยู่ภายในฟังก์ชันอื่น แต่ฉันไม่สามารถหาวิธีในการทำเช่นนั้นได้ ฉันให้ส่วนหนึ่งของรหัสที่เกี่ยวข้องซึ่งฉันพยายามจะเชื่อมโยงที่นี่:

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) {
        ...
        }
    } 
  }
}

(อยู่ไหน...เป็นโค้ดที่ไม่เกี่ยวข้อง)

ฉันต้องการเข้าถึงวิธี onPostExecute ซึ่งอยู่ภายใน btnClockIn

รหัสหลามของฉันตอนนี้เป็นเช่นนี้:

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()

เช็คทำงานได้ดี ขอบคุณสำหรับความช่วยเหลือ!


person Yuval Mor    schedule 22.08.2020    source แหล่งที่มา
comment
ลองเชื่อมต่อ AsyncClass เช่น Java.use(android.os.AsyncTask).doInBackground.implementation   -  person morsisko    schedule 23.08.2020


คำตอบ (1)


เมธอด onPostExecute ไม่ได้อยู่ในคลาส MyApplicationName.ClockInActivity แต่เป็นของคลาสภายในที่ไม่ระบุชื่อ คลาสภายในที่ไม่เปิดเผยตัวตนไม่มีชื่อของตัวเอง แต่มีเพียงตัวเลขต่อท้ายคลาสที่อยู่ใน:

คลาสภายในที่ไม่ระบุชื่อตัวแรกใน ClockInActivity จึงมีชื่อ MyApplicationName.ClockInActivity$1 สำหรับคลาสภายในที่ไม่ระบุชื่อตัวที่สองจะเป็น MyApplicationName.ClockInActivity$2 และต่อๆ ไป

หากคุณต้องการได้รับชื่อที่แน่นอนของคลาสภายในที่ไม่ระบุตัวตนจะถอดรหัสไฟล์ APK โดยใช้ Jadx เวอร์ชันล่าสุดที่ไม่เสถียร มันจะแสดงให้คุณเห็นในความคิดเห็นถึงชื่อที่แน่นอนของคลาสภายในที่ไม่เปิดเผยตัวตน (คุณต้องมีไฟล์ที่ไม่เสถียรล่าสุดเนื่องจากฟีเจอร์นี้ถูกเพิ่มเข้ามาหลังจากรีลีสล่าสุด 1.1.0)

สมมติว่า AsyncTask ที่คุณต้องการเชื่อมต่อนั้นเป็นคลาสภายในที่ไม่ระบุชื่อตัวแรกที่คุณต้องใช้รหัสต่อไปนี้:

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