首页
课程
问答
CTF
社区
招聘
峰会
发现
排行榜
知识库
工具下载
看雪20年
看雪商城
证书查询
登录
注册
首页
社区
课程
招聘
发现
问答
CTF
排行榜
知识库
工具下载
峰会
看雪商城
证书查询
社区
Android安全
发新帖
12
17
[原创]Native层binder与syscall代理技术
发表于: 2026-3-28 22:39
3814
[原创]Native层binder与syscall代理技术
孤木落
1
2026-3-28 22:39
3814
# Native层binder与syscall代理技术 灵感来源:<a href="elink@f8aK9s2c8@1M7s2y4Q4x3@1q4Q4x3V1k6Q4x3V1k6%4N6%4N6Q4x3X3f1#2x3Y4m8G2K9X3W2W2i4K6u0W2j5$3&6Q4x3V1k6X3L8%4u0#2L8g2)9J5k6i4m8Z5M7q4)9K6c8X3#2G2k6q4)9K6c8s2k6A6k6i4N6@1K9s2u0W2j5h3c8Q4x3U0k6@1K9h3c8Q4x3@1b7I4z5o6j5$3y4o6j5^5">【Android】深入Binder底层拦截</a> 开源地址:<a href="elink@4a5K9s2c8@1M7s2y4Q4x3@1q4Q4x3V1k6Q4x3V1k6Y4K9i4c8Z5N6h3u0Q4x3X3g2U0L8$3#2Q4x3V1k6Y4k6$3N6Y4L8h3I4D9L8r3I4Q4x3V1k6m8L8X3c8b7M7X3!0^5P5f1c8W2L8h3)9`.">AndProxy - Github</a> 由于本人是个菜鸟(自学android野路子这一块),并不是很了解binder通信的实际原理与调用链,所以AndProxy其实还是有很多问题。而且学业繁忙,检查问题与修复bug能力有限,期待更多大佬贡献代码。 ## 代理技术原理 - Syscall代理:源于我对老文章<a href="elink@075K9s2c8@1M7s2y4Q4x3@1q4Q4x3V1k6Q4x3V1k6Y4k6$3N6Y4L8h3I4D9L8r3I4Q4x3X3g2Y4K9i4c8Z5N6h3u0Q4x3X3g2A6L8#2)9J5c8U0t1H3x3U0g2Q4x3V1j5I4x3W2)9J5c8U0t1H3i4K6u0r3i4K6t1#2c8e0k6Q4x3U0f1&6c8W2)9J5y4e0V1H3i4K6t1#2c8e0g2Q4x3U0f1^5c8g2)9J5y4f1u0n7i4K6t1#2c8e0N6Q4x3U0g2m8c8q4)9J5y4f1u0q4i4K6t1#2c8e0g2Q4x3U0g2n7y4#2)9J5y4f1p5#2i4K6t1#2c8e0g2Q4x3U0f1^5y4g2)9J5y4f1t1%4i4K6t1#2c8e0g2Q4x3U0f1^5z5q4)9J5y4e0R3$3i4K6t1#2c8e0k6Q4x3U0f1&6c8g2)9J5y4e0V1H3i4K6u0r3">某去签工具分析</a>(这里有一个兼容性问题,`seccomp_notify`机制需要内核版本大于5.10,所以一般要出场Android 12以上的机型才可用) - ioctl hook:就是简单的GotHook。但是有两个比较重要的细节(坑) 1. 由于Android的命名空间机制,`dl_iterate_phdr`无法找到libbinder.so,只能手动扫描/proc/self/maps 2. Got项没有写权限,必须先`mprotect`赋予`w`可写再修改,最后把权限改回去 - binder数据解析与修改:参考<a href="elink@108K9s2c8@1M7s2y4Q4x3@1q4Q4x3V1k6Q4x3V1k6%4N6%4N6Q4x3X3f1#2x3Y4m8G2K9X3W2W2i4K6u0W2j5$3&6Q4x3V1k6X3L8%4u0#2L8g2)9J5k6i4m8Z5M7q4)9K6c8X3#2G2k6q4)9K6c8s2k6A6k6i4N6@1K9s2u0W2j5h3c8Q4x3U0k6@1K9h3c8Q4x3@1b7I4z5o6j5$3y4o6j5^5">【Android】深入Binder底层拦截</a> ## Syscall 代理技术的一些细节 其实这个框架最早是作为我写的一个拦截皇室战争的`exit_group`等退出函数的frida模块被开发出的。为什么不使用已经成熟的seccomp+sigaction机制?因为皇室战争的加固提供方Promon已经对此通过主动注册信号处理函数作了防范,但是seccomp_notify处于兼容性原因,暂时没有进行防范。 在拦截退出时,我们有一个基本需求:打印推出前的函数调用栈,快速判断触发闪退位置。 但是,`seccomp_notify`机制本身不支持获取syscall被调用时的寄存器上下文,所以我们必须利用额外的机制,自然联想到信号量。基本流程是,若要获取寄存器,则在supervisor_loop启动前注册一个信号处理函数,syscall被调用时会触发supervisior,此时supervisor会接收到当前寄存器,再通过shared memory传回supervisior。优点是可以利用SIG_USER2这种很少被注册处理函数,但是可以触发处理函数的信号,这样防御成本就大大增加了。 然后就是第一个坑,通过查阅文档,syscall调用后,进程处于阻塞状态,此时如果发送了信号,就会打断阻塞,syscall也不会被调用。为此,我们必须将sig的flag加上restart,这样就可以再次调用syscall进入supervisor。我们将在第一次进入supervisor进入时获取寄存器上下文,在第二次进入时调用回调函数进行真正的处理。 第二个坑是,supervisor和主进程不是同一个进程,所以注册callback时可能会有bug。我主要利用的是fork不会改变模块布局,所以如果模块在supervisor启动前就已经被加载,那么他的函数指针在supervisor和被监控进程中是等价的,直接传递即可。 最后是如何在被监控进程调用可能被seccomp限制的回调?这个利用了seccomp的限制以线程为单位的特性,执行java callback的线程先于seccomp的bpf规则注册就不会被限制,所以会在JNI_OnLoad中先启动线程,init函数在此之后调用。(从这个角度看SvcInterceptor的addFile方法其实没有什么用,可能会在后续版本移除) >具体实现参考:seccomp_hook.cpp, SvcInterceptor.cpp ## binder代理的一些细节 感谢 @iofomo(数字锋芒)大佬的的无私分享,主要技术细节都在他的blog中,这里只分享几个小问题的解决方案。 首先是服务名解析(Stub中的DESCRIPTOR字段),按照大佬分享的方法没有解析出来。但是注意到[strlen][utf16_str]的固定结构,采用了模糊搜索方法,成功解析服务名(缺点是很容易误匹配,所以我加了很多限制)。 然后是为什么选择Got Hook?因为我不想在代码段留脏页(bushi)。其实是因为Got Hook比较简单,而且binder通信位置相对集中在libbinder.so,所以选择对libbinder.so进行Got Hook。 最后是解包Parcel对象,这个放在java层做比较简单,具体示例在`app`模块中有演示,注意一定要清除缓存 ## 技术展望 我开发AndProxy的最初目的是做android运行时监控,但是AndProxy还可以用于做隔离沙盒,PMS Hook,IO重定向等等。目前我计划将其用于开发APP多开和监控沙盒,但是苦于不会Framework,而且学业繁忙,希望有大佬可以加入开发。
传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!!
#基础理论
#逆向分析
#程序开发
#HOOK注入
#系统相关
#源码框架
收藏
・
12
点赞
・
17
打赏
分享
分享到微信
分享到QQ
分享到微博
赞赏记录
参与人
雪币
留言
时间
心在o
你的分享对大家帮助很大,非常感谢!
2026-7-15 19:36
btmanbtman
感谢你的贡献,论坛因你而更加精彩!
2026-6-29 10:53
cr_lgdx
你的帖子非常有用,感谢分享!
2026-4-28 23:02
x1a0f3n9
你的分享对大家帮助很大,非常感谢!
2026-4-23 23:31
我的小拇指啊
为你点赞!
2026-4-4 00:34
X66iaM
为你点赞!
2026-3-31 20:58
shutterbug
你的帖子非常有用,感谢分享!
2026-3-31 15:23
lrhtony
感谢你分享这么好的资源!
2026-3-31 14:51
灬哈密瓜
为你点赞!
2026-3-31 13:31
路过1
你的分享对大家帮助很大,非常感谢!
2026-3-31 09:55
jpacg
谢谢你的细致分析,受益匪浅!
2026-3-30 20:40
sinker_
这个讨论对我很有帮助,谢谢!
2026-3-30 12:23
东方玻璃
这个讨论对我很有帮助,谢谢!
2026-3-30 11:00
mb_kflrccfl
你的分享对大家帮助很大,非常感谢!
2026-3-29 23:26
逆天而行
你的分享对大家帮助很大,非常感谢!
2026-3-29 18:59
superlover
感谢你分享这么好的资源!
2026-3-29 13:12
拾海
感谢你分享这么好的资源!
2026-3-29 11:40
查看更多
赞赏
×
1 雪花
5 雪花
10 雪花
20 雪花
50 雪花
80 雪花
100 雪花
150 雪花
200 雪花
支付方式:
微信支付
赞赏留言:
快捷留言
感谢分享~
精品文章~
原创内容~
精彩转帖~
助人为乐~
感谢分享~
最新回复
(
12
)
iBa0
雪 币:
1901
活跃值:
(5928)
能力值:
( LV4,RANK:40 )
在线值:
发帖
6
回帖
490
粉丝
37
关注
私信
iBa0
2
楼
牛逼
2026-3-29 11:15
0
墨穹呢
雪 币:
4770
活跃值:
(8232)
能力值:
( LV3,RANK:20 )
在线值:
发帖
2
回帖
231
粉丝
18
关注
私信
墨穹呢
3
楼
感谢分享
2026-3-29 11:59
0
Imxz
雪 币:
110
活跃值:
(9571)
能力值:
( LV2,RANK:10 )
在线值:
发帖
6
回帖
775
粉丝
9
关注
私信
Imxz
4
楼
tql
2026-3-30 09:28
0
mb_mrgbywba
雪 币:
58
能力值:
( LV1,RANK:0 )
在线值:
发帖
0
回帖
36
粉丝
0
关注
私信
mb_mrgbywba
5
楼
强强
2026-4-3 01:18
0
温泉划水鱼
雪 币:
94
能力值:
( LV1,RANK:0 )
在线值:
发帖
6
回帖
226
粉丝
28
关注
私信
温泉划水鱼
6
楼
仙品
2026-4-4 17:56
0
uni7corn
雪 币:
0
活跃值:
(2485)
能力值:
( LV2,RANK:10 )
在线值:
发帖
0
回帖
182
粉丝
0
关注
私信
uni7corn
7
楼
是否有技术交流群,可参与Android多开开发。
2026-4-27 17:50
1
孤木落
雪 币:
1791
活跃值:
(561)
能力值:
( LV5,RANK:70 )
在线值:
发帖
7
回帖
13
粉丝
28
关注
私信
孤木落
1
11
楼
因为一直没人联系,所以还没建群。不过您可以用github的readme中的QQ邮箱对应的qq号直接联系我,十分感谢
2026-4-28 21:52
0
孤木落
雪 币:
1791
活跃值:
(561)
能力值:
( LV5,RANK:70 )
在线值:
发帖
7
回帖
13
粉丝
28
关注
私信
孤木落
1
12
楼
uni7corn
是否有技术交流群,可参与Android多开开发。
最后于
2026-4-28 21:55 被孤木落编辑 ,原因:
2026-4-28 21:53
0
wx_北极星_493
雪 币:
159
能力值:
( LV1,RANK:0 )
在线值:
发帖
0
回帖
59
粉丝
0
关注
私信
wx_北极星_493
13
楼
看看
2026-5-19 11:22
0
游客
登录
|
注册
方可回帖
回帖
表情
雪币赚取及消费
高级回复
返回
孤木落
1
7
发帖
13
回帖
70
RANK
关注
私信
他的文章
[原创]仅使用NDK构建内核模块的实验
3448
[原创]尝试分析某海外加固
13656
[原创]AndProxy 升级版:基于 Seccomp 的无 Hook Binder 服务代理
47655
[原创]把 .o 变成 .ko(三):自己写 Loader 才知道的事
40171
[原创]把 .o 变成 .ko(二):GKI 安全特性的铁幕
36353
关于我们
联系我们
企业服务
看雪公众号
专注于PC、移动、智能设备安全研究及逆向工程的开发者社区
看原图
赞赏
×
雪币:
+
留言:
快捷留言
为你点赞!
返回
顶部