首页
课程
问答
CTF
社区
招聘
峰会
发现
排行榜
知识库
工具下载
看雪20年
看雪商城
证书查询
登录
注册
首页
社区
课程
招聘
发现
问答
CTF
排行榜
知识库
工具下载
峰会
看雪商城
证书查询
社区
Android安全
发新帖
55
18
[原创]TK抓包协议分析:So层逆向(底部交流群)
发表于: 2025-3-16 17:07
12014
[原创]TK抓包协议分析:So层逆向(底部交流群)
知一Tracer
2025-3-16 17:07
12014
## 前言 - **免责声明**: 本文内容仅供学习交流使用,请勿用于其他用途,如因使用本文内容而产生任何问题,与作者无关,如果本文侵害贵司权益,请联系 `zhiyitracer@163.com ` 下架处理 - 第一章搞定了,Tk的上网环境,但是还不能抓包,因为Tk系的协议不太一样用的是QUIC协议  - 那我们今天的目标是绕过这个协议,让他降级,实现我们成功抓包的目的(还有会番外篇非降级抓包,可以小小期待一下) - 文章尽量还原每一步,尽可能写的详细,如果还是有问题可以加我微信沟通 `Alive0501` ## 环境 - **手机** - 小米8 - **版本** - 33.4.3 ## 准备 - 抓包失败  - 开了抓包以后APP直接是网络无连接了,并且抓到的请求也是不正常的,下面我们就开始定位 ## 日志分析 - 可以从日志分析入手,看看有没有什么异常的报错 - 使用 `adb logcat ` 命令查看 -  - 1. 先用 adb logcat -c 请一下日志 2. 执行 adb logcat 命令 3. 然后打开tiktok app 4. 出现发生错误这个页面后停止 adb locat 命令 5. 把文件保存到本地进行分析 - 定位(整个日志中,只有此处有发送网络请求而且失败,所以一眼定位这里)  - 日志里找到有一个请求URL的位置并且有一个`|Exception in CronetUrlRequest` 像是网络错误的请求所以分析一下这个位置 ## jadx反编译 1. 拿上面的这个`Exception in CronetUrlRequest` 去jdax里进行搜索  2. 上面搜索到三个位置,后两个是同一个函数,所以hook一下这两个地方,打印下堆栈  3. 直接右键复制为Frida片段就可以了 ```js Java.perform(function () { let g = Java.use("org.chromium.g"); g["LIZ"].implementation = function (i, i2, str) { console.log(`g.LIZ is called: i=${i}, i2=${i2}, str=${str}`); let result = this["LIZ"](i, i2, str); console.log(`g.LIZ result=${result}`); console.log(Java.use("android.util.Log").getStackTraceString(Java.use("java.lang.Throwable").$new())); return result; }; let CronetUrlRequest = Java.use("com.ttnet.org.chromium.net.impl.CronetUrlRequest"); CronetUrlRequest["onError"].implementation = function (i, i2, i3, str, j) { console.log(`CronetUrlRequest.onError is called: i=${i}, i2=${i2}, i3=${i3}, str=${str}, j=${j}`); this["onError"](i, i2, i3, str, j); console.log(Java.use("android.util.Log").getStackTraceString(Java.use("java.lang.Throwable").$new())); }; }) ``` 4. 打印结果  5. 上面图片可以看到所有的打印都是走的`CronetUrlRequest.onError`这个函数,他是一个Native层的方法 那下面来分析一下So层 ## 定位So - 直接把app文件 重命名一下 `.apk` 改为`.zip` - 直接找到`tiktok-33-4-3.zip\lib\arm64-v8a` 这里面有很多so文件,怎么定位到我们需要的so文件那 - 我这里使用grep进行搜索 grep的作用就是搜索到我们要定位的字符串在那个So文件里 grep的安装可以看这个 `<mark class="encrypted">f21K9s2c8@1M7s2y4Q4x3@1q4Q4x3V1k6Q4x3V1k6T1L8r3!0Y4i4K6u0W2j5%4y4V1L8W2)9J5k6h3&6W2N6q4)9J5c8Y4q4I4i4K6g2X3x3U0V1%4y4e0t1^5y4e0N6Q4x3V1k6S2M7Y4c8A6j5$3I4W2i4K6u0r3k6r3g2@1j5h3W2D9M7#2)9J5c8U0p5@1x3o6p5$3z5e0p5H3y4#2)9$3x3l9`.`.</mark> 1. 把.apk后缀改为.zip 2. 压解到一个文件夹 3. cd 到解压文件夹的 `\lib\arm64-v8a`目录 打开cmd 4. 执行命令 `grep -r "CronetUrlRequest" *`  5. 显示在 `libsscronet.so` 这个So文件中 ## 分析So - 从`\lib\arm64-v8a`下面找到`libsscronet.so`这个文件丢到ida64中  - 按Shift F12 字符串搜索 `CronetUrlRequest`  - 点击`com/ttnet/org/chromium/net/impl/CronetUrlRequest`  - 进入`sub_190028+8↓o` 然后按tab键  - Hook下这个位置 `190028` - 这里为了方便注释Hook的代码,拆分开写的 - **主函数** ``` function hook_dlopen(module_name, fun) { var android_dlopen_ext = Module.findExportByName(null, "android_dlopen_ext"); if (android_dlopen_ext) { Interceptor.attach(android_dlopen_ext, { onEnter: function (args) { pass }, onLeave: function (retval) { passa } }); } } function main() { hook_dlopen("libsscronet.so") } setImmediate(main) ``` - **注释** - Hook `android_dlopen_ext` 监控 `.so` 加载 - 判断是不是我们要hook的"libsscronet.so"文件 - **onEnter** ```js onEnter: function (args) { var pathptr = args[0]; // 读取第一个参数,它是一个指向动态库路径的指针 if (pathptr) { // 确保指针有效,避免 `null` 访问错误 this.path = pathptr.readCString(); // 将指针解析成字符串,得到动态库的路径 if (this.path.indexOf(module_name) >= 0) { // 判断路径是否包含目标库名 this.canhook = true; // 发现目标库,标记 `this.canhook = true`,表示可以 hook } } } ``` - **注释** 1. `onEnter` 在目标函数(`android_dlopen_ext`)执行前触发 2. 如果路径是否包含目标库名,把canhook设置为True - **onLeave** ```js onLeave: function (retval) { if (this.canhook) { // 只有在 onEnter 里确认目标库被加载了,才会执行 hook 逻辑 let base_libsscronet = Module.findBaseAddress("libsscronet.so"); // 获取 libsscronet.so 的基地址 let sub_190028 = base_libsscronet.add(0x190028); // 计算 sub_190028 函数的地址(基地址 + 偏移 0x190028) console.log("hook", sub_190028); // 打印目标函数的地址,便于调试 Interceptor.attach(sub_190028, { // Hook 目标函数 onEnter(args) { console.log("sub_190028 called, return address:", DebugSymbol.fromAddress(this.returnAddress)); // `this.returnAddress` 是调用 `sub_190028` 的上层函数的返回地址 // `DebugSymbol.fromAddress` 解析该地址,尝试获取调用 `sub_190028` 的函数名 } }); } } ``` - **注释** 1. `this.returnAddress` 返回的是调用者的地址 1. `DebugSymbol.fromAddress` 是为了把地址转为函数名 - 打印结果  - 按G跳转到 `0x18fae8`  - 偏移量在V16上 - 点进` sub_18209C`这个函数  - `.cc` 文件是 **C++ 源代码文件**,它的作用与 `.cpp` 文件相同,通常用于存放 C++ 代码 - 跟进`sub_182194`  - 看到这块信息Hook一下 `sub_20E814` 可以看到第二个是一个String ,所以hook代码要修改一下把第二个参数String也打印 ```JS onLeave: function (retval) { if (this.canhook) { let base_libsscronet = Module.findBaseAddress("libsscronet.so"); let sub_20E814 = base_libsscronet.add(0x20E814); console.log("hook", sub_20E814); Interceptor.attach(sub_20E814, { onEnter(args) { console.log("sub_20E814 called, return address:",args[1].readCString()), DebugSymbol.fromAddress(this.returnAddress); } }); } } ``` - 输出结果  - 这个地方明显不是,app已经出现连接失败了,后面过了一会才有的打印,说明这个打印已经晚了,如果是我们想要的位置,他应该在检测中进行打印 - 上面的输出其实并没有什么有效信息 ## 分析引用 - 那这样我们线索已经断了,先按X看一下这个函数都是有谁引用了 看看有没有线索  - 看了半天感觉也没啥有用的东西,那下面我们整理一下已经有信息,来猜测一下,后续怎么进行 1. 那目前我们根据已经有信息,看到代码里有用 `../../net/tt_net/ipc/ipc_channel_reader.cc"` 这样的方式去写的 2. 那可以猜测,我们真正需要Hook的那个函数也有可能是这样加载的,可以字符串搜索一下`../../`  3. 看到有几个目录`net` `base` `components`等,我们是为了解决抓包问题,那很有可能是在net目录下(network),那来搜索一下 `../../net`  4. 还是比较多的,这个时候可以有选择的看一下,跟网络请求相关的`quic` `ssl` 等 5. 最后定位到是 `../../net/socket/ssl_client_socket_impl.cc`这个文件  - 然后点进来看一下  - hook下 `20E7EC`  - 看到有一个叫`HandleVerifyResult`比较像,我们跳进去看一下`0x3174dc` - 如果打印不出 `HandleVerifyResult` 可以换个手机试下  - 然后向上滑找到函数看一下是谁在引用, 因为怀疑这一段是 **错误处理** 所以先看一下谁调用他  - 这里有两个点那个都可以,最后都是一个位置,进来之后继续找到函数看一下引用  - 接着点进去,进去以后看到很多个函数都点开看一下,最后定位到`sub_4913E8()`上面   - 我们可以搜一下`SSL_CTX_set_custom_verify`这是什么意思   - 第三个参数是一个回调函数,这里他的返回值1表示成功,0表示失败,那我们手动把他Hook为0,让他不支持quic协议,实现降级 - 就能成功绕过校验了~! ```js function hook_dlopen(module_name, fun) { var android_dlopen_ext = Module.findExportByName(null, "android_dlopen_ext"); if (android_dlopen_ext) { Interceptor.attach(android_dlopen_ext, { onEnter: function (args) { var pathptr = args[0]; if (pathptr) { this.path = (pathptr).readCString(); if (this.path.indexOf(module_name) >= 0) { this.canhook = true; } } }, onLeave: function (retval) { if (this.canhook) { let verifyadd = Module.getExportByName("libsscronet.so","SSL_CTX_set_custom_verify"); Interceptor.attach(verifyadd,{ onEnter(args){ Interceptor.attach(args[2],{ onLeave(retval){ retval.replace(0x0); } }) } }) } } }); } } ``` ## 成功搞定 -  - 就可以抓包并且上TikTok了 ## 交流群 - 建立了一个爬虫交流群,如果有兴趣进群的话可以加我好友 拉你进群 
冰与火的战歌:Windows内核攻防实战高级班!从零到实战,融合AI与Windows内核攻防全技术栈,打造具备自动化能力的内核开发高手。
最后于
2025-3-16 18:55 被知一Tracer编辑 ,原因: 修复图片
#HOOK注入
#漏洞相关
#协议分析
#逆向分析
#基础理论
收藏
・
55
点赞
・
18
打赏
分享
分享到微信
分享到QQ
分享到微博
赞赏记录
参与人
雪币
留言
时间
xianyuuuan
你的帖子非常有用,感谢分享!
2026-4-11 20:30
mb_gqjpkkaz
+1
你的帖子非常有用,感谢分享!
2026-1-28 21:55
s1nec-1o
+5
感谢你分享这么好的资源!
2025-12-17 20:05
x_req
期待更多优质内容的分享,论坛有你更精彩!
2025-12-13 22:34
rebeksh
感谢你的积极参与,期待更多精彩内容!
2025-11-28 12:34
Dr_Knox
期待更多优质内容的分享,论坛有你更精彩!
2025-10-10 17:30
沫屿
感谢你的贡献,论坛因你而更加精彩!
2025-9-4 14:35
mb_vvpfwjte
谢谢你的细致分析,受益匪浅!
2025-9-4 13:53
wx_嘻唰唰
这个讨论对我很有帮助,谢谢!
2025-8-5 14:39
Yangser
这个讨论对我很有帮助,谢谢!
2025-7-19 19:49
逆天而行
谢谢你的细致分析,受益匪浅!
2025-7-7 20:50
mb_jkykcuwo
你的分享对大家帮助很大,非常感谢!
2025-7-1 15:07
Toseven
感谢你的贡献,论坛因你而更加精彩!
2025-6-13 17:51
ggeo
你的分享对大家帮助很大,非常感谢!
2025-3-30 22:07
mb_fvscuabi
+1
谢谢你的细致分析,受益匪浅!
2025-3-29 10:56
git_94581yydeepfam
为你点赞!
2025-3-25 09:34
mb_zpyvrtaq
你的帖子非常有用,感谢分享!
2025-3-17 16:27
猪儿美
+1
期待更多优质内容的分享,论坛有你更精彩!
2025-3-17 14:32
查看更多
赞赏
×
1 雪花
5 雪花
10 雪花
20 雪花
50 雪花
80 雪花
100 雪花
150 雪花
200 雪花
支付方式:
微信支付
赞赏留言:
快捷留言
感谢分享~
精品文章~
原创内容~
精彩转帖~
助人为乐~
感谢分享~
最新回复
(
16
)
猪儿美
雪 币:
317
活跃值:
(451)
能力值:
( LV2,RANK:10 )
在线值:
发帖
0
回帖
32
粉丝
2
关注
私信
猪儿美
2
楼
大佬,学习了
2025-3-17 14:33
0
ty1937
雪 币:
3464
活跃值:
(4512)
能力值:
( LV3,RANK:20 )
在线值:
发帖
3
回帖
36
粉丝
13
关注
私信
ty1937
3
楼
厉害
2025-3-18 11:44
0
M.C
雪 币:
211
能力值:
( LV1,RANK:0 )
在线值:
发帖
0
回帖
5
粉丝
0
关注
私信
M.C
4
楼
大佬,膜拜
2025-4-8 16:20
0
荧光之夏
雪 币:
200
活跃值:
(481)
能力值:
( LV2,RANK:10 )
在线值:
发帖
0
回帖
56
粉丝
3
关注
私信
荧光之夏
5
楼
这个是真分享 说的非常详细 大佬牛逼
2025-4-11 12:07
0
荧光之夏
雪 币:
200
活跃值:
(481)
能力值:
( LV2,RANK:10 )
在线值:
发帖
0
回帖
56
粉丝
3
关注
私信
荧光之夏
6
楼
期待下一篇
2025-4-11 12:08
0
阳光宝贝
雪 币:
11
活跃值:
(1126)
能力值:
( LV2,RANK:10 )
在线值:
发帖
0
回帖
38
粉丝
1
关注
私信
阳光宝贝
7
楼
这才是良心up主
2025-7-18 13:40
0
mb_pudpzhqv
雪 币:
5
能力值:
( LV1,RANK:0 )
在线值:
发帖
0
回帖
3
粉丝
0
关注
私信
mb_pudpzhqv
8
楼
大佬为什么我 dump 所有进程尝试排查都没有libsscronet.so了?
2025-7-20 23:57
0
mb_ioszxyua
雪 币:
0
能力值:
( LV1,RANK:0 )
在线值:
发帖
0
回帖
3
粉丝
0
关注
私信
mb_ioszxyua
9
楼
点赞!
2025-7-22 11:56
0
nevinhappy
雪 币:
2899
活跃值:
(13198)
能力值:
( LV9,RANK:181 )
在线值:
发帖
29
回帖
536
粉丝
44
关注
私信
nevinhappy
2
10
楼
那是个啥抓包工具。
2025-7-22 14:33
0
koflfy
雪 币:
102
活跃值:
(4071)
能力值:
( LV4,RANK:50 )
在线值:
发帖
8
回帖
480
粉丝
5
关注
私信
koflfy
1
11
楼
mark
2025-8-8 22:12
0
mb_vvpfwjte
雪 币:
76
能力值:
( LV1,RANK:0 )
在线值:
发帖
0
回帖
12
粉丝
0
关注
私信
mb_vvpfwjte
12
楼
请问 为什么 我hook 20E7EC 没有打印出来函数名称 用的debugersymbol
2025-9-4 14:20
0
mb_vvpfwjte
雪 币:
76
能力值:
( LV1,RANK:0 )
在线值:
发帖
0
回帖
12
粉丝
0
关注
私信
mb_vvpfwjte
13
楼
请问一下 为什么抓包的时候 理论上证书也是验证失败的 为什么没有降级 而我手动降级的时候就可以抓包了
2025-9-4 15:05
0
mb_xjdhrmck
雪 币:
276
能力值:
( LV1,RANK:0 )
在线值:
发帖
0
回帖
146
粉丝
0
关注
私信
mb_xjdhrmck
14
楼
66
2025-11-2 11:41
0
huangjw
雪 币:
6679
活跃值:
(11862)
能力值:
( LV2,RANK:10 )
在线值:
发帖
0
回帖
510
粉丝
2
关注
私信
huangjw
15
楼
无敌的存在
2025-11-2 12:59
0
runjin
雪 币:
27
活跃值:
(2241)
能力值:
( LV9,RANK:180 )
在线值:
发帖
16
回帖
127
粉丝
1
关注
私信
runjin
4
16
楼
good
2025-12-13 20:28
0
s1nec-1o
雪 币:
1905
活跃值:
(3794)
能力值:
( LV7,RANK:110 )
在线值:
发帖
5
回帖
67
粉丝
33
关注
私信
s1nec-1o
2
17
楼
学习学习
2025-12-17 20:05
0
游客
登录
|
注册
方可回帖
回帖
表情
雪币赚取及消费
高级回复
返回
知一Tracer
3
发帖
6
回帖
0
RANK
关注
私信
他的文章
[原创]Tk滑块篇之模型训练(底部交流群)
2502
[原创]TK抓包协议分析:So层逆向(底部交流群)
12014
[原创]Tk滑块篇之Wasm扣代码
3662
关于我们
联系我们
企业服务
看雪公众号
专注于PC、移动、智能设备安全研究及逆向工程的开发者社区
看原图
赞赏
×
雪币:
+
留言:
快捷留言
为你点赞!
返回
顶部