版权归作者所有,如有转发,请注明文章出处:https://cyrus-studio.github.io/blog/

前言

在 Android 逆向对抗中,Frida 检测始终是核心对抗点之一。

常见检测思路包括:

  • 进程检测

  • 内存特征

  • 调试检测

  • 端口扫描(默认 27042)

具体参考:Frida 检测与对抗实战:进程、maps、线程、符号全特征清除

早期方案通常通过扫描固定端口(如 27042),或者 AUTH/REJECT 协议特征来识别 frida-server,例如:

https://github.com/muellerberndt/frida-detection/blob/master/AntiFrida/app/src/main/cpp/native-lib.cpp

但在实际对抗中,存在两个明显问题:

  1. 端口可自定义:frida-server 可运行在任意端口,固定端口扫描失效

  2. 协议已演进:在 Frida 16+ 中,通信协议已从 AUTH/REJECT 切换为 WebSocket,原有特征完全失效

因此,本文从协议层入手,通过 tcpdump 抓包分析新版 Frida 的通信机制,提取稳定特征,并最终实现一个高精度 Frida 端口检测方案

使用 tcpdump 抓取本地 socket 通信

tcpdump 是一个基于 libpcap 的命令行抓包工具,用于捕获和过滤网络数据包,常用于网络调试、协议分析和安全研究。

相关链接

抓本地指定端口 socket 数据

tcpdump -i lo -nn -s 0 -A port 27042

说明:

  • -i lo:抓本地回环(frida-server 必须)

  • -A:以 ASCII 打印(可直接看到 AUTH / REJECT)

  • -s 0:完整包

tcpdump -i lo -nn -s 0 -XX port 27042
  • -X → hex + ASCII

  • -XX → 更完整(含链路层)

Frida 通信协议分析(16+)

抓包后,可以清晰看到完整通信流程:

vangogh:/ # tcpdump -i lo -nn -s 0 -XX port 1234
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on lo, link-type EN10MB (Ethernet), capture size 262144 bytes

// TCP 三次握手:客户端发送 SYN,请求连接 frida-server(1234 端口)
// Flags [S] SYN(建立连接)
12:19:07.151301 IP 127.0.0.1.46093 > 127.0.0.1.1234: Flags [S], seq 3435625590, win 65535, options [mss 65495,sackOK,TS val 976962460 ecr 0,nop,wscale 9], length 0
        0x0000:  0000 0000 0000 0000 0000 0000 0800 4500  ..............E.
        0x0010:  003c 7baa 4000 4006 c10f 7f00 0001 7f00  .<{.@.@.........
        0x0020:  0001 b40d 04d2 ccc7 7c76 0000 0000 a002  ........|v......
        0x0030:  ffff fe30 0000 0204 ffd7 0402 080a 3a3b  ...0..........:;
        0x0040:  439c 0000 0000 0103 0309                 C.........

// frida-server 返回 SYN+ACK,确认连接
12:19:07.151574 IP 127.0.0.1.1234 > 127.0.0.1.46093: Flags [S.], seq 3788896212, ack 3435625591, win 65535, options [mss 65495,sackOK,TS val 976962461 ecr 976962460,nop,wscale 9], length 0
        0x0000:  0000 0000 0000 0000 0000 0000 0800 4500  ..............E.
        0x0010:  003c 0000 4000 4006 3cba 7f00 0001 7f00  .<..@.@.<.......
        0x0020:  0001 04d2 b40d e1d5 f7d4 ccc7 7c77 a012  ............|w..
        0x0030:  ffff fe30 0000 0204 ffd7 0402 080a 3a3b  ...0..........:;
        0x0040:  439d 3a3b 439c 0103 0309                 C.:;C.....

// 客户端 ACK,三次握手完成
12:19:07.151756 IP 127.0.0.1.46093 > 127.0.0.1.1234: Flags [.], ack 1, win 128, options [nop,nop,TS val 976962461 ecr 976962461], length 0
        0x0000:  0000 0000 0000 0000 0000 0000 0800 4500  ..............E.
        0x0010:  0034 7bab 4000 4006 c116 7f00 0001 7f00  .4{.@.@.........
        0x0020:  0001 b40d 04d2 ccc7 7c77 e1d5 f7d5 8010  ........|w......
        0x0030:  0080 fe28 0000 0101 080a 3a3b 439d 3a3b  ...(......:;C.:;
        0x0040:  439d                                     C.

// 客户端发送 HTTP 请求(Frida 16+ 使用 WebSocket 而不是 AUTH/REJECT)
// "GET /ws HTTP/1.1" → WebSocket 握手路径
// "Upgrade: websocket"
// "Connection: Upgrade"
// "Sec-WebSocket-Key"
// "User-Agent: Frida/16.7.19" → 明确指纹(关键特征)
12:19:07.157053 IP 127.0.0.1.46093 > 127.0.0.1.1234: Flags [P.], seq 1:178, ack 1, win 128, options [nop,nop,TS val 976962466 ecr 976962461], length 177
        0x0000:  0000 0000 0000 0000 0000 0000 0800 4500  ..............E.
        0x0010:  00e5 7bac 4000 4006 c064 7f00 0001 7f00  ..{.@.@..d......
        0x0020:  0001 b40d 04d2 ccc7 7c77 e1d5 f7d5 8018  ........|w......
        0x0030:  0080 fed9 0000 0101 080a 3a3b 43a2 3a3b  ..........:;C.:;
        0x0040:  439d 4745 5420 2f77 7320 4854 5450 2f31  C.GET./ws.HTTP/1
        0x0050:  2e31 0d0a 5570 6772 6164 653a 2077 6562  .1..Upgrade:.web
        0x0060:  736f 636b 6574 0d0a 436f 6e6e 6563 7469  socket..Connecti
        0x0070:  6f6e 3a20 5570 6772 6164 650d 0a53 6563  on:.Upgrade..Sec
        0x0080:  2d57 6562 536f 636b 6574 2d4b 6579 3a20  -WebSocket-Key:.
        0x0090:  5558 665a 3154 7644 534b 6a50 484f 306c  UXfZ1TvDSKjPHO0l
        0x00a0:  382f 526c 2f77 3d3d 0d0a 5365 632d 5765  8/Rl/w==..Sec-We
        0x00b0:  6253 6f63 6b65 742d 5665 7273 696f 6e3a  bSocket-Version:
        0x00c0:  2031 330d 0a48 6f73 743a 2031 3237 2e30  .13..Host:.127.0
        0x00d0:  2e30 2e31 0d0a 5573 6572 2d41 6765 6e74  .0.1..User-Agent
        0x00e0:  3a20 4672 6964 612f 3136 2e37 2e31 390d  :.Frida/16.7.19.
        0x00f0:  0a0d 0a                                  ...

// 服务端 ACK(确认收到)
12:19:07.157284 IP 127.0.0.1.1234 > 127.0.0.1.46093: Flags [.], ack 178, win 131, options [nop,nop,TS val 976962466 ecr 976962466], length 0
        0x0000:  0000 0000 0000 0000 0000 0000 0800 4500  ..............E.
        0x0010:  0034 557b 4000 4006 e746 7f00 0001 7f00  .4U{@.@..F......
        0x0020:  0001 04d2 b40d e1d5 f7d5 ccc7 7d28 8010  ............}(..
        0x0030:  0083 fe28 0000 0101 080a 3a3b 43a2 3a3b  ...(......:;C.:;
        0x0040:  43a2     

// frida-server 返回 HTTP 101  
// "HTTP/1.1 101 Switching Protocols"
// WebSocket 升级成功
12:19:07.158770 IP 127.0.0.1.1234 > 127.0.0.1.46093: Flags [P.], seq 1:167, ack 178, win 131, options [nop,nop,TS val 976962468 ecr 976962466], length 166
        0x0000:  0000 0000 0000 0000 0000 0000 0800 4500  ..............E.
        0x0010:  00da 557c 4000 4006 e69f 7f00 0001 7f00  ..U|@.@.........
        0x0020:  0001 04d2 b40d e1d5 f7d5 ccc7 7d28 8018  ............}(..
        0x0030:  0083 fece 0000 0101 080a 3a3b 43a4 3a3b  ..........:;C.:;
        0x0040:  43a2 4854 5450 2f31 2e31 2031 3031 2053  C.HTTP/1.1.101.S
        0x0050:  7769 7463 6869 6e67 2050 726f 746f 636f  witching.Protoco
        0x0060:  6c73 0d0a 4461 7465 3a20 5468 752c 2030  ls..Date:.Thu,.0
        0x0070:  3220 4170 7220 3230 3236 2030 343a 3139  2.Apr.2026.04:19
        0x0080:  3a30 3720 474d 540d 0a55 7067 7261 6465  :07.GMT..Upgrade
        0x0090:  3a20 7765 6273 6f63 6b65 740d 0a43 6f6e  :.websocket..Con
        0x00a0:  6e65 6374 696f 6e3a 2055 7067 7261 6465  nection:.Upgrade
        0x00b0:  0d0a 5365 632d 5765 6253 6f63 6b65 742d  ..Sec-WebSocket-
        0x00c0:  4163 6365 7074 3a20 4e31 454c 7442 5039  Accept:.N1ELtBP9
        0x00d0:  5776 3468 5a74 734b 312b 5336 742f 3966  Wv4hZtsK1+S6t/9f
        0x00e0:  544c 413d 0d0a 0d0a                      TLA=....

// 客户端确认收到 frida-server 前面 166 字节数据包
12:19:07.158989 IP 127.0.0.1.46093 > 127.0.0.1.1234: Flags [.], ack 167, win 131, options [nop,nop,TS val 976962468 ecr 976962468], length 0
        0x0000:  0000 0000 0000 0000 0000 0000 0800 4500  ..............E.
        0x0010:  0034 7bad 4000 4006 c114 7f00 0001 7f00  .4{.@.@.........
        0x0020:  0001 b40d 04d2 ccc7 7d28 e1d5 f87b 8010  ........}(...{..
        0x0030:  0083 fe28 0000 0101 080a 3a3b 43a4 3a3b  ...(......:;C.:;
        0x0040:  43a4                                     C.
// === 到此为止:WebSocket 握手完成 === 


// WebSocket 数据帧(已进入 Frida RPC 层,非明文)
12:19:07.164808 IP 127.0.0.1.46093 > 127.0.0.1.1234: Flags [P.], seq 178:436, ack 167, win 131, options [nop,nop,TS val 976962474 ecr 976962468], length 258
        0x0000:  0000 0000 0000 0000 0000 0000 0800 4500  ..............E.
        0x0010:  0136 7bae 4000 4006 c011 7f00 0001 7f00  .6{.@.@.........
        0x0020:  0001 b40d 04d2 ccc7 7d28 e1d5 f87b 8018  ........}(...{..
        0x0030:  0083 ff2a 0000 0101 080a 3a3b 43aa 3a3b  ...*......:;C.:;
        0x0040:  43a4 82ec d1ad 0192 bdac 0093 d5ad 0192  C...............
        0x0050:  d0ad 0192 84ad 0192 d0ac 6e92 c4ad 0192  ..........n.....
        0x0060:  fedf 64bd b7df 68f6 b082 49fd a2d9 52f7  ..d...h...I...R.
        0x0070:  a2de 68fd bfad 0192 d3ac 7292 c7ad 0192  ..h.......r.....
        0x0080:  a3c8 2ff4 a3c4 65f3 ffe5 6ee1 a5fe 64e1  ../...e...n...d.
        0x0090:  a2c4 6efc e09b 0192 d9ac 6692 d0d8 0192  ..n.......f.....
        0x00a0:  d2ac 7292 d5ad 0192 81c4 6ff5 d1ad 0192  ..r.......o.....
        0x00b0:  cfad 0192 82fe 0088 963f 3ca7 fa3e 3ca6  .........?<..><.
        0x00c0:  9e3f 3ca7 943f 3ca7 e63f 3ca7 973e 53a7  .?<..?<..?<..>S.
        0x00d0:  833f 3ca7 b94d 5988 f04d 55c3 f710 74c8  .?<..MY..MU...t.
        0x00e0:  e54b 6fc2 e54c 55c8 f83f 3ca7 943e 4fa7  .Ko..LU..?<..>O.
        0x00f0:  803f 3ca7 e45a 12c1 e456 58c6 b877 53d4  .?<..Z...VX..wS.
        0x0100:  e26c 59d4 e556 53c9 a709 3ca7 9e3e 5ba7  .lY..VS...<..>[.
        0x0110:  935e 47d4 e042 3ca7 963f 3ca7 953e 4fa7  .^G..B<..?<..>O.
        0x0120:  813f 3ca7 d15a 48e1 e450 52d3 fb50 4fd3  .?<..ZH..PR..PO.
        0x0130:  d74f 4ccb ff5c 5dd3 ff50 52a7 963f 3ca7  .OL..\]..PR..?<.
        0x0140:  963f 3ca7                                .?<.

12:19:07.204426 IP 127.0.0.1.1234 > 127.0.0.1.46093: Flags [.], ack 436, win 133, options [nop,nop,TS val 976962513 ecr 976962474], length 0
        0x0000:  0000 0000 0000 0000 0000 0000 0800 4500  ..............E.
        0x0010:  0034 557d 4000 4006 e744 7f00 0001 7f00  .4U}@.@..D......
        0x0020:  0001 04d2 b40d e1d5 f87b ccc7 7e2a 8010  .........{..~*..
        0x0030:  0085 fe28 0000 0101 080a 3a3b 43d1 3a3b  ...(......:;C.:;
        0x0040:  43aa                                     C.

12:19:07.248471 IP 127.0.0.1.1234 > 127.0.0.1.46093: Flags [P.], seq 167:265, ack 436, win 133, options [nop,nop,TS val 976962557 ecr 976962474], length 98
        0x0000:  0000 0000 0000 0000 0000 0000 0800 4500  ..............E.
        0x0010:  0096 557e 4000 4006 e6e1 7f00 0001 7f00  ..U~@.@.........
        0x0020:  0001 04d2 b40d e1d5 f87b ccc7 7e2a 8018  .........{..~*..
        0x0030:  0085 fe8a 0000 0101 080a 3a3b 43fd 3a3b  ..........:;C.:;
        0x0040:  43aa 8260 6c02 0101 3800 0000 0100 0000  C..`l...8.......
        0x0050:  1800 0000 0801 6700 0a28 7373 7561 7b73  ......g..(ssua{s
        0x0060:  767d 2900 0501 7500 0200 0000 1100 0000  v})...u.........
        0x0070:  636f 6d2e 6379 7275 732e 6578 616d 706c  com.cyrus.exampl
        0x0080:  6500 0000 0e00 0000 416e 6472 6f69 6445  e.......AndroidE
        0x0090:  7861 6d70 6c65 0000 2f0d 0000 0000 0000  xample../.......
        0x00a0:  0000 0000                                ....
12:19:07.253754 IP 127.0.0.1.46093 > 127.0.0.1.1234: Flags [P.], seq 436:562, ack 265, win 131, options [nop,nop,TS val 976962563 ecr 976962557], length 126
        0x0000:  0000 0000 0000 0000 0000 0000 0800 4500  ..............E.
        0x0010:  00b2 7baf 4000 4006 c094 7f00 0001 7f00  ..{.@.@.........
        0x0020:  0001 b40d 04d2 ccc7 7e2a e1d5 f8dd 8018  ........~*......
        0x0030:  0083 fea6 0000 0101 080a 3a3b 4403 3a3b  ..........:;D.:;
        0x0040:  43fd 82f8 9063 943d fc62 943c 9863 943d  C....c.=.b.<.c.=
        0x0050:  9363 943d cf63 943d 9162 fb3d 8563 943d  .c.=.c.=.b.=.c.=
        0x0060:  bf11 f112 f611 fd59 f14c dc52 e317 c758  .......Y.L.R...X
        0x0070:  e310 fd52 fe63 943d 9262 e73d 8663 943d  ...R.c.=.b.=.c.=
        0x0080:  e206 ba5b e20a f05c be2b fb4e e430 f14e  ...[...\.+.N.0.N
        0x0090:  e30a fb53 a155 943d 9862 f33d 9616 f546  ...S.U.=.b.=...F
        0x00a0:  e315 e93d 9063 943d 9362 e73d 9663 943d  ...=.c.=.b.=.c.=
        0x00b0:  d117 e05c f30b 943d bf6e 943d 9063 943d  ...\...=.n.=.c.=
12:19:07.253952 IP 127.0.0.1.1234 > 127.0.0.1.46093: Flags [.], ack 562, win 133, options [nop,nop,TS val 976962563 ecr 976962563], length 0
        0x0000:  0000 0000 0000 0000 0000 0000 0800 4500  ..............E.
        0x0010:  0034 557f 4000 4006 e742 7f00 0001 7f00  .4U.@.@..B......
        0x0020:  0001 04d2 b40d e1d5 f8dd ccc7 7ea8 8010  ............~...
        0x0030:  0085 fe28 0000 0101 080a 3a3b 4403 3a3b  ...(......:;D.:;
        0x0040:  4403                                     D.
12:19:08.252403 IP 127.0.0.1.46093 > 127.0.0.1.1234: Flags [.], ack 265, win 131, options [nop,nop,TS val 976963561 ecr 976962563], length 0
        0x0000:  0000 0000 0000 0000 0000 0000 0800 4500  ..............E.
        0x0010:  0034 7bb0 4000 4006 c111 7f00 0001 7f00  .4{.@.@.........
        0x0020:  0001 b40d 04d2 ccc7 7ea7 e1d5 f8dd 8010  ........~.......
        0x0030:  0083 fe28 0000 0101 080a 3a3b 47e9 3a3b  ...(......:;G.:;
        0x0040:  4403                                     D.
12:19:08.252565 IP 127.0.0.1.1234 > 127.0.0.1.46093: Flags [.], ack 562, win 133, options [nop,nop,TS val 976963562 ecr 976962563], length 0
        0x0000:  0000 0000 0000 0000 0000 0000 0800 4500  ..............E.
        0x0010:  0034 5580 4000 4006 e741 7f00 0001 7f00  .4U.@.@..A......
        0x0020:  0001 04d2 b40d e1d5 f8dd ccc7 7ea8 8010  ............~...
        0x0030:  0085 fe28 0000 0101 080a 3a3b 47ea 3a3b  ...(......:;G.:;
        0x0040:  4403                                     D.
12:19:08.895180 IP 127.0.0.1.1234 > 127.0.0.1.46093: Flags [P.], seq 265:380, ack 562, win 133, options [nop,nop,TS val 976964204 ecr 976962563], length 115
        0x0000:  0000 0000 0000 0000 0000 0000 0800 4500  ..............E.
        0x0010:  00a7 5581 4000 4006 e6cd 7f00 0001 7f00  ..U.@.@.........
        0x0020:  0001 04d2 b40d e1d5 f8dd ccc7 7ea8 8018  ............~...
        0x0030:  0085 fe9b 0000 0101 080a 3a3b 4a6c 3a3b  ..........:;Jl:;
        0x0040:  4403 8271 6c03 0101 2900 0000 0200 0000  D..ql...).......
        0x0050:  3800 0000 0401 7300 1800 0000 7265 2e66  8.....s.....re.f
        0x0060:  7269 6461 2e45 7272 6f72 2e54 7261 6e73  rida.Error.Trans
        0x0070:  706f 7274 0000 0000 0000 0000 0801 6700  port..........g.
        0x0080:  0173 0000 0501 7500 0300 0000 2400 0000  .s....u.....$...
        0x0090:  4167 656e 7420 636f 6e6e 6563 7469 6f6e  Agent.connection
        0x00a0:  2063 6c6f 7365 6420 756e 6578 7065 6374  .closed.unexpect
        0x00b0:  6564 6c79 00                             edly.
12:19:08.932256 IP 127.0.0.1.46093 > 127.0.0.1.1234: Flags [.], ack 380, win 131, options [nop,nop,TS val 976964241 ecr 976964204], length 0
        0x0000:  0000 0000 0000 0000 0000 0000 0800 4500  ..............E.
        0x0010:  0034 7bb1 4000 4006 c110 7f00 0001 7f00  .4{.@.@.........
        0x0020:  0001 b40d 04d2 ccc7 7ea8 e1d5 f950 8010  ........~....P..
        0x0030:  0083 fe28 0000 0101 080a 3a3b 4a91 3a3b  ...(......:;J.:;
        0x0040:  4a6c                                     Jl
12:19:09.062493 IP 127.0.0.1.1234 > 127.0.0.1.46093: Flags [P.], seq 380:2904, ack 562, win 133, options [nop,nop,TS val 976964371 ecr 976964241], length 2524
        0x0000:  0000 0000 0000 0000 0000 0000 0800 4500  ..............E.
        0x0010:  0a10 5582 4000 4006 dd63 7f00 0001 7f00  ..U.@.@..c......
        0x0020:  0001 04d2 b40d e1d5 f950 ccc7 7ea8 8018  .........P..~...
        0x0030:  0085 0805 0000 0101 080a 3a3b 4b13 3a3b  ..........:;K.:;
        0x0040:  4a91 827e 09d8 6c04 0101 5809 0000 0300  J..~..l...X.....
        0x0050:  0000 6f00 0000 0101 6f00 1500 0000 2f72  ..o.....o...../r
        0x0060:  652f 6672 6964 612f 486f 7374 5365 7373  e/frida/HostSess
        0x0070:  696f 6e00 0000 0201 7300 1600 0000 7265  ion.....s.....re
        0x0080:  2e66 7269 6461 2e48 6f73 7453 6573 7369  .frida.HostSessi
        0x0090:  6f6e 3136 0000 0801 6700 0b28 7573 7373  on16....g..(usss
        0x00a0:  617b 7376 7d29 0000 0000 0000 0000 0301  a{sv})..........
        0x00b0:  7300 0e00 0000 5072 6f63 6573 7343 7261  s.....ProcessCra
        0x00c0:  7368 6564 0000 2f0d 0000 0f00 0000 6d2e  shed../.......m.
        0x00d0:  6379 7275 732e 6578 616d 706c 6500 1200  cyrus.example...
        0x00e0:  0000 5349 4754 5241 5020 5452 4150 5f42  ..SIGTRAP.TRAP_B
        0x00f0:  524b 5054 0000 1c09 0000 2a2a 2a20 2a2a  RKPT......***.**
        0x0100:  2a20 2a2a 2a20 2a2a 2a20 2a2a 2a20 2a2a  *.***.***.***.**
        0x0110:  2a20 2a2a 2a20 2a2a 2a20 2a2a 2a20 2a2a  *.***.***.***.**
        0x0120:  2a20 2a2a 2a20 2a2a 2a20 2a2a 2a20 2a2a  *.***.***.***.**
        0x0130:  2a20 2a2a 2a20 2a2a 2a0a 4275 696c 6420  *.***.***.Build.
        0x0140:  6669 6e67 6572 7072 696e 743a 2027 5869  fingerprint:.'Xi
        0x0150:  616f 6d69 2f76 616e 676f 6768 2f76 616e  aomi/vangogh/van
        0x0160:  676f 6768 3a31 322f 534b 5131 2e32 3131  gogh:12/SKQ1.211
        0x0170:  3030 362e 3030 312f 5631 332e 302e 392e  006.001/V13.0.9.
        0x0180:  302e 534a 5643 4e58 4d3a 7573 6572 2f72  0.SJVCNXM:user/r
        0x0190:  656c 6561 7365 2d6b 6579 7327 0a52 6576  elease-keys'.Rev
        0x01a0:  6973 696f 6e3a 2027 3027 0a41 4249 3a20  ision:.'0'.ABI:.
        0x01b0:  2761 726d 3634 270a 5469 6d65 7374 616d  'arm64'.Timestam
        0x01c0:  703a 2032 3032 362d 3034 2d30 3220 3132  p:.2026-04-02.12
        0x01d0:  3a31 393a 3037 2e38 3032 3532 3032 3932  :19:07.802520292
        0x01e0:  2b30 3830 300a 5072 6f63 6573 7320 7570  +0800.Process.up
        0x01f0:  7469 6d65 3a20 3073 0a43 6d64 6c69 6e65  time:.0s.Cmdline
        0x0200:  3a20 636f 6d2e 6379 7275 732e 6578 616d  :.com.cyrus.exam
        0x0210:  706c 650a 7069 643a 2033 3337 352c 2074  ple.pid:.3375,.t
        0x0220:  6964 3a20 3237 3930 342c 206e 616d 653a  id:.27904,.name:
        0x0230:  206d 2e63 7972 7573 2e65 7861 6d70 6c65  .m.cyrus.example
        0x0240:  2020 3e3e 3e20 636f 6d2e 6379 7275 732e  ..>>>.com.cyrus.
        0x0250:  6578 616d 706c 6520 3c3c 3c0a 7569 643a  example.<<<.uid:
        0x0260:  2031 3032 3932 0a73 6967 6e61 6c20 3520  .10292.signal.5.
        0x0270:  2853 4947 5452 4150 292c 2063 6f64 6520  (SIGTRAP),.code.
        0x0280:  3120 2854 5241 505f 4252 4b50 5429 2c20  1.(TRAP_BRKPT),.
        0x0290:  6661 756c 7420 6164 6472 2030 7837 3237  fault.addr.0x727
        0x02a0:  6137 3439 3363 380a 2020 2020 7830 2020  a7493c8.....x0..
        0x02b0:  3030 3030 3030 3030 3030 3030 3030 3030  0000000000000000
        0x02c0:  2020 7831 2020 3030 3030 3030 3030 3030  ..x1..0000000000
        0x02d0:  3064 3130 3030 2020 7832 2020 3030 3030  0d1000..x2..0000
        0x02e0:  3030 3030 3030 3030 3030 3031 2020 7833  000000000001..x3
        0x02f0:  2020 3666 3736 3635 3566 3633 3638 3662  ..6f76655f63686b
        0x0300:  3030 0a20 2020 2078 3420 2030 3030 3030  00.....x4..00000
        0x0310:  3038 3030 3030 3030 3030 3020 2078 3520  08000000000..x5.
        0x0320:  2036 6637 3636 3535 6636 3336 3836 6230  .6f76655f63686b0
        0x0330:  3020 2078 3620 2030 3030 3030 3030 3038  0..x6..000000008
        0x0340:  3030 3030 3030 3020 2078 3720 2030 3030  0000000..x7..000
        0x0350:  3030 3030 3030 3030 3030 6337 350a 2020  0000000000c75...
        0x0360:  2020 7838 2020 3030 3030 3030 3030 3030  ..x8..0000000000
        0x0370:  3030 3030 3031 2020 7839 2020 3030 3030  000001..x9..0000
        0x0380:  3030 3030 3030 3030 3030 3031 2020 7831  000000000001..x1
        0x0390:  3020 3030 3030 3030 3030 3030 3030 3030  0.00000000000000
        0x03a0:  3030 2020 7831 3120 3030 3030 3030 3030  00..x11.00000000
        0x03b0:  3138 3532 3361 6165 0a20 2020 2078 3132  18523aae.....x12
        0x03c0:  2030 3030 3030 3037 3237 6137 3032 3035  .000000727a70205
        0x03d0:  3020 2078 3133 2030 3030 3030 3030 3030  0..x13.000000000
        0x03e0:  3030 3030 3030 3020 2078 3134 2030 3030  0000000..x14.000
        0x03f0:  3030 3030 3030 3030 3030 3030 3020 2078  0000000000000..x
        0x0400:  3135 2030 3030 3030 3030 3030 3030 3030  15.0000000000000
        0x0410:  3030 300a 2020 2020 7831 3620 3030 3030  000.....x16.0000
        0x0420:  3030 3732 3761 3831 6263 3538 2020 7831  00727a81bc58..x1
        0x0430:  3720 3030 3030 3030 3732 3761 3765 6433  7.000000727a7ed3
        0x0440:  3430 2020 7831 3820 3030 3030 3030 3731  40..x18.00000071
        0x0450:  3437 3565 3630 3030 2020 7831 3920 3030  475e6000..x19.00
        0x0460:  3030 3030 3732 3739 3563 6266 3730 0a20  000072795cbf70..
        0x0470:  2020 2078 3230 2030 3030 3030 3037 3237  ...x20.000000727
        0x0480:  6138 3166 3439 3820 2078 3231 2030 3030  a81f498..x21.000
        0x0490:  3030 3037 3237 6138 3163 6364 3820 2078  000727a81ccd8..x
        0x04a0:  3232 2030 3030 3030 3037 3134 6436 6132  22.000000714d6a2
        0x04b0:  3762 3020 2078 3233 2030 3030 3030 3037  7b0..x23.0000007
        0x04c0:  3237 3935 6362 6561 300a 2020 2020 7832  2795cbea0.....x2
        0x04d0:  3420 3030 3030 3030 3030 3030 3030 3030  4.00000000000000
        0x04e0:  3030 2020 7832 3520 3030 3030 3030 3732  00..x25.00000072
        0x04f0:  3739 3563 6265 6130 2020 7832 3620 3030  795cbea0..x26.00
        0x0500:  3030 3030 3732 3739 3661 3435 3330 2020  000072796a4530..
        0x0510:  7832 3720 3030 3030 3030 3732 3761 3831  x27.000000727a81
        0x0520:  6533 3438 0a20 2020 2078 3238 2030 3030  e348.....x28.000
        0x0530:  3030 3037 3237 3836 3035 6464 3020 2078  0007278605dd0..x
        0x0540:  3239 2030 3030 3030 3037 3134 6436 6132  29.000000714d6a2
        0x0550:  3661 300a 2020 2020 6c72 2020 3030 3030  6a0.....lr..0000
        0x0560:  3030 3732 3761 3733 6639 3763 2020 7370  00727a73f97c..sp
        0x0570:  2020 3030 3030 3030 3731 3464 3661 3236  ..000000714d6a26
        0x0580:  6130 2020 7063 2020 3030 3030 3030 3732  a0..pc..00000072
        0x0590:  3761 3734 3933 6338 2020 7073 7420 3030  7a7493c8..pst.00
        0x05a0:  3030 3030 3030 3630 3030 3030 3030 0a62  00000060000000.b
        0x05b0:  6163 6b74 7261 6365 3a0a 2020 2020 2020  acktrace:.......
        0x05c0:  2330 3020 7063 2030 3030 3030 3030 3030  #00.pc.000000000
        0x05d0:  3030 3535 3363 3820 202f 6170 6578 2f63  00553c8../apex/c
        0x05e0:  6f6d 2e61 6e64 726f 6964 2e72 756e 7469  om.android.runti
        0x05f0:  6d65 2f62 696e 2f6c 696e 6b65 7236 3421  me/bin/linker64!
        0x0600:  6c64 2d61 6e64 726f 6964 2e73 6f20 2872  ld-android.so.(r
        0x0610:  746c 645f 6462 5f64 6c61 6374 6976 6974  tld_db_dlactivit
        0x0620:  792b 3029 2028 4275 696c 6449 643a 2032  y+0).(BuildId:.2
        0x0630:  3539 3330 3036 6631 3864 3531 3630 3237  593006f18d516027
        0x0640:  3732 3062 3562 6136 3966 6334 3833 6129  720b5ba69fc483a)
        0x0650:  0a20 2020 2020 2023 3031 2070 6320 3030  .......#01.pc.00
        0x0660:  3030 3030 3030 3030 3034 6239 3738 2020  0000000004b978..
        0x0670:  2f61 7065 782f 636f 6d2e 616e 6472 6f69  /apex/com.androi
        0x0680:  642e 7275 6e74 696d 652f 6269 6e2f 6c69  d.runtime/bin/li
        0x0690:  6e6b 6572 3634 2028 5f5f 646c 5f6e 6f74  nker64.(__dl_not
        0x06a0:  6966 795f 6764 625f 6f66 5f6c 6f61 642b  ify_gdb_of_load+
        0x06b0:  3536 2920 2842 7569 6c64 4964 3a20 3235  56).(BuildId:.25
        0x06c0:  3933 3030 3666 3138 6435 3136 3032 3737  93006f18d5160277
        0x06d0:  3230 6235 6261 3639 6663 3438 3361 290a  20b5ba69fc483a).
        0x06e0:  2020 2020 2020 2330 3220 7063 2030 3030  ......#02.pc.000
        0x06f0:  3030 3030 3030 3030 3366 3839 3420 202f  000000003f894../
        0x0700:  6170 6578 2f63 6f6d 2e61 6e64 726f 6964  apex/com.android
        0x0710:  2e72 756e 7469 6d65 2f62 696e 2f6c 696e  .runtime/bin/lin
        0x0720:  6b65 7236 3420 285f 5f64 6c5f 5f5a 4e36  ker64.(__dl__ZN6
        0x0730:  736f 696e 666f 3130 6c69 6e6b 5f69 6d61  soinfo10link_ima
        0x0740:  6765 4552 4b31 3653 796d 626f 6c4c 6f6f  geERK16SymbolLoo
        0x0750:  6b75 704c 6973 7450 535f 504b 3137 616e  kupListPS_PK17an
        0x0760:  6472 6f69 645f 646c 6578 7469 6e66 6f50  droid_dlextinfoP
        0x0770:  6d2b 3435 3629 2028 4275 696c 6449 643a  m+456).(BuildId:
        0x0780:  2032 3539 3330 3036 6631 3864 3531 3630  .2593006f18d5160
        0x0790:  3237 3732 3062 3562 6136 3966 6334 3833  27720b5ba69fc483
        0x07a0:  6129 0a20 2020 2020 2023 3033 2070 6320  a).......#03.pc.
        0x07b0:  3030 3030 3030 3030 3030 3033 6138 3134  000000000003a814
        0x07c0:  2020 2f61 7065 782f 636f 6d2e 616e 6472  ../apex/com.andr
        0x07d0:  6f69 642e 7275 6e74 696d 652f 6269 6e2f  oid.runtime/bin/
        0x07e0:  6c69 6e6b 6572 3634 2028 5f5f 646c 5f5f  linker64.(__dl__
        0x07f0:  5a31 3466 696e 645f 6c69 6272 6172 6965  Z14find_librarie
        0x0800:  7350 3139 616e 6472 6f69 645f 6e61 6d65  sP19android_name
        0x0810:  7370 6163 655f 7450 3673 6f69 6e66 6f50  space_tP6soinfoP
        0x0820:  4b50 4b63 6d50 5332 5f50 4e53 7433 5f5f  KPKcmPS2_PNSt3__
        0x0830:  3136 7665 6374 6f72 4953 325f 4e53 385f  16vectorIS2_NS8_
        0x0840:  3961 6c6c 6f63 6174 6f72 4953 325f 4545  9allocatorIS2_EE
        0x0850:  4545 6d69 504b 3137 616e 6472 6f69 645f  EEmiPK17android_
        0x0860:  646c 6578 7469 6e66 6f62 504e 5339 5f49  dlextinfobPNS9_I
        0x0870:  5330 5f4e 5341 5f49 5330 5f45 4545 452b  S0_NSA_IS0_EEEE+
        0x0880:  3432 3536 2920 2842 7569 6c64 4964 3a20  4256).(BuildId:.
        0x0890:  3235 3933 3030 3666 3138 6435 3136 3032  2593006f18d51602
        0x08a0:  3737 3230 6235 6261 3639 6663 3438 3361  7720b5ba69fc483a
        0x08b0:  290a 2020 2020 2020 2330 3420 7063 2030  ).......#04.pc.0
        0x08c0:  3030 3030 3030 3030 3030 3363 6638 3820  00000000003cf88.
        0x08d0:  202f 6170 6578 2f63 6f6d 2e61 6e64 726f  ./apex/com.andro
        0x08e0:  6964 2e72 756e 7469 6d65 2f62 696e 2f6c  id.runtime/bin/l
        0x08f0:  696e 6b65 7236 3420 285f 5f64 6c5f 5f5a  inker64.(__dl__Z
        0x0900:  3964 6f5f 646c 6f70 656e 504b 6369 504b  9do_dlopenPKciPK
        0x0910:  3137 616e 6472 6f69 645f 646c 6578 7469  17android_dlexti
        0x0920:  6e66 6f50 4b76 2b32 3134 3029 2028 4275  nfoPKv+2140).(Bu
        0x0930:  696c 6449 643a 2032 3539 3330 3036 6631  ildId:.2593006f1
        0x0940:  3864 3531 3630 3237 3732 3062 3562 6136  8d516027720b5ba6
        0x0950:  3966 6334 3833 6129 0a20 2020 2020 2023  9fc483a).......#
        0x0960:  3035 2070 6320 3030 3030 3030 3030 3030  05.pc.0000000000
        0x0970:  3033 3831 6638 2020 2f61 7065 782f 636f  0381f8../apex/co
        0x0980:  6d2e 616e 6472 6f69 642e 7275 6e74 696d  m.android.runtim
        0x0990:  652f 6269 6e2f 6c69 6e6b 6572 3634 2028  e/bin/linker64.(
        0x09a0:  5f5f 6c6f 6164 6572 5f64 6c6f 7065 6e2b  __loader_dlopen+
        0x09b0:  3830 2920 2842 7569 6c64 4964 3a20 3235  80).(BuildId:.25
        0x09c0:  3933 3030 3666 3138 6435 3136 3032 3737  93006f18d5160277
        0x09d0:  3230 6235 6261 3639 6663 3438 3361 290a  20b5ba69fc483a).
        0x09e0:  2020 2020 2020 2330 3620 7063 2030 3030  ......#06.pc.000
        0x09f0:  3030 3030 3030 3030 3030 3232 3020 203c  0000000000220..<
        0x0a00:  616e 6f6e 796d 6f75 733a 3732 3633 3532  anonymous:726352
        0x0a10:  6630 3030 3e0a 0000 0000 0000 0000       f000>.........
12:19:09.062667 IP 127.0.0.1.46093 > 127.0.0.1.1234: Flags [.], ack 2904, win 140, options [nop,nop,TS val 976964372 ecr 976964371], length 0
        0x0000:  0000 0000 0000 0000 0000 0000 0800 4500  ..............E.
        0x0010:  0034 7bb2 4000 4006 c10f 7f00 0001 7f00  .4{.@.@.........
        0x0020:  0001 b40d 04d2 ccc7 7ea8 e1d6 032c 8010  ........~....,..
        0x0030:  008c fe28 0000 0101 080a 3a3b 4b14 3a3b  ...(......:;K.:;
        0x0040:  4b13                                     K.
12:19:09.110836 IP 127.0.0.1.46093 > 127.0.0.1.1234: Flags [P.], seq 562:577, ack 2904, win 140, options [nop,nop,TS val 976964420 ecr 976964371], length 15
        0x0000:  0000 0000 0000 0000 0000 0000 0800 4500  ..............E.
        0x0010:  0043 7bb3 4000 4006 c0ff 7f00 0001 7f00  .C{.@.@.........
        0x0020:  0001 b40d 04d2 ccc7 7ea8 e1d6 032c 8018  ........~....,..
        0x0030:  008c fe37 0000 0101 080a 3a3b 4b44 3a3b  ...7......:;KD:;
        0x0040:  4b13 8889 e802 c453 ebea 873f 8771 ad3d  K......S...?.q.=
        0x0050:  8f                                       .
12:19:09.110946 IP 127.0.0.1.1234 > 127.0.0.1.46093: Flags [.], ack 577, win 133, options [nop,nop,TS val 976964420 ecr 976964420], length 0
        0x0000:  0000 0000 0000 0000 0000 0000 0800 4500  ..............E.
        0x0010:  0034 5583 4000 4006 e73e 7f00 0001 7f00  .4U.@.@..>......
        0x0020:  0001 04d2 b40d e1d6 032c ccc7 7eb7 8010  .........,..~...
        0x0030:  0085 fe28 0000 0101 080a 3a3b 4b44 3a3b  ...(......:;KD:;
        0x0040:  4b44                                     KD
12:19:09.111582 IP 127.0.0.1.1234 > 127.0.0.1.46093: Flags [P.], seq 2904:2915, ack 577, win 133, options [nop,nop,TS val 976964421 ecr 976964420], length 11
        0x0000:  0000 0000 0000 0000 0000 0000 0800 4500  ..............E.
        0x0010:  003f 5584 4000 4006 e732 7f00 0001 7f00  .?U.@.@..2......
        0x0020:  0001 04d2 b40d e1d6 032c ccc7 7eb7 8018  .........,..~...
        0x0030:  0085 fe33 0000 0101 080a 3a3b 4b45 3a3b  ...3......:;KE:;
        0x0040:  4b44 8809 03e8 436c 6f73 696e 67         KD....Closing
12:19:09.111633 IP 127.0.0.1.46093 > 127.0.0.1.1234: Flags [.], ack 2915, win 140, options [nop,nop,TS val 976964421 ecr 976964421], length 0
        0x0000:  0000 0000 0000 0000 0000 0000 0800 4500  ..............E.
        0x0010:  0034 7bb4 4000 4006 c10d 7f00 0001 7f00  .4{.@.@.........
        0x0020:  0001 b40d 04d2 ccc7 7eb7 e1d6 0337 8010  ........~....7..
        0x0030:  008c fe28 0000 0101 080a 3a3b 4b45 3a3b  ...(......:;KE:;
        0x0040:  4b45                                     KE
12:19:09.111771 IP 127.0.0.1.1234 > 127.0.0.1.46093: Flags [F.], seq 2915, ack 577, win 133, options [nop,nop,TS val 976964421 ecr 976964421], length 0
        0x0000:  0000 0000 0000 0000 0000 0000 0800 4500  ..............E.
        0x0010:  0034 5585 4000 4006 e73c 7f00 0001 7f00  .4U.@.@..<......
        0x0020:  0001 04d2 b40d e1d6 0337 ccc7 7eb7 8011  .........7..~...
        0x0030:  0085 fe28 0000 0101 080a 3a3b 4b45 3a3b  ...(......:;KE:;
        0x0040:  4b45                                     KE
12:19:09.113041 IP 127.0.0.1.46093 > 127.0.0.1.1234: Flags [F.], seq 577, ack 2916, win 140, options [nop,nop,TS val 976964422 ecr 976964421], length 0
        0x0000:  0000 0000 0000 0000 0000 0000 0800 4500  ..............E.
        0x0010:  0034 7bb5 4000 4006 c10c 7f00 0001 7f00  .4{.@.@.........
        0x0020:  0001 b40d 04d2 ccc7 7eb7 e1d6 0338 8011  ........~....8..
        0x0030:  008c fe28 0000 0101 080a 3a3b 4b46 3a3b  ...(......:;KF:;
        0x0040:  4b45                                     KE
12:19:09.113125 IP 127.0.0.1.1234 > 127.0.0.1.46093: Flags [.], ack 578, win 133, options [nop,nop,TS val 976964422 ecr 976964422], length 0
        0x0000:  0000 0000 0000 0000 0000 0000 0800 4500  ..............E.
        0x0010:  0034 5586 4000 4006 e73b 7f00 0001 7f00  .4U.@.@..;......
        0x0020:  0001 04d2 b40d e1d6 0338 ccc7 7eb8 8010  .........8..~...
        0x0030:  0085 fe28 0000 0101 080a 3a3b 4b46 3a3b  ...(......:;KF:;
        0x0040:  4b46                                     KF

Android 端实现:端口扫描 + 协议识别

核心思路:

  1. 扫描本地端口(1~65535)

  2. 尝试建立 TCP 连接

  3. 发送 WebSocket 握手请求

  4. 判断返回是否符合 Frida 特征

#include <jni.h>
#include <string.h>
#include <unistd.h>
#include <arpa/inet.h>
#include <sys/socket.h>
#include <fcntl.h>
#include <android/log.h>
#include <pthread.h>

#define TAG "FridaPortCheck"
#define LOGD(...) __android_log_print(ANDROID_LOG_DEBUG, TAG, __VA_ARGS__)

// 设置 socket 为非阻塞模式(用于配合 select 实现超时控制)
static int set_nonblock(int fd) {
    int flags = fcntl(fd, F_GETFL, 0);
    return fcntl(fd, F_SETFL, flags | O_NONBLOCK);
}

// ===== WebSocket 握手请求(模拟 Frida 客户端特征)=====
// Frida 16+ 使用 WebSocket + JSON RPC 通信
static const char *ws_req =
        "GET /ws HTTP/1.1\r\n"
        "Host: 127.0.0.1\r\n"
        "Upgrade: websocket\r\n"
        "Connection: Upgrade\r\n"
        "Sec-WebSocket-Key: dGhlIHNhbXBsZSBub25jZQ==\r\n"
        "Sec-WebSocket-Version: 13\r\n"
        "User-Agent: Frida/16.7.19\r\n"
        "\r\n";

// ===== 端口扫描线程 =====
void *scan_ports_thread(void *arg) {

    struct sockaddr_in sa{};
    sa.sin_family = AF_INET;
    inet_aton("127.0.0.1", &sa.sin_addr); // 扫描本地回环(frida-server 常驻)

    char recv_buf[1024];

    // 遍历全部 TCP 端口
    for (int port = 1; port <= 65535; port++) {

        int sock = socket(AF_INET, SOCK_STREAM, 0);
        if (sock < 0) continue;

        set_nonblock(sock); // 非阻塞 connect

        sa.sin_port = htons(port);

        bool is_frida = false;

        do {
            // 发起连接(非阻塞)
            connect(sock, (struct sockaddr *) &sa, sizeof(sa));

            // 使用 select 等待连接完成(写事件)
            fd_set wfds;
            FD_ZERO(&wfds);
            FD_SET(sock, &wfds);

            struct timeval tv{};
            tv.tv_sec = 0;
            tv.tv_usec = 100 * 1000; // 100ms 超时

            int sel = select(sock + 1, NULL, &wfds, NULL, &tv);
            if (!(sel > 0 && FD_ISSET(sock, &wfds))) break;

            // 检查 connect 结果
            int err = 0;
            socklen_t len = sizeof(err);
            getsockopt(sock, SOL_SOCKET, SO_ERROR, &err, &len);

            if (err != 0) break;

            LOGD("[+] Port %d CONNECTED", port);

            // ===== 发送 WebSocket 握手 =====
            send(sock, ws_req, strlen(ws_req), 0);

            usleep(100 * 1000); // 等待响应

            memset(recv_buf, 0, sizeof(recv_buf));
            int r = recv(sock, recv_buf, sizeof(recv_buf) - 1, MSG_DONTWAIT);

            if (r <= 0) {
                LOGD("[+] Port %d NO RESPONSE", port);
                break;
            }

            LOGD("[+] Port %d RESPONSE (%d bytes):\n%s", port, r, recv_buf);

            // ===== 判断是否为 WebSocket 服务 =====
            // 关键特征:HTTP 101 + Upgrade + Sec-WebSocket-Accept
            if (strstr(recv_buf, "HTTP/1.1 101") &&
                strstr(recv_buf, "Upgrade: websocket") &&
                strstr(recv_buf, "Connection: Upgrade") &&
                strstr(recv_buf, "Sec-WebSocket-Accept")) {

                LOGD("[!!!] WebSocket detected on port %d", port);

                // 命中 WebSocket(进一步可结合特征判断是否为 Frida)
                is_frida = true;
                break;
            }

        } while (false);

        // 释放 socket
        close(sock);

        // 命中后直接结束扫描
        if (is_frida) {
            notify_java(port, "FRIDA WEBSOCKET DETECTED");
            return nullptr;
        }
    }

    LOGD("[*] Scan finished");
    notify_java(-1, "SCAN_FINISHED");

    return nullptr;
}

// JNI 入口:启动扫描线程(避免阻塞主线程)
extern "C"
JNIEXPORT void JNICALL
Java_com_cyrus_example_fridadetector_core_checks_FridaPortCheck_nativeStartScan(
        JNIEnv *env, jobject thiz) {

    pthread_t tid;

    if (pthread_create(&tid, nullptr, scan_ports_thread, nullptr) == 0) {

        pthread_detach(tid); // 线程结束自动回收资源

        LOGD("[*] Scan thread started");

    } else {
        LOGD("[!] Failed to create thread");
    }
}

检测到 1234 端口被 frida-server 占用

word/media/image1.png

日志输出如下:

2026-04-02 20:18:09.144 22538-22538 FridaPortCheck          com.cyrus.example                    D  [*] Scan thread started
2026-04-02 20:18:09.177 22538-22538 VFUtils                 com.cyrus.example                    D  scaleWght : 330
2026-04-02 20:18:09.541 22538-22624 FridaPortCheck          com.cyrus.example                    D  [+] Port 1234 CONNECTED
2026-04-02 20:18:09.641 22538-22624 FridaPortCheck          com.cyrus.example                    D  [+] Port 1234 RESPONSE (166 bytes):
                                                                                                    HTTP/1.1 101 Switching Protocols
                                                                                                    Date: Thu, 02 Apr 2026 12:18:09 GMT
                                                                                                    Upgrade: websocket
                                                                                                    Connection: Upgrade
                                                                                                    Sec-WebSocket-Accept: s3pPLMBiTxaQ9kYGzzhZRbK+xOo=
2026-04-02 20:18:31.173 22538-22624 FridaPortCheck          com.cyrus.example                    D  [*] Scan finished

通过 adb shell 可以看到 1234 端口正被 frida-server 程序占用

> adb shell su -c "ss -ltnp | grep 1234"
LISTEN      0      10     0.0.0.0:1234               0.0.0.0:*                   users:(("frida-server",pid=15869,fd=7))

绕过方案

可以通过 hook send 方法阻断 /ws WebSocket 握手请求发送实现反检测。

send 和 recv 实际调用的是 sendto 和 recvfrom

libc.so (bionic)
 ├── send → sendto
 ├── recv → recvfrom

直接 enumerate libc.so 中的 send 和 recv :

Module.enumerateExports("libc.so").forEach(e => {
    if (e.name.indexOf("send") !== -1 || e.name.indexOf("recv") !== -1) {
        console.log(e.name);
    }
});

你会看到:

[Remote::AndroidExample ]-> Module.enumerateExports("libc.so").forEach(e => {
    if (e.name.indexOf("send") !== -1 || e.name.indexOf("recv") !== -1) {
        console.log(e.name);
    }
});
__sendto_chk
sendfile
pidfd_send_signal
send
__res_send_setrhook
recvmsg
__recvfrom_chk
recvmmsg
sendmmsg
__res_send_setqhook
__res_nsend
recvfrom
__res_send
sendto
tcsendbreak
recv
sendmsg
sendfile64

通过 hook sendto,在识别到 WebSocket 握手请求时直接返回 -1,模拟发送失败。

frida_ws_handshake_bypass.js

function hook_sendto() {
    const ptr = Module.findExportByName("libc.so", "sendto");
    const real = new NativeFunction(ptr, 'int', ['int', 'pointer', 'int', 'int', 'pointer', 'int']);

    Interceptor.replace(ptr, new NativeCallback(function (fd, buf, len, flags, dest, dest_len) {

        let data = "";
        try {
            data = Memory.readUtf8String(buf, len);
        } catch (e) {
        }

        if (data.indexOf("GET /ws HTTP/1.1") !== -1) {
            console.log("[Bypass] block ws handshake");
            return -1; // 模拟发送失败
        }

        return real(fd, buf, len, flags, dest, dest_len);

    }, 'int', ['int', 'pointer', 'int', 'int', 'pointer', 'int']));
}

setImmediate(hook_sendto);


// frida -H 127.0.0.1:1234 -l frida_ws_handshake_bypass.js -f com.cyrus.example
// frida -H 127.0.0.1:1234 -F -l frida_ws_handshake_bypass.js

执行 frida_ws_handshake_bypass.js 脚本

(frida17) PS D:\Python\anti-app\frida17\anti-frida> frida -H 127.0.0.1:1234 -F -l frida_ws_handshake_bypass.js
     ____
    / _  |   Frida 16.7.19 - A world-class dynamic instrumentation toolkit
   | (_| |
    > _  |   Commands:
   /_/ |_|       help      -> Displays the help system
   . . . .       object?   -> Display information about 'object'
   . . . .       exit/quit -> Exit
   . . . .
   . . . .   More info at https://frida.re/docs/home/
   . . . .
   . . . .   Connected to 127.0.0.1:1234 (id=socket@127.0.0.1:1234)
[Remote::AndroidExample ]-> [Bypass] block ws handshake
[Bypass] block ws handshake
[Bypass] block ws handshake

成功绕过检测

word/media/image2.png

完整源码

Android 端完整源码:https://github.com/CYRUS-STUDIO/AndroidExample