首页
社区
课程
招聘
[原创]Android应用进程fork出来的子进程能运行虚拟机吗?
发表于: 2019-10-18 15:38 5978

[原创]Android应用进程fork出来的子进程能运行虚拟机吗?

2019-10-18 15:38
5978

今天(几个月前)有人问了这个问题,需求还有些奇葩,想在fork出来的子进程中去运行一部分动态下发的代码,而且不知道动态下发的代码的具体内容,有可能导致崩溃,所以想在子进程中执行。

这里不从系统源码和安全上分析,就从写出实现代码,执行,根据异常信息去分析。

我们写过双进程反调试,知道fork应用进程去执行是没有问题的,jni调用生成一个字符串之类的也没问题。但是一般的反调试代码都是一个死循环,阻塞了子进程,并没有继续去往下执行。而如果你放开循环,比如以下代码:

定义了一个jni函数,fork自身并返回一个字符串,通过点击事件触发调用。

执行后,通过日志发现两个进程都执行了,子进程也返回了字符串打印了,但是接下来就异常了。

这个异常可以通过分析函数调用逐步定位,或者分析过looper实现的应该看到looper的那条日志有印象:

http://androidxref.com/4.4_r1/xref/frameworks/base/core/java/android/os/Looper.java

因为ident != newIdent,所以触发异常,调用Log.wtf,http://androidxref.com/4.4_r1/xref/frameworks/base/core/java/android/util/Log.java#255

这是这个流程,但是异常还不是在这里,但我们也能看出关系了,当远程调用调用binder并调用进程内部的接口的时候我们调用clearCallingIdentity清除并保存一个long类型的值,执行完再调用restoreCallingIdentity还原。http://androidxref.com/4.4_r1/xref/frameworks/native/libs/binder/IPCThreadState.cpp#375

返回long类型其实就是uid和pid,父进程pid=27638=0x6BF6,子进程pid=28273=0x6E71,结合日志发现就是因为进程pid变了,触发这条日志。

而真实产生异常的函数为readAligned, http://androidxref.com/4.4_r1/xref/frameworks/native/libs/binder/Parcel.cpp#911

执行到*pArg =  *reinterpret_cast<const T*>(data);时出错,内存

。。。草稿箱发现未发表,但是后面的部分丢失了,懒得再追代码再写了,直接说结论,如果不阻塞肯定会崩溃的,如果阻塞,确认调用的代码不会触发到binder的执行,也可以运行。

补充:凭记忆大概是zygote fork完成后,新进程中执行onZygoteInit(),启动binder线程池。


[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
免费 5
支持
分享
最新回复 (7)
雪    币: 26205
活跃值: (63302)
能力值: (RANK:135 )
在线值:
发帖
回帖
粉丝
2
感谢分享!
2019-10-18 15:41
0
雪    币: 519
活跃值: (218)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
3
留下顶大佬的脚印!
2019-10-18 15:56
0
雪    币: 1110
活跃值: (3274)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
4
我来总结一下
菜鸡版:线程内的 Looper 对象与线程 PID 绑定,fork 后 PID 变了 Looper 就停了
大佬版: Binder 相关的私有内存资源没有被子进程继承
2019-10-18 17:43
0
雪    币: 3897
活跃值: (157)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
感谢分享
2019-10-18 17:44
0
雪    币: 144
活跃值: (38)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
哈哈,我也做过fork子进程的相关操作。子进程fork,然后附加到父进程,调试。那时候我也挺纳闷,每次jni执行回来,子进程就没了
2019-10-19 11:57
0
雪    币: 59
活跃值: (185)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
7
换个角度行不行?
从“需要新进程中去运行一部分动态下发的代码” 这个原始需求出发,可以开个新的独立进程的Activity,运行下载的代码。。。
2019-10-21 10:48
0
雪    币: 0
活跃值: (61)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
创建server 系统会 fork出 一个进程,在server 里面动态执行下发代码。
最后于 2019-10-22 09:19 被HuErrzz编辑 ,原因:
2019-10-22 09:18
0
游客
登录 | 注册 方可回帖
返回
//