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

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要在Android 7.1 AOSP中添加屏幕密度选项并实现功能选项的功能,可以按照以下步骤进行操作: 1. 在AOSP源代码中找到Settings应用程序的代码目录,路径为packages/apps/Settings。 2. 在该目录下找到res/values/arrays.xml文件,并打开该文件。 3. 在该文件中添加一个新的数组,用于表示屏幕密度选项的值。例如: ``` <string-array name="screen_density_values"> <item>120</item> <item>160</item> <item>240</item> <item>320</item> <item>480</item> <item>640</item> </string-array> ``` 4. 在该文件中添加一个新的数组,用于表示屏幕密度选项的标签。例如: ``` <string-array name="screen_density_labels"> <item>@string/screen_density_120</item> <item>@string/screen_density_160</item> <item>@string/screen_density_240</item> <item>@string/screen_density_320</item> <item>@string/screen_density_480</item> <item>@string/screen_density_640</item> </string-array> ``` 5. 在该文件中添加对应的字符串资源,例如: ``` <string name="screen_density_120">Low Density (120)</string> <string name="screen_density_160">Medium Density (160)</string> <string name="screen_density_240">High Density (240)</string> <string name="screen_density_320">Extra High Density (320)</string> <string name="screen_density_480">Extra Extra High Density (480)</string> <string name="screen_density_640">Extra Extra Extra High Density (640)</string> ``` 6. 在Settings应用程序的代码中,找到DisplaySettings.java文件,并打开该文件。 7. 在该文件中找到屏幕密度选项的相关代码,在onCreate方法中添加以下代码: ``` mScreenDensityPreference = (ListPreference) findPreference(KEY_SCREEN_DENSITY); mScreenDensityPreference.setEntries(R.array.screen_density_labels); mScreenDensityPreference.setEntryValues(R.array.screen_density_values); mScreenDensityPreference.setValue(String.valueOf(currentDensity)); mScreenDensityPreference.setOnPreferenceChangeListener(this); ``` 其中,KEY_SCREEN_DENSITY是一个常量,表示屏幕密度选项对应的键值。currentDensity是当前屏幕密度的值。 8. 在该文件中实现功能选项的功能,在onPreferenceChange方法中添加以下代码: ``` if (preference == mScreenDensityPreference) { int density = Integer.parseInt((String) newValue); DisplayMetrics metrics = getResources().getDisplayMetrics(); metrics.densityDpi = density; getBaseContext().getResources().updateConfiguration(getResources().getConfiguration(), metrics); try { IWindowManager wm = IWindowManager.Stub.asInterface(ServiceManager.getService("window")); if (wm != null) { wm.updateSettings(); } } catch (RemoteException e) { Log.e(TAG, "Unable to update window manager settings", e); } return true; } ``` 其中,newValue是用户选择的屏幕密度的值。该代码将用户选择的屏幕密度值更新到系统的DisplayMetrics中,并更新配置信息。然后,它调用IWindowManager接口更新窗口管理器的设置。 9. 构建AOSP源代码并运行生成的系统镜像。 10. 在系统设置中,找到显示选项,即可看到屏幕密度选项,并且可以根据用户选择的屏幕密度值来改变屏幕的显示效果。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值