搜索
热搜: 活动 交友 discuz
楼主: ironMan.K

[解包打包] cdex转dex处理方法和工具下载

  [复制链接]

27

主题

27

帖子

155

积分

超级版主

Rank: 8Rank: 8

积分
155
发表于 2019-3-15 11:04:59 | 显示全部楼层 |阅读模式
本帖最后由 ironMan.K 于 2019-3-15 11:15 编辑

本文重点如何查看一个patch是否进了google system image
问题初探
测试命令:
  1. run cts-on-gsi -m CtsOsTestCases -t android.os.cts.ParcelTest#testMaliciousMapWrite
  2. fail: junit.framework.AssertionFailedError: Should have thrown a BadParcelableExceptionat junit.framework.Assert.fail(Assert.java:50)at android.os.cts.ParcelTest.testMaliciousMapWrite(ParcelTest.java:3269)at java.lang.reflect.Method.invoke(Native Method)at junit.framework.TestCase.runTest(TestCase.java:168)at junit.framework.TestCase.runBare(TestCase.java:134)at junit.framework.TestResult$1.protect(TestResult.java:115)at
复制代码

android.support.test.internal.runner.junit3.AndroidTestResult.runProtected(AndroidTestResult.java:73)像这种问题很明显就是google的安全补丁的问题,又因为我们刷了google system image,且CTS这条没过,因此我们就可以怀疑google的patch没进gsi

问题分析
首先找到相关的安全补丁如下:
https://android.googlesource.com/platform/frameworks/base/+/6a947f048a76a5936fd2b693e01f849aef22c907%5E%21/#F0

那么补丁是否进了呢?
我们可以按照如下步骤进行处理:

1.解压google提供的system.img(使用simg2img)
我们可以将其中的system/framework文件夹完整的拷出来

2.观察这条补丁应该在的问题,对于我们这条补丁而言,本来应该在framework.jar里面
但是jar包里是空的,因此我们需要另想办法

3.反编译boot-framework.vdex
在O以前,我们可以通过baksmali.jar等工具来将odex->smali->dex→jar,根据这个路径反编出大致的jar包
但是O之后不能这么做了,上面的步骤我们就不详细介绍了
推荐使用https://github.com/anestisb/vdexExtractor 工具,通过反编vdex来查看
那么
vdexExtractor -i boot-framework.vdex -o . --deps -f -v 4
这样,对于O的版本,这样就可以直接解压出dex文件了;但是对于Android P还要再增加一个步骤

4.将cdex转换为dex
通过aosp的patch https://gist.github.com/anestisb/30265097ad9a5ea2f0ddf7e36db3f07d
编译出compact_dex_converter工具
compact_dex_converter -w ./ ./boot-framework_classes2.cdex
会生成一个boot-framework_classes2.cdex.new文件,这个其实就是dex文件


  • d2j-dex2jar.sh+010Editor dex→jar
如果magic header不对,用010Editor改一下,然后通过d2j-dex2jar.sh得到相应的framework.jar
见boot-framework2.jar
查看其中的Parcel.class,发现patch果然没进
public final void writeMap(Map paramMap){  writeMapInternal(paramMap);} void writeMapInternal(Map<String, Object> paramMap){  if (paramMap == null)  {    writeInt(-1);    return;  }  paramMap = paramMap.entrySet();  writeInt(paramMap.size());  paramMap = paramMap.iterator();  while (paramMap.hasNext())  {    Map.Entry localEntry = (Map.Entry)paramMap.next();    writeValue(localEntry.getKey());    writeValue(localEntry.getValue());  }}则有充足的理由申请waive


问题总结
该问题引申出如何查看gsi乃至友商机型system.img的方法


问题延伸
组内老板的说法:
快捷点的话直接adb shell oatdump --oat-file=xxx.oat --export-dex-to=/tmp,不需要手动解析vdex/cdex/art/oat,应该是不分Android版本的;(找机会试下!)









上一篇:如果快速将手机网页转为微信小程序?
下一篇:odex 转 dex 简单方法介绍
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

抖音账号
关注抖音
加入粉丝群,抽取论坛金币


Archiver|手机版|小黑屋|IT趣-GEEK社区

GMT+8, 2024-4-19 16:59 , Processed in 0.059407 second(s), 22 queries .

Powered by Discuz! X3.4. 技术支持 by 巅峰设计

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表