Android逆向一-frida操作

系列文章目录

第一章 frida操作


文章目录

  • 系列文章目录
  • 前言
  • 一、两种模式
  • 二、frida命令行执行及参数
  • 三、frida使用python执行
  • 四、动静态域调用
    • 1. 静态域调用
    • 2.动态域调用
  • 五. 远程rpc调用
  • 六. 补充
  • 总结


前言

熟悉frida操作,hook手机app的关键位置进行逆向操作

一、两种模式

  • attach:应用运行过程中hook, 有壳也可以
  • spawn:创建进程时就hook(类还没有加载), 有壳话就不行

二、frida命令行执行及参数

frida -UF -l agent/HelloWorld.js 
-U  usb模式
-F  最前台的应用
-l  加载脚本
-o  输出到文件
-f  spawn模式
--no-pause 进程启动之后立即执行,不用暂停 

三、frida使用python执行

import time
import frida

# 连接安卓机上的frida-server
device = frida.get_usb_device()  # USb连接
# device =frida.get_device_manager().add_remote_device('192.168.199.199:5555')  # ip连接
# 获取前台运行的应用
print(device.get_frontmost_application()) 
pid = device.get_frontmost_application().pid
# attach模式
session = device.attach(pid)
# 加载s1.js脚本
with open("agent/20220531.js") as f:
    script = session.create_script(f.read())
script.load()

# 脚本会持续运行等待输入
input()

四、动静态域调用

1. 静态域调用

指的是在代码中直接引用类的字段,不需要创建类的实例。

// 打印设备指纹信息, 修改指纹信息
function FingerPrint(){
    Java.perform(function(){
        var BUILD = Java.use("android.os.Build");
        BUILD.DEVICE.value = "sailfish";
        console.log("Device is =>", BUILD.DEVICE.value);
        console.log("ID is =>", BUILD.ID.value);
        console.log("MODEL is =>", BUILD.MODEL.value);
        console.log("SERIAL is =>", BUILD.SERIAL.value);
        // console.log("SERIAL is =>", BUILD.getSerial());
        console.log("sdk is =>", BUILD.getString("ro.build.version.sdk"));
    })
}

2.动态域调用

使用Frida的JavaScript API,在运行时通过类的实例引用字段。这意味着可以修改字段的值,甚至访问私有字段。

function InstanceDemo(){
    Java.perform(function(){
        Java.choose("com.example.junior.CalculatorActivity", {
            onMatch:function(instance){
                console.log("found instance =>", instance);
                console.log("instance showText is =>", instance.showText.value);
                console.log("found instance =>", instance.clear("456"));
            },onComplete:function(){
                console.log("Search Complete!")
            }
        })
    })
}

五. 远程rpc调用

  • https://www.freebuf.com/articles/system/190565.html
  • javascript代码
function callSecretFun() { //定义导出函数
    Java.perform(function () { //找到隐藏函数并且调用
        Java.choose("com.roysue.demo02.MainActivity", {
            onMatch: function (instance) {
                console.log("Found instance: " + instance);
                console.log("Result of secret func: " + instance.secret());
            },
            onComplete: function () { }
        });
    });
}
rpc.exports = {
    callsecretfunction: callSecretFun //把callSecretFun函数导出为callsecretfunction符号,导出名不可以有大写字母或者下划线
};
  • py代码
import time
import frida


def my_message_handler(message, payload):
    print message
    print payload

def read_rpc_code():
    with open("s3.js") as f:
    script = session.create_script(f.read())
    script.on("message", my_message_handler)
    script.load()
    return script

# 连接
device = frida.get_usb_device()
pid = device.spawn(["com.roysue.demo02"])
device.resume(pid)
time.sleep(1)
session = device.attach(pid)

# rpc调用
script = read_rpc_code()
script.exports.callsecretfunction()

六. 补充

frida-ps -Uai : 列出当前手机的进程,可以看到进程id
然后可以通过
objection -g 进程id explore 进行注入

总结

frida学习资料

你可能感兴趣的:(开发语言,爬虫)