微信系列研究之-----资源文件保护的小把戏
生活随笔
收集整理的這篇文章主要介紹了
微信系列研究之-----资源文件保护的小把戏
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
前言
微信對APK進行多維度的保護,包括我們以前提到的客戶端到服務器驗證簽名,插件驗證,文件變動檢測,代碼混淆,把核心功能放在SO中等。
其中比較有特色的是對資源文件的保護,防止被惡意分析和山寨。
目前在國內對資源文件進行保護的APK還比較少,大部分都只對代碼和插件進行了保護,所以微信這個特色值得我們去破解一下。
現象
我們通過APKTOOL對微信的APK進行反編譯時就會發現?APKTOOL?只生成了?assets,lib,res,smali目錄(有些版本的APKTOOL還生成了UNKOWN目錄)。
進入資源文件目錄,我們還發現圖片文件比較少。缺少大量的布局文件XML。
如果我們利用APKTOOL對微信反編譯后再打包,會出現一大堆錯誤。
但如果我們直接把APK改名為ZIP,并解壓后,會發現還有r目錄。這其中必有蹊蹺。
原理
由于APKTOOL反編譯時只對RES目錄下的?二進制XML進行反編譯。
而對應RES下的二進制XML引用的其他目錄下的二進制XML無法識別。
微信正是通過這個缺陷對APKTOOL進行了欺騙。
<?xml?version="1.0"?encoding="utf-8"?>
<resources>
????<item?type="layout"?name="a3l">r/o/a3l.xml</item>
</resources>
破解方法:
ANDROID中activity查找資源文件的是
activity?(根據ID查找)->R.java對應的資源標號-》資源ID查找的對應的資源路徑-》找到文件的路徑,讀取相應的文件配置)。
1.從源碼中分析,這里我們以weixin531.apk中的?com.tencent.mm.ui.setting.EditSignatureUI.java?為例
com.tencent.mm.ui.setting.EditSignatureUI.java
import?com.tencent.mm.i;
import?com.tencent.mm.k;
??protected?final?void?DP()
??{
????oP(n.cgU);
????this.jLo?=?((EditText)findViewById(i.content));
????this.hqI?=?((TextView)findViewById(i.baa));
????String?str?=?ap.ja((String)bg.qW().oQ().get(12291));
????this.jLo.setText(str);
????this.jLo.setSelection(this.jLo.getText().length());
????this.hqI.setText(v(this.jLo.getEditableText()));
????EditText?localEditText?=?this.jLo;
????InputFilter[]?arrayOfInputFilter?=?new?InputFilter[1];
????arrayOfInputFilter[0]?=?new?e(this);
????localEditText.setFilters(arrayOfInputFilter);
????this.jLo.addTextChangedListener(new?f(this,?(byte)0));
????a(new?c(this));
????a(0,?getString(n.bud),?new?d(this),?cu.iMA);
????eB(false);
??}
??protected?final?int?getLayoutId()
??{
????return?k.bek;
??}
我們可以看到?
LayoutId?布局資源ID為?k.bek,
EditText?jLo?控件對應的ID?為?i.content
從中我們知道對應的R.JAVA分別為?com.tencent.mm.k和?com.tencent.mm.i
通過com.tencent.mm.k.java?我們可以查到??
public?static?final?int?bek?=?2130903326;
通過十六進制轉化?(2130903326->?0x7F03011E?)我們可以知道?EditSignatureUI.java對應的布局文件的ID為?0x7F03011E
通過com.tencent.mm.k.java?我們可以查到??
?public?static?final?int?content?=?2131165340;
通過十六進制轉化?(2131165340->?0x7F07009C?)我們可以知道?EditText控件對應的布局文件的ID為?0x7F07009C。或者直接從com.tencent.mm.k.smali中查找,這樣可以不用進行十六進制轉化。
2.利用AAPT分析AP資源的表,得到相應的資源編號文件
aapt?dump?--values?resources?weixin531.apk?>?resources.txt
3.通過查表我們可以找到對應的layout.xml?為?r/t/h0.xml.
resource?0x7f03001e?com.tencent.mm:layout/h0:?t=0x03?d=0x0000028e?(s=0x0008?r=0x00)
??????????(string8)?"r/t/h0.xml"
4.利用AAPT查找到的內容對二進制XML進行反編譯輸出
aapt?dump?--values?xml
tree?weixin531.apk?r/t/h0.xml?>?h0.xml.txt?
到這一步基本就得到我們想要的資源布局文件了。
5.?我們還可以利用AXMLPrinter2對單個二進制XML?進行反編譯輸出
java?-jar?AXMLPrinter2.jar?h0.xml??>>?ho.xml.txt
得到的結果如下:
<?xml?version="1.0"?encoding="utf-8"?>
<LinearLayout
??xmlns:android="http://schemas.android.com/apk/res/android"
??android:orientation="1"
??android:layout_width="-1"
??android:layout_height="-2"
??>
??<LinearLayout
????android:orientation="0"
????android:background="@7F02053B"
????android:layout_width="-1"
????android:layout_height="-2"
????android:layout_marginLeft="@7F0A0021"
????android:layout_marginTop="@7F0A0022"
????android:layout_marginRight="@7F0A0021"
????>
????<EditText
??????android:textColor="@7F090026"
??????android:textColorHint="@7F090037"
??????android:gravity="0x00000030"
??????android:id="@7F07009C"
??????android:background="@00000000"
??????android:layout_width="0.0dip"
??????android:layout_height="-2"
??????android:singleLine="false"
??????android:layout_weight="1.0"
??????style="@7F0D008D"
??????>
????</EditText>
????<TextView
??????android:textSize="@7F0A0016"
??????android:textColor="@7F090029"
??????android:layout_gravity="0x00000055"
??????android:id="@7F070380"
??????android:padding="@7F0A001D"
??????android:layout_width="-2"
??????android:layout_height="-2"
??????>
????</TextView>
??</LinearLayout>
??<LinearLayout
????android:gravity="0x00000001"
????android:layout_width="-1"
????android:layout_height="-2"
????android:layout_marginTop="@7F0A0023"
????>
????<TextView
??????android:textSize="@7F0A0015"
??????android:textColor="@7F090064"
??????android:layout_gravity="0x00000055"
??????android:id="@7F0703BA"
??????android:padding="@7F0A001D"
??????android:visibility="2"
??????android:layout_width="-2"
??????android:layout_height="-2"
??????android:text="@7F0C0797"
??????>
????</TextView>
??</LinearLayout>
</LinearLayout>
通過布局文件,我們可以看到?EDITTEXT?控件?編號為(android:id="@7F07009C")對應的風格了。
如果布局文件太多,我們還可以批量進行
for?/f??"tokens=*"?%%a?in?('dir?/s/b/a-d?"*.xml"')?do?(echo.%%a?
@java?-jar?AXMLPrinter2.jar?"%%a"??>>"%%na".txt)?
pause
由于AXMLPrinter2久未更新,AXMLPrinter2對ANDROID高版本的XML文件無法反編譯,為此我們需要下載修改過BUG的AXMLPrinter2
資源分享?修正后的AXMLPrinter2
微信對APK進行多維度的保護,包括我們以前提到的客戶端到服務器驗證簽名,插件驗證,文件變動檢測,代碼混淆,把核心功能放在SO中等。
其中比較有特色的是對資源文件的保護,防止被惡意分析和山寨。
目前在國內對資源文件進行保護的APK還比較少,大部分都只對代碼和插件進行了保護,所以微信這個特色值得我們去破解一下。
現象
我們通過APKTOOL對微信的APK進行反編譯時就會發現?APKTOOL?只生成了?assets,lib,res,smali目錄(有些版本的APKTOOL還生成了UNKOWN目錄)。
進入資源文件目錄,我們還發現圖片文件比較少。缺少大量的布局文件XML。
如果我們利用APKTOOL對微信反編譯后再打包,會出現一大堆錯誤。
但如果我們直接把APK改名為ZIP,并解壓后,會發現還有r目錄。這其中必有蹊蹺。
原理
由于APKTOOL反編譯時只對RES目錄下的?二進制XML進行反編譯。
而對應RES下的二進制XML引用的其他目錄下的二進制XML無法識別。
微信正是通過這個缺陷對APKTOOL進行了欺騙。
<?xml?version="1.0"?encoding="utf-8"?>
<resources>
????<item?type="layout"?name="a3l">r/o/a3l.xml</item>
</resources>
破解方法:
ANDROID中activity查找資源文件的是
activity?(根據ID查找)->R.java對應的資源標號-》資源ID查找的對應的資源路徑-》找到文件的路徑,讀取相應的文件配置)。
1.從源碼中分析,這里我們以weixin531.apk中的?com.tencent.mm.ui.setting.EditSignatureUI.java?為例
com.tencent.mm.ui.setting.EditSignatureUI.java
import?com.tencent.mm.i;
import?com.tencent.mm.k;
??protected?final?void?DP()
??{
????oP(n.cgU);
????this.jLo?=?((EditText)findViewById(i.content));
????this.hqI?=?((TextView)findViewById(i.baa));
????String?str?=?ap.ja((String)bg.qW().oQ().get(12291));
????this.jLo.setText(str);
????this.jLo.setSelection(this.jLo.getText().length());
????this.hqI.setText(v(this.jLo.getEditableText()));
????EditText?localEditText?=?this.jLo;
????InputFilter[]?arrayOfInputFilter?=?new?InputFilter[1];
????arrayOfInputFilter[0]?=?new?e(this);
????localEditText.setFilters(arrayOfInputFilter);
????this.jLo.addTextChangedListener(new?f(this,?(byte)0));
????a(new?c(this));
????a(0,?getString(n.bud),?new?d(this),?cu.iMA);
????eB(false);
??}
??protected?final?int?getLayoutId()
??{
????return?k.bek;
??}
我們可以看到?
LayoutId?布局資源ID為?k.bek,
EditText?jLo?控件對應的ID?為?i.content
從中我們知道對應的R.JAVA分別為?com.tencent.mm.k和?com.tencent.mm.i
通過com.tencent.mm.k.java?我們可以查到??
public?static?final?int?bek?=?2130903326;
通過十六進制轉化?(2130903326->?0x7F03011E?)我們可以知道?EditSignatureUI.java對應的布局文件的ID為?0x7F03011E
通過com.tencent.mm.k.java?我們可以查到??
?public?static?final?int?content?=?2131165340;
通過十六進制轉化?(2131165340->?0x7F07009C?)我們可以知道?EditText控件對應的布局文件的ID為?0x7F07009C。或者直接從com.tencent.mm.k.smali中查找,這樣可以不用進行十六進制轉化。
2.利用AAPT分析AP資源的表,得到相應的資源編號文件
aapt?dump?--values?resources?weixin531.apk?>?resources.txt
3.通過查表我們可以找到對應的layout.xml?為?r/t/h0.xml.
resource?0x7f03001e?com.tencent.mm:layout/h0:?t=0x03?d=0x0000028e?(s=0x0008?r=0x00)
??????????(string8)?"r/t/h0.xml"
4.利用AAPT查找到的內容對二進制XML進行反編譯輸出
aapt?dump?--values?xml
tree?weixin531.apk?r/t/h0.xml?>?h0.xml.txt?
到這一步基本就得到我們想要的資源布局文件了。
5.?我們還可以利用AXMLPrinter2對單個二進制XML?進行反編譯輸出
java?-jar?AXMLPrinter2.jar?h0.xml??>>?ho.xml.txt
得到的結果如下:
<?xml?version="1.0"?encoding="utf-8"?>
<LinearLayout
??xmlns:android="http://schemas.android.com/apk/res/android"
??android:orientation="1"
??android:layout_width="-1"
??android:layout_height="-2"
??>
??<LinearLayout
????android:orientation="0"
????android:background="@7F02053B"
????android:layout_width="-1"
????android:layout_height="-2"
????android:layout_marginLeft="@7F0A0021"
????android:layout_marginTop="@7F0A0022"
????android:layout_marginRight="@7F0A0021"
????>
????<EditText
??????android:textColor="@7F090026"
??????android:textColorHint="@7F090037"
??????android:gravity="0x00000030"
??????android:id="@7F07009C"
??????android:background="@00000000"
??????android:layout_width="0.0dip"
??????android:layout_height="-2"
??????android:singleLine="false"
??????android:layout_weight="1.0"
??????style="@7F0D008D"
??????>
????</EditText>
????<TextView
??????android:textSize="@7F0A0016"
??????android:textColor="@7F090029"
??????android:layout_gravity="0x00000055"
??????android:id="@7F070380"
??????android:padding="@7F0A001D"
??????android:layout_width="-2"
??????android:layout_height="-2"
??????>
????</TextView>
??</LinearLayout>
??<LinearLayout
????android:gravity="0x00000001"
????android:layout_width="-1"
????android:layout_height="-2"
????android:layout_marginTop="@7F0A0023"
????>
????<TextView
??????android:textSize="@7F0A0015"
??????android:textColor="@7F090064"
??????android:layout_gravity="0x00000055"
??????android:id="@7F0703BA"
??????android:padding="@7F0A001D"
??????android:visibility="2"
??????android:layout_width="-2"
??????android:layout_height="-2"
??????android:text="@7F0C0797"
??????>
????</TextView>
??</LinearLayout>
</LinearLayout>
通過布局文件,我們可以看到?EDITTEXT?控件?編號為(android:id="@7F07009C")對應的風格了。
如果布局文件太多,我們還可以批量進行
for?/f??"tokens=*"?%%a?in?('dir?/s/b/a-d?"*.xml"')?do?(echo.%%a?
@java?-jar?AXMLPrinter2.jar?"%%a"??>>"%%na".txt)?
pause
由于AXMLPrinter2久未更新,AXMLPrinter2對ANDROID高版本的XML文件無法反編譯,為此我們需要下載修改過BUG的AXMLPrinter2
資源分享?修正后的AXMLPrinter2
???http://download.csdn.net/detail/simbaba/8625893
原文地址:http://www.kanxue.com/bbs/showthread.php?t=202303
總結
以上是生活随笔為你收集整理的微信系列研究之-----资源文件保护的小把戏的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 基于Android的ELF PLT/GO
- 下一篇: 关于android设备管理器的一些分析