首页
社区
课程
招聘
[原创]关于frida检测的一个新思路
发表于: 2021-7-26 15:18 33445

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

2021-7-26 15:18
33445

如今各大厂商的风控都开始注重检测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(完结


[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)

收藏
免费 17
支持
分享
最新回复 (15)
雪    币: 94
活跃值: (2397)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
2
666
2021-7-26 16:43
0
雪    币: 205
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
3
这个在程序里面要怎么取获取这一段数据呢 刚刚学习不太了解
2021-7-29 14:36
0
雪    币: 986
活跃值: (6167)
能力值: ( LV7,RANK:115 )
在线值:
发帖
回帖
粉丝
4
咸鱼王 这个在程序里面要怎么取获取这一段数据呢 刚刚学习不太了解[em_5]
https://github.com/lizhangqu/dlfcn_compat
2021-7-29 18:46
0
雪    币: 7309
活跃值: (3788)
能力值: (RANK:1130 )
在线值:
发帖
回帖
粉丝
5
可以的,针对性很强
照这个思路,还可以找到不少~~
2021-7-30 13:00
0
雪    币: 205
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
6
Ssssone https://github.com/lizhangqu/dlfcn_compat

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

2021-7-31 12:22
0
雪    币: 205
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
7
Ssssone https://github.com/lizhangqu/dlfcn_compat
不过具体是哪个函数被hook了(针对性的检查某函数前16个字节被修改了)怎么实现还是没太明白。 我知道win有ReadProcessMemory GetProcAddress这种东西可以读取这些 但是Android还是不太懂 求大佬详解一下
2021-7-31 12:26
0
雪    币: 14865
活跃值: (6088)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
你这个检测不仅仅是frida,而是所有hook检测,所以你的标题得改一下。如果其他so也hook该函数,是不是误判为frida?
2021-7-31 12:57
2
雪    币: 14865
活跃值: (6088)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
咸鱼王 不过具体是哪个函数被hook了(针对性的检查某函数前16个字节被修改了)怎么实现还是没太明白。 我知道win有ReadProcessMemory GetProcAddress这种东西可以读取这些 但是 ...
安卓一般是本进程内修改,因此只需修改内存为可写就可以修改函数入口。
2021-7-31 13:00
0
雪    币: 878
活跃值: (496)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
10
咸鱼王 不过具体是哪个函数被hook了(针对性的检查某函数前16个字节被修改了)怎么实现还是没太明白。 我知道win有ReadProcessMemory GetProcAddress这种东西可以读取这些 但是 ...
可拿text段和磁盘文件进行比较,解析下elf。rwxp属性可被还原,也可被remap,不太可靠。
2021-7-31 13:22
1
雪    币: 986
活跃值: (6167)
能力值: ( LV7,RANK:115 )
在线值:
发帖
回帖
粉丝
11
咸鱼王 不过具体是哪个函数被hook了(针对性的检查某函数前16个字节被修改了)怎么实现还是没太明白。 我知道win有ReadProcessMemory GetProcAddress这种东西可以读取这些 但是 ...
linux下dl_open&dl_sym即可拿到函数地址
2021-8-1 15:42
0
雪    币: 19097
活跃值: (1345)
能力值: ( LV15,RANK:936 )
在线值:
发帖
回帖
粉丝
12
不错的思路,检测的核心在于PrettyMethod函数被hook,至于rwp标识,可以修改frida源码使用mprotect改为rxp既可。
2021-11-1 18:06
1
雪    币: 181
活跃值: (2948)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
13
oooAooo 不错的思路,检测的核心在于PrettyMethod函数被hook,至于rwp标识,可以修改frida源码使用mprotect改为rxp既可。
不错的思路,mprotect还是能解决一部分问题的。
2021-11-16 11:10
0
雪    币: 20
活跃值: (963)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
14
tDasm 你这个检测不仅仅是frida,而是所有hook检测,所以你的标题得改一下。如果其他so也hook该函数,是不是误判为frida?
有一个弊端 如果是安全厂家这样做可能会导致误杀 因为有一些app开发者自己也会去hook libc和libart
2024-2-8 20:37
0
雪    币: 3090
活跃值: (30881)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
15
感谢分享
2024-2-9 18:06
2
雪    币: 400
活跃值: (790)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
Da_
16
请问大佬,这里说的“可以看到,libart.so的text段中有一页被改成了可读权限(特征:段变多了”,是说可写权限嘛
2024-10-14 19:10
0
游客
登录 | 注册 方可回帖
返回
//