首页
论坛
课程
招聘
[原创]关于frida检测的一个新思路
2021-7-26 15:18 14543

[原创]关于frida检测的一个新思路

2021-7-26 15:18
14543

如今各大厂商的风控都开始注重检测frida了

 

葫芦娃大佬的项目完美隐藏了字符串特征:https://github.com/hluwa/strongR-frida-android

 

那,有没有什么更好的手段去做检测呢?近日研究了一下,发现了一个新的点,简单记录以分享:

 

frida注入前:

1
2
3
70835d2000-7083bcb000 r-xp 00000000 103:09 1870                          /system/lib64/libart.so
7083bcb000-7083bdb000 r--p 005f8000 103:09 1870                          /system/lib64/libart.so
7083bdb000-7083bde000 rw-p 00608000 103:09 1870                          /system/lib64/libart.so

frida注入后:

1
2
3
4
5
70835d2000-7083689000 r-xp 00000000 103:09 1870                          /system/lib64/libart.so
7083689000-708368a000 rwxp 000b7000 103:09 1870                          /system/lib64/libart.so
708368a000-7083bcb000 r-xp 000b8000 103:09 1870                          /system/lib64/libart.so
7083bcb000-7083bdb000 r--p 005f8000 103:09 1870                          /system/lib64/libart.so
7083bdb000-7083bde000 rw-p 00608000 103:09 1870                          /system/lib64/libart.so

可以看到,libart.so的text段中有一页被改成了可读权限(特征:段变多了

 

进而,dump下来,修复so后拖到ida看看:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
.text:00000000000DC724                         ; __int64 __fastcall art::ArtMethod::PrettyMethod(art::ArtMethod *__hidden this, bool)
.text:00000000000DC724                                         EXPORT _ZN3art9ArtMethod12PrettyMethodEb
.text:00000000000DC724                         _ZN3art9ArtMethod12PrettyMethodEb       ; CODE XREF: art::ArtMethod::Invoke(art::Thread *,uint *,uint,art::JValue *,char const*)+200↑p
.text:00000000000DC724                                                                 ; art::ArtMethod::RegisterNative(void const*,bool)+BC↓p ...
.text:00000000000DC724                         ; __unwind {
.text:00000000000DC724 50 00 00 58                             LDR             X16, =0x7104FFD600
.text:00000000000DC728 00 02 1F D6                             BR              X16
.text:00000000000DC728                         ; End of function art::ArtMethod::PrettyMethod(bool)
.text:00000000000DC728
.text:00000000000DC728                         ; ---------------------------------------------------------------------------
.text:00000000000DC72C 00 D6 FF 04 71 00 00 00 off_DC72C       DCQ 0x7104FFD600        ; DATA XREF: art::ArtMethod::PrettyMethod(bool)↑r
.text:00000000000DC734                         ; ---------------------------------------------------------------------------
.text:00000000000DC734 F4 4F 10 A9                             STP             X20, X19, [SP,#0x100]
.text:00000000000DC738 FD 7B 11 A9                             STP             X29, X30, [SP,#0x110]

PrettyMethod函数前16个字节被修改了,代码结构很明显,就是frida的native inlinehook

 

这个函数应该都很熟悉了,返回对应函数的全称,形式为返回值 包名.类名.函数名(参数),可以说是完整的函数声明

 

但是为什么要hook这个函数呢?

 

去frida-java-brige源码里搜一下:https://github.com/frida/frida-java-bridge/blob/5f3f174ee63738dd151c25a863c66cd7c4b995da/lib/android.js

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
function fixupArtQuickDeliverExceptionBug (api) {                                                            // frida源码
  const prettyMethod = api['art::ArtMethod::PrettyMethod'];
  if (prettyMethod === undefined) {
    return;
  }
 
  /*
   * There is a bug in art::Thread::QuickDeliverException() where it assumes
   * there is a Java stack frame present on the art::Thread's stack. This is
   * not the case if a native thread calls a throwing method like FindClass().
   *
   * We work around this bug here by detecting when method->PrettyMethod()
   * happens with method == nullptr.
   */
  Interceptor.attach(prettyMethod.impl, artController.hooks.ArtMethod.prettyMethod);
  Interceptor.flush();
}

注释说得很清楚了,也就是说,这个函数是一定会hook的,那么检测下它的前几个字节即可检测frida(完结


【公告】 讲师招募 | 全新“预付费”模式,不想来试试吗?

收藏
点赞10
打赏
分享
最新回复 (12)
雪    币: 94
活跃值: 活跃值 (442)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
wangzehua 活跃值 2021-7-26 16:43
2
0
666
雪    币: 196
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
咸鱼王 活跃值 2021-7-29 14:36
3
0
这个在程序里面要怎么取获取这一段数据呢 刚刚学习不太了解
雪    币: 962
活跃值: 活跃值 (4132)
能力值: ( LV7,RANK:115 )
在线值:
发帖
回帖
粉丝
Ssssone 活跃值 2 2021-7-29 18:46
4
0
咸鱼王 这个在程序里面要怎么取获取这一段数据呢 刚刚学习不太了解[em_5]
https://github.com/lizhangqu/dlfcn_compat
雪    币: 6973
活跃值: 活跃值 (2946)
能力值: (RANK:1130 )
在线值:
发帖
回帖
粉丝
海风月影 活跃值 22 2021-7-30 13:00
5
0
可以的,针对性很强
照这个思路,还可以找到不少~~
雪    币: 196
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
咸鱼王 活跃值 2021-7-31 12:22
6
0
Ssssone https://github.com/lizhangqu/dlfcn_compat

试了一下 只要是被hook了的 权限都会出现一个rwxp  不管是用frida 还是自己代码里面写的inlinehook都会有这个特征(只测试了Android 11) 通过这个东西 理论可以检测具体的哪些so被hook了 牛蛙

雪    币: 196
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
咸鱼王 活跃值 2021-7-31 12:26
7
0
Ssssone https://github.com/lizhangqu/dlfcn_compat
不过具体是哪个函数被hook了(针对性的检查某函数前16个字节被修改了)怎么实现还是没太明白。 我知道win有ReadProcessMemory GetProcAddress这种东西可以读取这些 但是Android还是不太懂 求大佬详解一下
雪    币: 9600
活跃值: 活跃值 (1997)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
tDasm 活跃值 2021-7-31 12:57
8
1
你这个检测不仅仅是frida,而是所有hook检测,所以你的标题得改一下。如果其他so也hook该函数,是不是误判为frida?
雪    币: 9600
活跃值: 活跃值 (1997)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
tDasm 活跃值 2021-7-31 13:00
9
0
咸鱼王 不过具体是哪个函数被hook了(针对性的检查某函数前16个字节被修改了)怎么实现还是没太明白。 我知道win有ReadProcessMemory GetProcAddress这种东西可以读取这些 但是 ...
安卓一般是本进程内修改,因此只需修改内存为可写就可以修改函数入口。
雪    币: 636
活跃值: 活跃值 (282)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
Rprop 活跃值 2021-7-31 13:22
10
0
咸鱼王 不过具体是哪个函数被hook了(针对性的检查某函数前16个字节被修改了)怎么实现还是没太明白。 我知道win有ReadProcessMemory GetProcAddress这种东西可以读取这些 但是 ...
可拿text段和磁盘文件进行比较,解析下elf。rwxp属性可被还原,也可被remap,不太可靠。
雪    币: 962
活跃值: 活跃值 (4132)
能力值: ( LV7,RANK:115 )
在线值:
发帖
回帖
粉丝
Ssssone 活跃值 2 2021-8-1 15:42
11
0
咸鱼王 不过具体是哪个函数被hook了(针对性的检查某函数前16个字节被修改了)怎么实现还是没太明白。 我知道win有ReadProcessMemory GetProcAddress这种东西可以读取这些 但是 ...
linux下dl_open&dl_sym即可拿到函数地址
雪    币: 19067
活跃值: 活跃值 (406)
能力值: ( LV15,RANK:936 )
在线值:
发帖
回帖
粉丝
oooAooo 活跃值 9 2021-11-1 18:06
12
0
不错的思路,检测的核心在于PrettyMethod函数被hook,至于rwp标识,可以修改frida源码使用mprotect改为rxp既可。
雪    币: 159
活跃值: 活跃值 (1877)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
huaerxiela 活跃值 2021-11-16 11:10
13
0
oooAooo 不错的思路,检测的核心在于PrettyMethod函数被hook,至于rwp标识,可以修改frida源码使用mprotect改为rxp既可。
不错的思路,mprotect还是能解决一部分问题的。
游客
登录 | 注册 方可回帖
返回