安卓分析-Frida:绕过模拟器检测

在对安卓应用进行分析时,一般都会对测试机进行刷机处理,具有root权限才能更好的知道app都干了什么。

0x01 发现问题

在一次分析应用时:出现以下问题:

应用无法打开,当然我也可以选择找一个非root的测试机,但是这不是我的本意。

0x02 分析问题

使用jadx打开样本,搜索字符串

跳转至对应函数:

应该主要时A0函数的锅,所以直接去看A0函数

可以看到一个有两次校验,只要有一个成功既可检测成功。如果是root了则会返回true,反之为false

0x03 解决问题

要解决这里的问题,至需要让A0函数返回false即可。因此需要代码注入,这里使用frida。

右键函数可以快捷获取frida片段

然后使用代码:

import frida
import sys


class Mod:
    spawn = 1
    attach = 2


# 使用时仅需修改注入模式、包名、js_code即可
# 注入模式:attach和spawn
hook_mod = Mod.spawn

# 应用名,程序运行不一定是包名,用frida-ps -U查看
app_name = "搓开美女的衣服-妄撮"         # attach模式必填
package_name = "com.hj.chen.new0804"       # spawn模式必填

# 需要注入的js代码,第一行的Java.perform(function(){}是必须项
js_code = """Java.perform(function() {
let SplashActivity = Java.use("com.niming.weipa.ui.splash.SplashActivity");

SplashActivity["A0"].implementation = function () {
    console.log(`SplashActivity.A0 is called`);
    let result = this["A0"]();
    console.log(`SplashActivity.A0 result=${result}`);
    return false;
};

});"""


def on_message(message, data):
    if message['type'] == 'send':
        print("[*] {0}".format(message['payload']))
    else:
        print(message)


if hook_mod == Mod.attach:
    process = frida.get_usb_device().attach(app_name)  # attach模式
    script = process.create_script(js_code)
    script.on('message', on_message)
    script.load()
    sys.stdin.read()
elif hook_mod == Mod.spawn:
    device = frida.get_usb_device()
    pid = device.spawn([package_name])  # spawn模式
    print(f'[+] 进程号:{pid}')
    session = device.attach(pid)
    script = session.create_script(js_code)
    script.on('message', on_message)
    script.load()
    device.resume(pid)
    sys.stdin.read()
else:
    print('请选择正确的注入模式')

复制的frida片段是这样的:

let SplashActivity = Java.use("com.niming.weipa.ui.splash.SplashActivity");
SplashActivity["A0"].implementation = function () {
    console.log(`SplashActivity.A0 is called`);
    let result = this["A0"]();
    console.log(`SplashActivity.A0 result=${result}`);
    return result;
};

只要将result替换为false,然后填入上面的模板,再运行即可。