从 native 获取 AndroidId,Frida 获取 native 堆栈

在这里插入图片描述

let enablePrintStackTrace = true
Java.perform(function x() {
    console.log('重新加载脚本');

    hookAndroidId();
    exportSoMethod("libart.so");
})

function hookAndroidId() {
    var ANDROID_ID = "android_id"
    var Secure = Java.use("android.provider.Settings$Secure")
    Secure.getString.implementation = function (resolver, name) {
        var result = this.getString(resolver, name);
        if (ANDROID_ID == name) {
            console.log("getString 获取 androidID: " + result)
            log();
        }
        return result;
    }
}

function exportSoMethod(module_name) {
    const module = Process.findModuleByName(module_name);
    const symbols = module.enumerateSymbols();

    symbols.forEach(sym => {
        //env->GetStaticMethodID(secureClass, "getString","(Landroid/content/ContentResolver;Ljava/lang/String;)Ljava/lang/String;");
        if (sym.name.includes("GetStaticMethodID")) {
            var address = sym.address;
            console.log(`[name]: ${sym.name} \n\t[address]: ${address}\n`);

            if (address) {
                Interceptor.attach(address, {
                    onEnter: function (args) {
                        const targetClass = args[1];
                        const methodName = args[2].readCString();
                        const methodSig = args[3].readCString();
                        if (methodName === "getString") {
                            console.log(`[targetClass]: ${targetClass} [methodName]: ${methodName} [methodSig]: ${methodSig}\n`);
							
							// Backtracer.ACCURATE 提供更详细的堆栈,但可能略慢
							// Backtracer.FUZZY 更快,但可能不那么准确
                            const nativeStack = Thread.backtrace(this.context, Backtracer.FUZZY)
                                .map(DebugSymbol.fromAddress)
                                .join('\n');
                            console.log(`[nativeStack]: ${nativeStack}\n`);
                        }
                    }
                })
            }
        }
    });

}

function log() {
    if (enablePrintStackTrace) {
        console.log(Java.use("android.util.Log").getStackTraceString(Java.use("java.lang.Throwable").$new()));
    }
}

日志输出示例:

[V2183A::com.dz.gslsz.honor ]-> 重新加载脚本
[name]: _ZN3art12_GLOBAL__N_18CheckJNI17GetStaticMethodIDEP7_JNIEnvP7_jclassPKcS7_.llvm.15913410659909574214
        [address]: 0x6ef284b390

[name]: _ZN3art3JNIILb0EE17GetStaticMethodIDEP7_JNIEnvP7_jclassPKcS7_
        [address]: 0x6ef28a0fb0

[name]: _ZN3art3JNIILb1EE17GetStaticMethodIDEP7_JNIEnvP7_jclassPKcS7_
        [address]: 0x6ef2904a30

[V2183A::com.dz.gslsz.honor ]-> [targetClass]: 0xc5 [methodName]: getString [methodSig]: (Landroid/content/ContentResolver;Ljava/lang/String;)Ljava/lang/String;

[nativeStack]: 0x6e3cd4860c libnative-lib.so!0x112960c
0x6e3cd64594 libnative-lib.so!0x1145594
0x6e7c3fc740
0x6e7c3fc754
0x6e7c48f0bc
0x6e7c48f084
0x6e7c479260
0x6ef2b59f14 libart.so!NterpGetStaticField+0x84
0x6ef2b5a5d8 libart.so!NterpGetInstanceFieldOffset+0x68
0x6e3cd50ccc libnative-lib.so!0x1131ccc
0x6e3cd50cb4 libnative-lib.so!0x1131cb4
0x6ef260a258 libart.so!nterp_helper+0xf58
0x71929184 boot-framework.oat!0x406184
0x6ef2610970 libart.so!art_quick_invoke_stub+0x230
0x6ef267bbbc libart.so!_ZN3art9ArtMethod6InvokeEPNS_6ThreadEPjjPNS_6JValueEPKc+0xbc
0x6ef2a2cf48 libart.so!_ZN3art35InvokeVirtualOrInterfaceWithVarArgsIPNS_9ArtMethodEEENS_6JValueERKNS_33ScopedObjectAccessAlreadyRunnableEP8_jobjectT_St9__va_list+0x1d8

getString 获取 androidID: e3ab5e5a1d6e2063
java.lang.Throwable
        at android.provider.Settings$Secure.getString(Native Method)

getString 获取 androidID: e3ab5e5a1d6e2063
java.lang.Throwable
        at android.provider.Settings$Secure.getString(Native Method)
        at com.umeng.commonsdk.statistics.common.DeviceConfig.getAndroidId(SourceFile:7)
        at com.umeng.commonsdk.statistics.idtracking.b.f(SourceFile:1)
        at com.umeng.commonsdk.statistics.idtracking.a.g(SourceFile:4)
        at com.umeng.commonsdk.statistics.idtracking.a.a(SourceFile:1)
        at com.umeng.commonsdk.statistics.idtracking.f.b(SourceFile:5)
        at com.umeng.commonsdk.statistics.b.a(SourceFile:40)
        at com.umeng.commonsdk.framework.UMEnvelopeBuild.buildEnvelopeWithExtHeader(SourceFile:18)
        at com.umeng.commonsdk.framework.UMEnvelopeBuild.buildEnvelopeWithExtHeader(SourceFile:3)
        at com.umeng.analytics.pro.q.j(SourceFile:6)
        at com.umeng.analytics.pro.q.a(SourceFile:136)
        at com.umeng.analytics.pro.q.c(SourceFile:3)
        at com.umeng.analytics.pro.q.a(SourceFile:76)
        at com.umeng.analytics.CoreProtocol.workEvent(SourceFile:1)
        at com.umeng.commonsdk.framework.UMWorkDispatch.handleEvent(SourceFile:5)
        at com.umeng.commonsdk.framework.UMWorkDispatch.access$000(SourceFile:1)
        at com.umeng.commonsdk.framework.UMWorkDispatch$1.handleMessage(SourceFile:5)
        at android.os.Handler.dispatchMessage(Handler.java:106)
        at android.os.Looper.loopOnce(Looper.java:223)
        at android.os.Looper.loop(Looper.java:324)
        at android.os.HandlerThread.run(HandlerThread.java:67)

getString 获取 androidID: e3ab5e5a1d6e2063
java.lang.Throwable
        at android.provider.Settings$Secure.getString(Native Method)
        at com.reyun.tracking.a.a.c(Unknown Source:13)
        at com.reyun.tracking.a.h.a(Unknown Source:151)
        at com.reyun.tracking.a.h.a(Unknown Source:38)
        at com.reyun.tracking.sdk.Tracking.setStartupInternal(Unknown Source:19)
        at com.reyun.tracking.sdk.d.handleMessage(Unknown Source:139)
        at android.os.Handler.dispatchMessage(Handler.java:106)
        at android.os.Looper.loopOnce(Looper.java:223)
        at android.os.Looper.loop(Looper.java:324)
        at android.app.ActivityThread.main(ActivityThread.java:8524)
        at android.app.ActivityThread.main(ActivityThread.java:8524)
        at java.lang.reflect.Method.invoke(Native Method)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:582)
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:582)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1059)

[targetClass]: 0x73da [methodName]: getString [methodSig]: (Landroid/content/ContentResolver;Ljava/lang/String;)Ljava/lang/String;
[targetClass]: 0x73da [methodName]: getString [methodSig]: (Landroid/content/ContentResolver;Ljava/lang/String;)Ljava/lang/String;

[nativeStack]: 0x6e39cd4d44 libunity.so!0x9e4d44
0x71708098 boot-framework.oat!0x1e5098
0x6e66ba69a8 base.odex!0xe39a8
0x6e66f2d674 base.odex!0x46a674
0x6e66f2d674 base.odex!0x46a674
0x6e66db99f0 base.odex!0x2f69f0
0x71b3c788 boot-framework.oat!0x619788
0x71b3fe28 boot-framework.oat!0x61ce28
0x71b3f948 boot-framework.oat!0x61c948
0x71b3bf6c boot-framework.oat!0x618f6c
0x6e66dba488 base.odex!0x2f7488
0x6ef2a771a0 libart.so!_ZN3art6Thread25InstallImplicitProtectionEv+0x80
0x6ef2610970 libart.so!art_quick_invoke_stub+0x230
0x6ef267bbbc libart.so!_ZN3art9ArtMethod6InvokeEPNS_6ThreadEPjjPNS_6JValueEPKc+0xbc
0x6ef267bbbc libart.so!_ZN3art9ArtMethod6InvokeEPNS_6ThreadEPjjPNS_6JValueEPKc+0xbc
0x718ce51468 libc.so!scudo_malloc+0x28
0x718ce512a8 libc.so!_ZN5scudo9AllocatorINS_13AndroidConfigEXadL_Z21scudo_malloc_postinitEEE10deallocateEPvNS_5Chunk6OriginEmm+0xd8
0x6ef2a2caf0 libart.so!_ZN3art35InvokeVirtualOrInterfaceWithJValuesIPNS_9ArtMethodEEENS_6JValueERKNS_33ScopedObjectAccessAlreadyRunnableEP8_jobjectT_PK6jvalue+0x1d0

getString 获取 androidID: e3ab5e5a1d6e2063
java.lang.Throwable
        at android.provider.Settings$Secure.getString(Native Method)
        at com.unity3d.player.UnityPlayer.nativeRender(Native Method)
        at com.unity3d.player.UnityPlayer.access$300(Unknown Source:0)
        at com.unity3d.player.UnityPlayer$e$1.handleMessage(Unknown Source:83)
        at android.os.Handler.dispatchMessage(Handler.java:102)
        at android.os.Looper.loopOnce(Looper.java:223)
        at android.os.Looper.loop(Looper.java:324)
        at com.unity3d.player.UnityPlayer$e.run(Unknown Source:20)

[V2183A::com.dz.gslsz.honor ]->

小结

综上日志可得

存在两个 so 库 native 侧获取 Android ID

  • libnative-lib.so
  • libunity.so
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值