root检查:隐藏bootloader锁,su等
Android逆向-root检查
隐藏Bootloader
需要修改的属性
直接省流:
Property | Value |
---|---|
ro.boot.flash.locked | 1 |
ro.boot.verifiedbootstate | green |
ro.boot.vbmeta.device_state | locked |
使用Hook进行修改
直接引用:
[原创] 初探安卓隐藏Bootloader锁-Android安全-看雪-安全社区|安全招聘|kanxue.com
安卓的linker使用的是mmap映射的elf文件,hook do_mmap的返回处,判断pgoff和filepath就能拦截到init进程加载libc.so,在这个时机里对_system_property_add函数下execute hook,
1
2
3
4
5
6
7
8
9
10
11
12
13
14 void rwhandler_hidebl_mmap_callback(unsigned long addr,struct file *file)
{
char fullpath[1024];
char *path = d_path(&file->f_path, fullpath, 1024);
if(
path &&
!strcmp(path,"/system/lib64/bootstrap/libc.so") &&
current->pid == 1)
{
rwhandler_start_debug();
rwhandler_set_hbp(1,addr+0x90430,4,HW_BREAKPOINT_X);
printk("task = %s file = %s addr = %llX\r\n",current->comm,path,addr);
}
}hook回调里对参数进行简单处理:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54 static const char *hide_props[]={"ro.boot.verifiedbootstate","ro.boot.vbmeta.device_state",NULL};
static char *hide_value[]={"green","locked",NULL};
static bool hidebl_hbpcallback(struct perf_event *bp,
struct perf_sample_data *data,
struct pt_regs *regs)
{
if(current->pid == 1)
{
char key[100];
unsigned long keyaddr = regs->regs[0];
unsigned long varaddr = regs->regs[2];
memset(key, 0, 100);
printk("[+] init hit pc = %llX x0 = %llX x1 = %llX\r\n",
regs->pc,regs->regs[0],regs->regs[1]);
keyaddr &= 0xFFFFFFFFFFFFFF;
varaddr &= 0xFFFFFFFFFFFFFF;
if(rwhandler_read_memory(
1,
(unsigned long)keyaddr,
key, 99)>0)
{
char value[100];
memset(value, 0, 100);
printk("[+] value = %llX\r\n",*(uint64_t*)key);
printk("[+] init key = %s\r\n",key);
if(rwhandler_read_memory(
1,
(unsigned long)varaddr,
value, 99)>0)
{
int idx = 0;
printk("[+] init value = %s\r\n",value);
while(hide_props[idx])
{
if(!strcmp(key,hide_props[idx]))
{
if(rwhandler_do_ptrace_write(1, varaddr, hide_value[idx], strlen(hide_value[idx])+1))
{
regs->regs[3]=strlen(hide_value[idx]);
}
break;
}
idx++;
}
}
}
return true;
}
return false;
};修改成功。
魔改Magisk等实现BL隐藏
BL隐藏其实不是必须的,不需要为了看Momo笑脸就必须搞这个。
隐藏BL保姆级教程第(二)期 - 哔哩哔哩 (bilibili.com)
Google Play验证
这是官方介绍:
SafetyNet Attestation API | Android 开发者 | Android Developers
https://developer.android.com/google/play/integrity/overview
这是有关如何Bypass的:
kdrag0n/safetynet-fix: Google SafetyNet attestation workarounds for Magisk (github.com)
KeyAttestation
一个比较难的绕过点。用的是硬件TEE Chips来实现安全验证。
https://github.com/vvb2060/KeyAttestation
有个网友提出了重放攻击:
或许可以这样?
App层用Hook劫持密钥认证的传输层,利用重放请求来绕过设备密钥认证,密钥认证返回的请求者APP数字签名信息是来自software层,root设备可以修改software层获取到的请求者数字签名绕过防重放,这样就可以利用通过一个CVE-2022-20409提权上去的设备来做重放请求的设备
但是TEE会返回kernel的patch版本,还是会产生一些检测方向,不太理想
最理想的是受害app出现了一个代码执行漏洞,在未解BL的设备上复现受害APP的代码执行漏洞来进行请求的重放
Frida
在我的Blog Frida-CheatSheet
里面有一个用Frida Hook来欺骗APP实现绕过的。
Shamiko
放在一个新blog里了。主要目的就是用于root隐藏。
KernelSU
放在一个新blog里了。这是一个全新的root获取方式。
可行的一个方式是:KernelSU+Shamiko+隐藏应用列表
Magisk Delta
狐狸面具,似乎更高级。相比于KernelSU方便一点。我暂时没用上。
Momo(root detector app)
这是一个用于检测手机root可疑性的APP。
Telegram: Contact @magiskalpha
参考
[原创] 初探安卓隐藏Bootloader锁-Android安全-看雪-安全社区|安全招聘|kanxue.com
https://github.com/vvb2060/KeyAttestation
kdrag0n/safetynet-fix: Google SafetyNet attestation workarounds for Magisk (github.com)
Magisk如何针对性隐藏Root避免被检测 - 知乎 (zhihu.com)
- 本文作者: Taardis
- 本文链接: https://taardisaa.github.io/2023/09/14/Android逆向-root检查/
- 版权声明: 本博客所有文章除特别声明外,均采用 Apache License 2.0 许可协议。转载请注明出处!