IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 移动开发 -> aosp集成frida-gadget -> 正文阅读

[移动开发]aosp集成frida-gadget

编译环境:
ubuntu 16.04.7 + nexus 6P

1. 首先编译aosp,并能成功刷机。

2. 配置frida-gadget到编译成功的源码路径下

去github下载两个版本的frida-gadget.so
在这里插入图片描述

下载完成后解压,并改名。注意文件名必须以lib开头。

mv frida-gadget-15.1.16-android-arm.so libfg15116arm.so
mv frida-gadget-15.1.16-android-arm64.so libfg15116arm64.so

然后分别push到编译好的aosp对应目录

mv libfg15116arm.so out/target/product/angler/system/lib/
mv libfg15116arm64.so out/target/product/angler/system/lib64/

接下来创建frida gadget库的配置文件。配置文件名前半部分需要和gadget库的文件名相同

touch out/target/product/angler/system/lib/libfg15116arm.config.so
touch out/target/product/angler/system/lib/libfg15116arm64.config.so

分别在其中写入如下内容

{
  "interaction": {
    "type": "script",
    "path": "/data/local/tmp/hook.js"
  }
}

3. 修改源代码,在fork子进程的时候注入frida-gadget

找到源代码frameworks/base/core/jni/com_android_internal_os_Zygote.cpp
在这里插入图片描述
可以看到在这里fork的子进程。
在 pid==0的判断条件下,末尾增加以下代码

/*
 * 在虚拟机,系统框架初始化完成之后,加载frida框架
 * 需要增加头文件的引用 #include <dlfcn.h>
 */
#if defined(__aarch64__) || defined(__arm__)
    {
        #if defined(__aarch64__)
            #define FRIDA_LIB "/system/lib64/libfg15116arm64.so"
        #else
            #define FRIDA_LIB "/system/lib/libfg15116arm.so"
        #endif
        const char *name = env->GetStringUTFChars(java_se_name, 0);
        void* frida = dlopen(FRIDA_LIB, RTLD_NOW);
        if(NULL == frida) {
            ALOGE("(%s) load frida-gadget(%s) failed, err= %d\n", name, FRIDA_LIB, errno);
        } else {
            ALOGI("(%s) load frida-gadget(%s) success\n", name, FRIDA_LIB);
        }
        env->ReleaseStringUTFChars(java_se_name, name);
    }
#endif

4. 编译并重新生成系统镜像

cd frameworks/base
mmm
make snod

5. 刷机后效果

在这里插入图片描述

6. 测试效果,load上一篇文章中的so

编写hook脚本

// 必须加载app自己创建的so,adb shell创建的会加载失败。原因暂时未知
function copyFileByLibc(i_file, o_file){
    const addr_fopen = Module.findExportByName('libc.so', 'fopen');
    const addr_fread = Module.findExportByName('libc.so', 'fread');
    const addr_fclose = Module.findExportByName('libc.so', 'fclose');
    const addr_fwrite = Module.findExportByName('libc.so', 'fwrite');

    // console.log('fopen:', addr_fopen, 'fputs', addr_fputs, 'fclose', addr_fclose);
    // 构建函数
    const fopen = new NativeFunction(addr_fopen, 'pointer', ['pointer', 'pointer']);
    const fclose = new NativeFunction(addr_fclose, 'int', ['pointer']);
    const fread = new NativeFunction(addr_fread, 'int', ['pointer', 'int', 'int', 'pointer']);
    const fwrite = new NativeFunction(addr_fwrite, 'int', ['pointer', 'int', 'int', 'pointer']);

    const in_filename = Memory.allocUtf8String(i_file);
    const in_mode = Memory.allocUtf8String("rb");
    const in_file = fopen(in_filename, in_mode);

    const out_filename = Memory.allocUtf8String(o_file);
    const out_mode =  Memory.allocUtf8String("wb");
    const out_file = fopen(out_filename, out_mode);
    const read_size = 1024
    const buffer = Memory.alloc(read_size);
    while (true){
        const len = fread(buffer, 1, read_size, in_file);
        if(len === 0){
            break
        }
        fwrite(buffer, 1, len, out_file);
    }
    fclose(in_file);
    fclose(out_file);
}


function main(){
    if(Java.available){
        Java.perform(function (){
        var System = Java.use("java.lang.System");
        var clz = Java.use("com.h0p1.xposeddemo.MainActivity");
        clz.testOne.implementation = function (){
            var currentApplication = Java.use('android.app.ActivityThread').currentApplication();
            var context = currentApplication.getApplicationContext();
            var libs = context.getDir("tt", 0x0000);
            var target_so = libs.getAbsolutePath() + "/libhookso.so";
            copyFileByLibc("/data/local/tmp/libhookso.so", target_so);
            System.load(target_so);
        }
        })
    }
}
// 不能立即hook,不加延迟app启动就会崩溃
setTimeout(main, 500)

把脚本推到手机上

adb push code.js /data/local/tmp/hook.js

重新打开app,效果如下:
在这里插入图片描述

参考文章:

1.ubuntu 20.04系统AOSP(Android 11)集成Frida

  移动开发 最新文章
Vue3装载axios和element-ui
android adb cmd
【xcode】Xcode常用快捷键与技巧
Android开发中的线程池使用
Java 和 Android 的 Base64
Android 测试文字编码格式
微信小程序支付
安卓权限记录
知乎之自动养号
【Android Jetpack】DataStore
上一篇文章      下一篇文章      查看所有文章
加:2022-02-26 11:42:07  更:2022-02-26 11:42:48 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 15:59:17-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码