首頁
社區(qū)
課程
招聘
Frida如何在內(nèi)部類中獲得外部類對象(如MainActivity.this)

比如有一個Android常見的語法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
class MainActivity extends AppCompatActivity{
    private void test(){
        Log.e("Test","Frida OuterClass");
    }
    @Override
    protected void onCreate(Bundle savedInstanceState){
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        this.findViewById(R.id.button1).setOnClickListener(new View.OnClickListener() {
             @Override
             public void onClick(View view) {
                  MainActivity.this.test();
             }
        });
    }

現(xiàn)在想要通過Frida,hook匿名內(nèi)部類(實質(zhì)上是內(nèi)部類)的onClick的方法,我嘗試了如下的錯誤方式并不能成功,所以請教一下,如何獲取上面代碼中的MainActivity.this對象,并調(diào)用test方法呢?(請寫出JS方法)

1
2
3
4
Java.use('com.example.app.MainActivity$a').onClick.implementation = function(){
    //如下方法是我在測試的時候嘗試的錯誤方法
    Java.use('com.example.app.MainActivity').this.test();
}

附:我還做過一些嘗試,通過Java.choose搜索堆中存在的MainActivity對象,然后再調(diào)用test方法,但是不知道為什么使用Java.choose方法一調(diào)用,APP就會閃退(這種情況只會出現(xiàn)在比較大的APP中),希望有大佬能順便指點一下,萬分感謝!

收藏
3條回答
wx_Sambty 2021-10-5

我想通了家人們.
剛剛我去翻了一下反編譯后的smali代碼,發(fā)現(xiàn)了內(nèi)部類MainActivity$a中存在一個屬性c2(具體名稱得翻smali代碼,可能每個都不一樣),結(jié)合Java虛擬機的知識,這應該就是內(nèi)部類中指向外部類的指針.
于是Frida腳本出來了

1
2
3
4
5
6
Java.use('com.example.app.MainActivity$a').onClick.implementation = function(){
    //如下方法是我在測試的時候嘗試的錯誤方法
    Java.use('com.example.app.MainActivity').this.test();
    //如下方法是有效的
    this.c2.value.test();
}
回復
wx_YwY 2021-10-27 2021-10-27編輯
1
2
3
4
5
6
7
8
Java.perform(function () {
    my_main_activity = Java.use("com.example.app.MainActivity$a");
    my_main_activity. onClick.overload().implementation = function () {
        Java.use('com.example.app.MainActivity').test()
res = this.onClick();
return res
    }
});
回復
kkandy 2023-9-12

內(nèi)部類只要不是靜態(tài),肯定有外部類的指針(對象)參數(shù)的

回復