CTS問題分析12

CTS/GTS問題分析12

本文重點如何查看一個patch是否進了google system image

問題初探

測試命令:

run cts-on-gsi -m CtsOsTestCases -t android.os.cts.ParcelTest#testMaliciousMapWrite

fail: junit.framework.AssertionFailedError: Should have thrown a BadParcelableException
at 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

問題分析

首先找到相關(guān)的安全補丁如下:

https://android.googlesource.com/platform/frameworks/base/+/6a947f048a76a5936fd2b693e01f849aef22c907%5E%21/#F0

那么補丁是否進了呢?

我們可以按照如下步驟進行處理:

1.解壓google提供的system.img(使用simg2img)

我們可以將其中的system/framework文件夾完整的拷出來

2.觀察這條補丁應(yīng)該在的問題,對于我們這條補丁而言,本來應(yīng)該在framework.jar里面

但是jar包里是空的,因此我們需要另想辦法

3.反編譯boot-framework.vdex

在O以前,我們可以通過baksmali.jar等工具來將odex->smali->dex→jar,根據(jù)這個路徑反編出大致的jar包

但是O之后不能這么做了,上面的步驟我們就不詳細介紹了

推薦使用https://github.com/anestisb/vdexExtractor 工具,通過反編vdex來查看

那么

vdexExtractor -i boot-framework.vdex -o . --deps -f -v 4

這樣,對于O的版本,這樣就可以直接解壓出dex文件了;但是對于Android P還要再增加一個步驟

4.將cdex轉(zhuǎn)換為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文件

  1. d2j-dex2jar.sh+010Editor dex→jar

如果magic header不對,用010Editor改一下,然后通過d2j-dex2jar.sh得到相應(yīng)的framework.jar

見boot-framework2.jar

查看其中的Parcel.class,發(fā)現(xiàn)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

問題總結(jié)

該問題引申出如何查看gsi乃至友商機型system.img的方法

問題延伸

組內(nèi)老板的說法:
快捷點的話直接adb shell oatdump --oat-file=xxx.oat --export-dex-to=/tmp,不需要手動解析vdex/cdex/art/oat,應(yīng)該是不分Android版本的;(找機會試下!)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容