能否为安卓设备重新编译Dalvik VM?如何替换设备原有虚拟机?
需求可行性说明
该需求完全可以实现,但需要注意Dalvik VM仅适用于Android 4.4(API 19)及更低版本的系统,Android 5.0及以上默认使用ART运行时,若你需要适配高版本系统需要修改ART源码而非Dalvik。
该实现方案属于系统层级的全局监控,无需对目标APK做任何修改即可生效,完全匹配应用分析的工作场景需求。
具体实现步骤
1. 编译修改后的Dalvik VM源码
- 先下载和你目标设备系统版本完全一致的AOSP源码,版本不匹配会直接导致后续替换后无法开机
- 定位Dalvik中HTTP相关系统类的解释执行入口,或者直接修改
java.net.HttpURLConnection、org.apache.http.client等系统原生HTTP类的处理逻辑,加入特定地址的匹配规则:- 匹配到目标地址后,调用
__android_log_print函数输出日志到logcat,建议自定义专属TAG方便过滤,比如设置为HTTP_MONITOR - 日志内容可按需加入发起请求的APK包名、请求方法、请求头、请求体等你需要的分析字段
- 匹配到目标地址后,调用
- 按照AOSP编译流程单独编译Dalvik模块,编译完成后会生成核心库文件
libdvm.so
2. 替换设备原有的Dalvik VM
替换操作需要设备已获取root权限,且解锁了系统分区写入权限,操作步骤如下:
- 把编译得到的
libdvm.so推送到设备临时目录:adb push libdvm.so /sdcard/ - 进入设备shell并切换到root用户:
adb shell后执行su - 挂载系统分区为可写状态:
mount -o remount,rw /system - 备份原有Dalvik库,避免替换失败无法开机:
cp /system/lib/libdvm.so /system/lib/libdvm.so.bak - 覆盖替换新的库文件:
cp /sdcard/libdvm.so /system/lib/libdvm.so - 修改库文件权限为系统默认权限:
chmod 644 /system/lib/libdvm.so,再修改所属用户组:chown root:root /system/lib/libdvm.so - 重新挂载系统分区为只读:
mount -o remount,ro /system - 重启设备即可生效:
reboot
注意:替换系统核心库存在变砖风险,如果替换后设备无法开机,可进入Recovery模式将之前备份的
libdvm.so.bak改回原名覆盖,即可恢复正常。
低复杂度替代方案
如果不想修改Dalvik源码,也可以直接修改系统框架层framework.jar中的HTTP相关类,插入日志打印逻辑,编译后替换系统原生framework.jar即可,修改成本比改Dalvik更低。
内容的提问来源于stack exchange,提问作者Sake
相关产品推荐
相关产品推荐

