首页
社区
课程
招聘
[求助]关于Android虚拟机的疑惑,求解
2019-11-29 23:43 2030

[求助]关于Android虚拟机的疑惑,求解

2019-11-29 23:43
2030
1.当一个应用启动时,zygote进程会创建一个新进程并复制一个虚拟机实例,请问这个虚拟机运行在哪里?是存在于新进程的内存空间里面吗?
比如运行手机QQ, adb shell ps里面会多出来一个包名为" com.tencent.mobileqq "的进程,请问这个进程就是 zygote 创建出来的新进程吗?
2.dex文件处理后会生成Odex或Oat文件,由虚拟机加载并执行里面的方法,虚拟机将方法翻译成CPU能识别的机器码指令,请问翻译后的机器码是存放于新进程的内存空间里吗?能否通过这些机器码指令达到更改程序逻辑或远程调用程序方法的目的?
3.程序通过jni调用so库函数,请问这个so库会被加载到新进程的内存空间里吗?能否在so函数下断,一步一步返回到虚拟机翻译出的机器码指令段?
求大神解答,谢谢!

阿里云助力开发者!2核2G 3M带宽不限流量!6.18限时价,开 发者可享99元/年,续费同价!

收藏
点赞0
打赏
分享
最新回复 (4)
雪    币: 535
活跃值: (109)
能力值: ( LV7,RANK:100 )
在线值:
发帖
回帖
粉丝
qiumuye 2 2019-11-30 11:05
2
1
fork新进程的时候 虚拟机实例同样也会被复制; ps或top看到的应用程序的进程 都是zygote创建的。
带有虚拟机的进程和普通的进程本质上没有区别,每个进程都是独立的内存空间,理论上可以远程加载执行jvm字节码
so库是加载到新进程的内存空间的,和虚拟机使用的是同一个堆栈,可以通过调试器看到。可以通过对虚拟机的关键函数设置断点看到翻译出的机器码。在windows下使用x64dbg调试带有调试符号的jvm(好像github上有,之前下载过)会比调试安卓容易。
最后于 2019-11-30 11:10 被qiumuye编辑 ,原因:
雪    币: 276
活跃值: (20)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
mistyes 2019-11-30 12:38
3
0
qiumuye fork新进程的时候 虚拟机实例同样也会被复制; ps或top看到的应用程序的进程 都是zygote创建的。带有虚拟机的进程和普通的进程本质上没有 ...
谢谢
能否不远程加载jvm字节码,直接远程调用虚拟机翻译过来的机器码达到目的呢?
雪    币: 12500
活跃值: (3043)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
白菜大哥 2019-11-30 15:46
4
1
mistyes 谢谢 能否不远程加载jvm字节码,直接远程调用虚拟机翻译过来的机器码达到目的呢?
可以是可以,但是你并不知道他编译以后具体是什么样子,优化之后是什么样子。与其这样那你不如直接native全部重写呀。
雪    币: 276
活跃值: (20)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
mistyes 2019-11-30 20:44
5
0
白菜大哥 可以是可以,但是你并不知道他编译以后具体是什么样子,优化之后是什么样子。与其这样那你不如直接native全部重写呀。
直接调用机器码也是破解的另一种方法,加密加壳的应用获取vm字节码难度一样不小
游客
登录 | 注册 方可回帖
返回