安卓分析-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,然后填入上面的模板,再运行即可。