首页
社区
课程
招聘
Frida如何在内部类中获得外部类对象(如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();
             }
        });
    }

现在想要通过Frida,hook匿名内部类(实质上是内部类)的onClick的方法,我尝试了如下的错误方式并不能成功,所以请教一下,如何获取上面代码中的MainActivity.this对象,并调用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对象,然后再调用test方法,但是不知道为什么使用Java.choose方法一调用,APP就会闪退(这种情况只会出现在比较大的APP中),希望有大佬能顺便指点一下,万分感谢!

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

我想通了家人们.
刚刚我去翻了一下反编译后的smali代码,发现了内部类MainActivity$a中存在一个属性c2(具体名称得翻smali代码,可能每个都不一样),结合Java虚拟机的知识,这应该就是内部类中指向外部类的指针.
于是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

内部类只要不是静态,肯定有外部类的指针(对象)参数的

回复