8poll

应用模拟器 root 环境下会跳出 toast 警告并自动退出

尝试 hook toast

包名 com.miniclip.eightballpool

Java.perform(function() {
    var Toast = Java.use("android.widget.Toast");
 
    Toast.makeText.overload('android.content.Context', 'java.lang.CharSequence', 'int').implementation = function(context: any, text: any, duration: any) {
        console.log("[!] Toast.makeText called with text: " + text);
 
        var stackTrace = Java.use("java.lang.Exception").$new().getStackTrace();
        for (var i = 0; i < stackTrace.length; i++) {
            console.log("Stack Trace: " + stackTrace[i].toString());
        }
 
        return this.makeText(context, text, duration);
    };
 
    Toast.show.implementation = function() {
        console.log("[!] Toast.show called");
 
        var stackTrace = Java.use("java.lang.Exception").$new().getStackTrace();
        for (var i = 0; i < stackTrace.length; i++) {
            console.log("Stack Trace: " + stackTrace[i].toString());
        }
 
        // 调用原始 show 方法
        return this.show();
    };
});
 

从堆栈追踪来看,InjectedActivity 类中的 showToast 方法在 handleExitToast 中被调用。

因此,这个 Toast 是通过 InjectedActivity 类中的 handleExitToast 方法间接调用的。如果你想要更深入地分析 Toast 被调用的具体逻辑,应该查看 InjectedActivityshowToasthandleExitToast 方法的实现。

runtime.loading.InjectedActivity.showPopup 加载了 libloader

通过库可以跟踪到 io.adjoe.protection.DeviceUtils 调用了可疑的检测emulator的方法

应该是通过 org.json.JSONObject 这个 Mozilla的库来传递设备当前的信息。然后通过读取JSON来判断异常情况。

可以hook结果看看,然后看看能不能改变值绕过去

试一下 toString() 方法:

竟然hook不到,我研究一下整个调用逻辑链看看,是不是我搞错了(还没到这步就挂了)