zoukankan      html  css  js  c++  java
  • 安卓so文件函数动态注册

    定义一个js脚本,把他放进去就可以 


    var ishook_libart = false;
    //打印输出so文件运行时实际注册的函数。比如jadx里面的加密函数和打开so文件后搜到的函数不一致。这种情况用了混淆
    //命令 frida -U -l hook_RegisterNatives.js -f com.coolapk.market --no-pause
    // 打印的结果:[RegisterNatives] java_class: com.coolapk.market.util.AuthUtils name: getAS sig: (Landroid/content/Context;Ljava/lang/String;)Ljava/lang/String; fnPtr: 0xd30c1501 module_name: libnative-lib.so module_base: 0xd305b000 offset: 0x66501
    //getAS是jadx里面的函数 offset 0x66501是函数 实际运行的偏移量。offset-1就是实际 的函数位置,我们用ida打开so文件,搜索66500就能定位到实际的函数运行地址
    function hook_libart() {
    if (ishook_libart === true) {
    return;
    }
    var symbols = Module.enumerateSymbolsSync("libart.so");
    var addrGetStringUTFChars = null;
    var addrNewStringUTF = null;
    var addrFindClass = null;
    var addrGetMethodID = null;
    var addrGetStaticMethodID = null;
    var addrGetFieldID = null;
    var addrGetStaticFieldID = null;
    var addrRegisterNatives = null;
    var addrAllocObject = null;
    var addrCallObjectMethod = null;
    var addrGetObjectClass = null;
    var addrReleaseStringUTFChars = null;
    for (var i = 0; i < symbols.length; i++) {
    var symbol = symbols[i];
    if (symbol.name == "_ZN3art3JNI17GetStringUTFCharsEP7_JNIEnvP8_jstringPh") {
    addrGetStringUTFChars = symbol.address;
    console.log("GetStringUTFChars is at ", symbol.address, symbol.name);
    } else if (symbol.name == "_ZN3art3JNI12NewStringUTFEP7_JNIEnvPKc") {
    addrNewStringUTF = symbol.address;
    console.log("NewStringUTF is at ", symbol.address, symbol.name);
    } else if (symbol.name == "_ZN3art3JNI9FindClassEP7_JNIEnvPKc") {
    addrFindClass = symbol.address;
    console.log("FindClass is at ", symbol.address, symbol.name);
    } else if (symbol.name == "_ZN3art3JNI11GetMethodIDEP7_JNIEnvP7_jclassPKcS6_") {
    addrGetMethodID = symbol.address;
    console.log("GetMethodID is at ", symbol.address, symbol.name);
    } else if (symbol.name == "_ZN3art3JNI17GetStaticMethodIDEP7_JNIEnvP7_jclassPKcS6_") {
    addrGetStaticMethodID = symbol.address;
    console.log("GetStaticMethodID is at ", symbol.address, symbol.name);
    } else if (symbol.name == "_ZN3art3JNI10GetFieldIDEP7_JNIEnvP7_jclassPKcS6_") {
    addrGetFieldID = symbol.address;
    console.log("GetFieldID is at ", symbol.address, symbol.name);
    } else if (symbol.name == "_ZN3art3JNI16GetStaticFieldIDEP7_JNIEnvP7_jclassPKcS6_") {
    addrGetStaticFieldID = symbol.address;
    console.log("GetStaticFieldID is at ", symbol.address, symbol.name);
    } else if (symbol.name == "_ZN3art3JNI15RegisterNativesEP7_JNIEnvP7_jclassPK15JNINativeMethodi") {
    addrRegisterNatives = symbol.address;
    console.log("RegisterNatives is at ", symbol.address, symbol.name);
    } else if (symbol.name.indexOf("_ZN3art3JNI11AllocObjectEP7_JNIEnvP7_jclass") >= 0) {
    addrAllocObject = symbol.address;
    console.log("AllocObject is at ", symbol.address, symbol.name);
    } else if (symbol.name.indexOf("_ZN3art3JNI16CallObjectMethodEP7_JNIEnvP8_jobjectP10_jmethodIDz") >= 0) {
    addrCallObjectMethod = symbol.address;
    console.log("CallObjectMethod is at ", symbol.address, symbol.name);
    } else if (symbol.name.indexOf("_ZN3art3JNI14GetObjectClassEP7_JNIEnvP8_jobject") >= 0) {
    addrGetObjectClass = symbol.address;
    console.log("GetObjectClass is at ", symbol.address, symbol.name);
    } else if (symbol.name.indexOf("_ZN3art3JNI21ReleaseStringUTFCharsEP7_JNIEnvP8_jstringPKc") >= 0) {
    addrReleaseStringUTFChars = symbol.address;
    console.log("ReleaseStringUTFChars is at ", symbol.address, symbol.name);
    }
    }

    if (addrRegisterNatives != null) {
    Interceptor.attach(addrRegisterNatives, {
    onEnter: function (args) {
    console.log("[RegisterNatives] method_count:", args[3]);
    var env = args[0];
    var java_class = args[1];

    var funcAllocObject = new NativeFunction(addrAllocObject, "pointer", ["pointer", "pointer"]);
    var funcGetMethodID = new NativeFunction(addrGetMethodID, "pointer", ["pointer", "pointer", "pointer", "pointer"]);
    var funcCallObjectMethod = new NativeFunction(addrCallObjectMethod, "pointer", ["pointer", "pointer", "pointer"]);
    var funcGetObjectClass = new NativeFunction(addrGetObjectClass, "pointer", ["pointer", "pointer"]);
    var funcGetStringUTFChars = new NativeFunction(addrGetStringUTFChars, "pointer", ["pointer", "pointer", "pointer"]);
    var funcReleaseStringUTFChars = new NativeFunction(addrReleaseStringUTFChars, "void", ["pointer", "pointer", "pointer"]);

    var clz_obj = funcAllocObject(env, java_class);
    var mid_getClass = funcGetMethodID(env, java_class, Memory.allocUtf8String("getClass"), Memory.allocUtf8String("()Ljava/lang/Class;"));
    var clz_obj2 = funcCallObjectMethod(env, clz_obj, mid_getClass);
    var cls = funcGetObjectClass(env, clz_obj2);
    var mid_getName = funcGetMethodID(env, cls, Memory.allocUtf8String("getName"), Memory.allocUtf8String("()Ljava/lang/String;"));
    var name_jstring = funcCallObjectMethod(env, clz_obj2, mid_getName);
    var name_pchar = funcGetStringUTFChars(env, name_jstring, ptr(0));
    var class_name = ptr(name_pchar).readCString();
    funcReleaseStringUTFChars(env, name_jstring, name_pchar);

    //console.log(class_name);

    var methods_ptr = ptr(args[2]);

    var method_count = parseInt(args[3]);
    for (var i = 0; i < method_count; i++) {
    var name_ptr = Memory.readPointer(methods_ptr.add(i * Process.pointerSize * 3));
    var sig_ptr = Memory.readPointer(methods_ptr.add(i * Process.pointerSize * 3 + Process.pointerSize));
    var fnPtr_ptr = Memory.readPointer(methods_ptr.add(i * Process.pointerSize * 3 + Process.pointerSize * 2));

    var name = Memory.readCString(name_ptr);
    var sig = Memory.readCString(sig_ptr);
    var find_module = Process.findModuleByAddress(fnPtr_ptr);
    console.log("[RegisterNatives] java_class:", class_name, "name:", name, "sig:", sig, "fnPtr:", fnPtr_ptr, "module_name:", find_module.name, "module_base:", find_module.base, "offset:", ptr(fnPtr_ptr).sub(find_module.base));

    }
    },
    onLeave: function (retval) { }
    });
    }

    ishook_libart = true;
    }

    hook_libart();
  • 相关阅读:
    多表联合查询,利用 concat 模糊搜索
    order by 中利用 case when 排序
    Quartz.NET 3.0.7 + MySql 动态调度作业+动态切换版本+多作业引用同一程序集不同版本+持久化+集群(一)
    ASP.NET Core 2.2 基础知识(十八) 托管和部署 概述
    ASP.NET Core 2.2 基础知识(十七) SignalR 一个极其简陋的聊天室
    ASP.NET Core 2.2 基础知识(十六) SignalR 概述
    ASP.NET Core 2.2 基础知识(十五) Swagger
    ASP.NET Core 2.2 基础知识(十四) WebAPI Action返回类型(未完待续)
    linux磁盘管理 磁盘查看操作
    linux磁盘管理 文件挂载
  • 原文地址:https://www.cnblogs.com/wuxianyu/p/14518414.html
Copyright © 2011-2022 走看看