objection 常用指令

测试用例

测试用例结构比较简单。
请添加图片描述
主要代码都在 MainActivity 和 Car 中。SecondActivity、MainService、MyReceiver以及布局文件并无实效代码,就不予展示了。

package com.zyc.objectiondemo;

import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.Toast;

import androidx.appcompat.app.AppCompatActivity;

public class MainActivity extends AppCompatActivity implements View.OnClickListener {
    public static int CAR_COUNT = 0;
    private Button btnShow;
    private Button btnShow_int;

    private Car car1;
    private Car car2;
    private Car car3;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        btnShow = findViewById(R.id.btn_show);
        btnShow.setOnClickListener(this);
        btnShow_int = findViewById(R.id.btn_show_int);
        btnShow_int.setOnClickListener(this);

        car1 = new Car(1, "布加迪");
        car2 = new Car(2, "奔驰qqqaaa");
        car3 = new Car(3, "aaaqqq");
        CAR_COUNT = 3;
    }

    @Override
    public void onClick(View v) {
        switch (v.getId()) {
            case R.id.btn_show:
                Car tempCar1 = new Car(4);
                tempCar1.setName("Car4");
                String txt = tempCar1.show();
                Toast.makeText(this, txt, Toast.LENGTH_SHORT).show();
                break;
            case R.id.btn_show_int:
                Car tempCar2 = new Car(5,"Car5");
                String txt2 = tempCar2.show(989);
                Toast.makeText(this, txt2, Toast.LENGTH_SHORT).show();
                break;
        }
    }

    public void toastSelf() {
        Toast.makeText(this, "I'm MainActivity", Toast.LENGTH_SHORT).show();
    }
}
package com.zyc.objectiondemo;

public class Car {
    private int id;
    private String name;

    public Car(int id) {
        this.id = id;
    }

    public Car(int id, String name) {
        this.id = id;
        this.name = name;
    }

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String show() {
        return "id--> " + id + "\nname--> " + name;
    }

    public String show(int count) {
        return "id--> " + id + "\nname--> " + name + "\ncount--> " + count;
    }
}

运行 frida-server 后开启 objection 之旅:

objection -g com.zyc.objectiondemo explore

 

列出内存中加载的库

memory list modules
请添加图片描述
如果要把结果以json格式输出到本地可以在指令后添加参数,memory list modules --json /root/modules.json
请添加图片描述
 

列出某个库的导出函数

假设要列出 libssl.so 文件的导出函数,memory list exports libssl.so
请添加图片描述
该指令同样支持输出到json文件,memory list exports libssl.so --json /root/exports.json
请添加图片描述
 

搜索内存数据

在内存中通过字节串可以搜索数据,APP点击按钮创建带“aaaqqq”和“奔驰qqqaaa”字样的Car类后,想找到“aaaqqq”运行memory search "61 61 61 71 71 71",或者模糊搜索memory search "61 61 61 71"memory search "61 61 61 ?? ?? 71"
请添加图片描述
该指令貌似无法搜索出带中文的字符串
请添加图片描述
也可以增加参数通过字符串搜索,运行memory search "aaaqqq" --string,此方式不支持模糊搜索。
请添加图片描述
如果只展示搜索到的偏移地址,不需要展示附近内存,运行memory search "61 61 61 71 71 71" --offsets-only
请添加图片描述
 

写入内存数据

通过内存地址可以写入数据,比如搜索TextView的文字“Helloword”并通过memory write 0x12fc9c78 '61 61 61'修改其中一处结果,再把进程切换一下后台&前台,就刷新成修改的数据了。
请添加图片描述
 

提取内存数据

有了内存数据的偏移和长度,就可以通过memory dump from_base 0x12fc9c78 9 /root/memory.txt指令把刚才的内存dump到本地。
请添加图片描述
 

列出内存中所有的类

android hooking list classes,本次找到了5511个类。
请添加图片描述
 

列出指定类的所有方法

假设要查看APP MainActivity 类的方法,运行android hooking list class_methods com.zyc.objectiondemo.MainActivity,可以看到只打印了属于该类的方法,继承来的并不会打印。
请添加图片描述
 

在内存中所有的类里搜索类

从已加载的类里查找和“zyc”关键字,运行android hooking search classes zyc
请添加图片描述
 

在内存中所有的类里搜索方法

假设要搜索带“onCreate”的方法,运行android hooking search methods onCreate。该指令会遍历内存中所有已加载类的所有方法执行搜索,数据量非常大,过程相当耗时,甚至容易卡死和崩溃,所以会在运行前手动输入“y”同意。
请添加图片描述
 

列出所有Activity、Service、Receiver

查看APP的组件使用android hooking list activitiesandroid hooking list servicesandroid hooking list receivers命令。
请添加图片描述
 

启动Activity

使用android intent launch_activity com.zyc.objectiondemo.SecondActivity会以 Intent.FLAG_ACTIVITY_NEW_TASK 的方式直接启动Activity页面,通过此命令有时可以直接启动某些常规方式访问不到的页面。
请添加图片描述
 

内存堆上搜索实例

从用例代码可知,运行APP进入 MainActivity 后会创建3个Car对象,此时如果想查看内存中的Car实例,运行android heap search instances com.zyc.objectiondemo.Car
请添加图片描述
 

调用实例的方法

搜索到实例获取地址后可调用其方法。如果要调用实例1的 show() 方法,运行android heap execute 68389604 show
请添加图片描述
 

实时注入实例

拿到实例后可以直接在实例上书写js注入,运行android heap evaluate 23973990会进入js编辑器,可以实时编写、注入、调试,但没有代码提示。
请添加图片描述
 

导入Hook代码

objection支持导入Hook js文件使用,比如 /root/Desktop/objectionHook.js 有下面Hook代码:

function main() {
    Java.perform(function () {
        console.log("Hook start...");
        var Car = Java.use("com.zyc.objectiondemo.Car");
        Car.show.overload("int").implementation = function (arg1) {
            console.log("Hook show..." + arg1);
            return this.show(arg1);
        }
    });
}

setImmediate(main())

运行import /root/Desktop/objectionHook.js就可以在objection中直接使用了。
请添加图片描述
 

Hook类所有方法

运行android hooking watch class com.zyc.objectiondemo.Car可以Hook到Car类下所有方法(不包括构造方法)的调用。
请添加图片描述
 

Hook类单个方法

如果只需要Hook单个方法(包括其重载),比如上面没有Hook到的Car类构造函数,可以运行android hooking watch class_method com.zyc.objectiondemo.Car.$init
请添加图片描述
 
如果不需要Hook方法的重载,可以在方法名后面加上参数类型android hooking watch class_method com.zyc.objectiondemo.Car.$init "int,java.lang.String"
请添加图片描述
指令末尾加上对应选项可以展示参数、返回值和调用栈,运行android hooking watch class_method com.zyc.objectiondemo.Car.show --dump-args --dump-return --dump-backtrace
请添加图片描述
 

任务系统

objection可以同时运行多项任务,比如下图创建Hook任务时打印了任务id 629342,通过指令jobs list能查看当前运作的任务。
请添加图片描述
可以通过id结束某项任务,运行jobs kill 629342
请添加图片描述
 

参考资料

实用FRIDA进阶:内存漫游、hook anywhere、抓包

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
"Objection, wallbreaker"这个词组的意思可能是指在辩论或讨论中,对破除对方观点或阻碍的反对意见或观点。如果我要用300字回答这个问题,我会这样表达: 在辩论或讨论中, "objection, wallbreaker"是指提出反对意见或观点,意图破除或击破对方观点或阻碍。这个词组的出现通常是为了追求真实和公正的辩论,希望通过不同观点的碰撞促进智慧和认识的增长。 每个人都有自己的观点和立场,而辩论是一个相互交流、较量、甚至对抗观点的过程。当有人提出"objection, wallbreaker"时,他们可能持有不同的观点,希望通过辩论来找到真相或者找到更好的解决办法。 然而,在提出"objection, wallbreaker"时,我们也需要注意呈现我们的观点要公正和明晰。我们应该以理性的态度和充分的证据来支持我们的反对意见,而不是简单地提出不成熟的批评或个人攻击。 辩论中的"objection, wallbreaker"是一种促进思考和发展的机会。通过挑战和争论,我们可以更清晰地理解对方观点的有趣之处和缺点。这种挑战有助于增强我们的辩论能力、提升思维的灵活性,并可能在辩论过程中改变我们自己的立场。 总之,"objection, wallbreaker"是辩论中常见的现象之一,它代表了追求真相和理解的努力。在辩论中提出反对观点时,我们必须以开放和尊重的态度对待对方,并用理性的方式来支持我们的观点。通过这样的辩论,我们可以共同进步,获得深入的认识和智慧。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值