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

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

2021-7-26 15:18
37076

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

 

葫芦娃大佬的项目完美隐藏了字符串特征:7b5K9s2c8@1M7s2y4Q4x3@1q4Q4x3V1k6Q4x3V1k6Y4K9i4c8Z5N6h3u0Q4x3X3g2U0L8$3#2Q4x3V1k6Z5L8s2g2%4j5g2)9J5c8Y4y4@1M7X3!0F1k6#2u0Q4x3X3c8X3M7X3W2V1j5g2)9J5k6r3q4F1k6s2u0G2K9h3b7`.

 

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

 

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源码里搜一下:17aK9s2c8@1M7s2y4Q4x3@1q4Q4x3V1k6Q4x3V1k6Y4K9i4c8Z5N6h3u0Q4x3X3g2U0L8$3#2Q4x3V1k6X3M7X3W2V1j5g2)9J5c8X3k6J5K9h3c8S2i4K6u0V1K9X3q4$3j5g2)9J5k6r3u0J5K9h3c8Y4k6g2)9J5c8X3u0D9L8$3u0Q4x3V1j5#2k6U0y4X3x3e0M7@1k6h3f1$3x3K6M7K6z5r3c8V1x3e0f1I4j5K6t1#2j5e0R3$3x3$3x3$3y4X3y4V1y4$3x3@1j5U0V1&6y4h3c8S2i4K6u0r3L8r3W2T1i4K6u0r3j5h3&6V1M7X3!0A6k6q4)9J5k6h3A6K6

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(完结


传播安全知识、拓宽行业人脉——看雪讲师团队等你加入!

收藏
免费 19
支持
分享
最新回复 (16)
雪    币: 94
活跃值: (4382)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
2
666
2021-7-26 16:43
0
雪    币: 205
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
3
这个在程序里面要怎么取获取这一段数据呢 刚刚学习不太了解
2021-7-29 14:36
0
雪    币: 986
活跃值: (6847)
能力值: ( LV7,RANK:115 )
在线值:
发帖
回帖
粉丝
4
咸鱼王 这个在程序里面要怎么取获取这一段数据呢 刚刚学习不太了解[em_5]
4ccK9s2c8@1M7s2y4Q4x3@1q4Q4x3V1k6Q4x3V1k6Y4K9i4c8Z5N6h3u0Q4x3X3g2U0L8$3#2Q4x3V1k6D9K9i4A6Z5j5h3&6Y4M7i4g2Q4x3V1k6V1L8r3k6U0L8W2)9#2k6X3y4G2L8i4m8S2N6l9`.`.
2021-7-29 18:46
0
雪    币: 7486
活跃值: (4209)
能力值: (RANK:1130 )
在线值:
发帖
回帖
粉丝
5
可以的,针对性很强
照这个思路,还可以找到不少~~
2021-7-30 13:00
0
雪    币: 205
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
6
Ssssone ab6K9s2c8@1M7s2y4Q4x3@1q4Q4x3V1k6Q4x3V1k6Y4K9i4c8Z5N6h3u0Q4x3X3g2U0L8$3#2Q4x3V1k6D9K9i4A6Z5j5h3&6Y4M7i4g2Q4x3V1k6V1L8r3k6U0L8W2)9#2k6X3y4G2L8i4m8S2N6l9`.`.

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

2021-7-31 12:22
0
雪    币: 205
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
7
Ssssone bf1K9s2c8@1M7s2y4Q4x3@1q4Q4x3V1k6Q4x3V1k6Y4K9i4c8Z5N6h3u0Q4x3X3g2U0L8$3#2Q4x3V1k6D9K9i4A6Z5j5h3&6Y4M7i4g2Q4x3V1k6V1L8r3k6U0L8W2)9#2k6X3y4G2L8i4m8S2N6l9`.`.
不过具体是哪个函数被hook了(针对性的检查某函数前16个字节被修改了)怎么实现还是没太明白。 我知道win有ReadProcessMemory GetProcAddress这种东西可以读取这些 但是Android还是不太懂 求大佬详解一下
2021-7-31 12:26
0
雪    币: 17050
活跃值: (8358)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
你这个检测不仅仅是frida,而是所有hook检测,所以你的标题得改一下。如果其他so也hook该函数,是不是误判为frida?
2021-7-31 12:57
2
雪    币: 17050
活跃值: (8358)
能力值: ( 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
活跃值: (6847)
能力值: ( LV7,RANK:115 )
在线值:
发帖
回帖
粉丝
11
咸鱼王 不过具体是哪个函数被hook了(针对性的检查某函数前16个字节被修改了)怎么实现还是没太明白。 我知道win有ReadProcessMemory GetProcAddress这种东西可以读取这些 但是 ...
linux下dl_open&dl_sym即可拿到函数地址
2021-8-1 15:42
0
雪    币: 19097
活跃值: (1480)
能力值: ( LV15,RANK:936 )
在线值:
发帖
回帖
粉丝
12
不错的思路,检测的核心在于PrettyMethod函数被hook,至于rwp标识,可以修改frida源码使用mprotect改为rxp既可。
2021-11-1 18:06
1
雪    币: 181
活跃值: (3962)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
13
oooAooo 不错的思路,检测的核心在于PrettyMethod函数被hook,至于rwp标识,可以修改frida源码使用mprotect改为rxp既可。
不错的思路,mprotect还是能解决一部分问题的。
2021-11-16 11:10
0
雪    币: 0
活跃值: (1753)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
14
tDasm 你这个检测不仅仅是frida,而是所有hook检测,所以你的标题得改一下。如果其他so也hook该函数,是不是误判为frida?
有一个弊端 如果是安全厂家这样做可能会导致误杀 因为有一些app开发者自己也会去hook libc和libart
2024-2-8 20:37
0
雪    币: 8861
活跃值: (33046)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
15
感谢分享
2024-2-9 18:06
2
雪    币: 427
活跃值: (1205)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
Da_
16
请问大佬,这里说的“可以看到,libart.so的text段中有一页被改成了可读权限(特征:段变多了”,是说可写权限嘛
2024-10-14 19:10
0
雪    币: 0
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
17
咸鱼王 不过具体是哪个函数被hook了(针对性的检查某函数前16个字节被修改了)怎么实现还是没太明白。 我知道win有ReadProcessMemory GetProcAddress这种东西可以读取这些 但是 ...
现在懂了吗哥哥,给我解释一下
2026-1-20 20:43
0
游客
登录 | 注册 方可回帖
返回