微信系列研究之-----资源文件保护的小把戏
生活随笔
收集整理的這篇文章主要介紹了
微信系列研究之-----资源文件保护的小把戏
小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
前言
微信對(duì)APK進(jìn)行多維度的保護(hù),包括我們以前提到的客戶端到服務(wù)器驗(yàn)證簽名,插件驗(yàn)證,文件變動(dòng)檢測(cè),代碼混淆,把核心功能放在SO中等。
其中比較有特色的是對(duì)資源文件的保護(hù),防止被惡意分析和山寨。
目前在國(guó)內(nèi)對(duì)資源文件進(jìn)行保護(hù)的APK還比較少,大部分都只對(duì)代碼和插件進(jìn)行了保護(hù),所以微信這個(gè)特色值得我們?nèi)テ平庖幌隆?/span>
現(xiàn)象
我們通過(guò)APKTOOL對(duì)微信的APK進(jìn)行反編譯時(shí)就會(huì)發(fā)現(xiàn)?APKTOOL?只生成了?assets,lib,res,smali目錄(有些版本的APKTOOL還生成了UNKOWN目錄)。
進(jìn)入資源文件目錄,我們還發(fā)現(xiàn)圖片文件比較少。缺少大量的布局文件XML。
如果我們利用APKTOOL對(duì)微信反編譯后再打包,會(huì)出現(xiàn)一大堆錯(cuò)誤。
但如果我們直接把APK改名為ZIP,并解壓后,會(huì)發(fā)現(xiàn)還有r目錄。這其中必有蹊蹺。
原理
由于APKTOOL反編譯時(shí)只對(duì)RES目錄下的?二進(jìn)制XML進(jìn)行反編譯。
而對(duì)應(yīng)RES下的二進(jìn)制XML引用的其他目錄下的二進(jìn)制XML無(wú)法識(shí)別。
微信正是通過(guò)這個(gè)缺陷對(duì)APKTOOL進(jìn)行了欺騙。
<?xml?version="1.0"?encoding="utf-8"?>
<resources>
????<item?type="layout"?name="a3l">r/o/a3l.xml</item>
</resources>
破解方法:
ANDROID中activity查找資源文件的是
activity?(根據(jù)ID查找)->R.java對(duì)應(yīng)的資源標(biāo)號(hào)-》資源ID查找的對(duì)應(yīng)的資源路徑-》找到文件的路徑,讀取相應(yīng)的文件配置)。
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?控件對(duì)應(yīng)的ID?為?i.content
從中我們知道對(duì)應(yīng)的R.JAVA分別為?com.tencent.mm.k和?com.tencent.mm.i
通過(guò)com.tencent.mm.k.java?我們可以查到??
public?static?final?int?bek?=?2130903326;
通過(guò)十六進(jìn)制轉(zhuǎn)化?(2130903326->?0x7F03011E?)我們可以知道?EditSignatureUI.java對(duì)應(yīng)的布局文件的ID為?0x7F03011E
通過(guò)com.tencent.mm.k.java?我們可以查到??
?public?static?final?int?content?=?2131165340;
通過(guò)十六進(jìn)制轉(zhuǎn)化?(2131165340->?0x7F07009C?)我們可以知道?EditText控件對(duì)應(yīng)的布局文件的ID為?0x7F07009C。或者直接從com.tencent.mm.k.smali中查找,這樣可以不用進(jìn)行十六進(jìn)制轉(zhuǎn)化。
2.利用AAPT分析AP資源的表,得到相應(yīng)的資源編號(hào)文件
aapt?dump?--values?resources?weixin531.apk?>?resources.txt
3.通過(guò)查表我們可以找到對(duì)應(yīng)的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查找到的內(nèi)容對(duì)二進(jìn)制XML進(jìn)行反編譯輸出
aapt?dump?--values?xml
tree?weixin531.apk?r/t/h0.xml?>?h0.xml.txt?
到這一步基本就得到我們想要的資源布局文件了。
5.?我們還可以利用AXMLPrinter2對(duì)單個(gè)二進(jìn)制XML?進(jìn)行反編譯輸出
java?-jar?AXMLPrinter2.jar?h0.xml??>>?ho.xml.txt
得到的結(jié)果如下:
<?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>
通過(guò)布局文件,我們可以看到?EDITTEXT?控件?編號(hào)為(android:id="@7F07009C")對(duì)應(yīng)的風(fēng)格了。
如果布局文件太多,我們還可以批量進(jìn)行
for?/f??"tokens=*"?%%a?in?('dir?/s/b/a-d?"*.xml"')?do?(echo.%%a?
@java?-jar?AXMLPrinter2.jar?"%%a"??>>"%%na".txt)?
pause
由于AXMLPrinter2久未更新,AXMLPrinter2對(duì)ANDROID高版本的XML文件無(wú)法反編譯,為此我們需要下載修改過(guò)BUG的AXMLPrinter2
資源分享?修正后的AXMLPrinter2
微信對(duì)APK進(jìn)行多維度的保護(hù),包括我們以前提到的客戶端到服務(wù)器驗(yàn)證簽名,插件驗(yàn)證,文件變動(dòng)檢測(cè),代碼混淆,把核心功能放在SO中等。
其中比較有特色的是對(duì)資源文件的保護(hù),防止被惡意分析和山寨。
目前在國(guó)內(nèi)對(duì)資源文件進(jìn)行保護(hù)的APK還比較少,大部分都只對(duì)代碼和插件進(jìn)行了保護(hù),所以微信這個(gè)特色值得我們?nèi)テ平庖幌隆?/span>
現(xiàn)象
我們通過(guò)APKTOOL對(duì)微信的APK進(jìn)行反編譯時(shí)就會(huì)發(fā)現(xiàn)?APKTOOL?只生成了?assets,lib,res,smali目錄(有些版本的APKTOOL還生成了UNKOWN目錄)。
進(jìn)入資源文件目錄,我們還發(fā)現(xiàn)圖片文件比較少。缺少大量的布局文件XML。
如果我們利用APKTOOL對(duì)微信反編譯后再打包,會(huì)出現(xiàn)一大堆錯(cuò)誤。
但如果我們直接把APK改名為ZIP,并解壓后,會(huì)發(fā)現(xiàn)還有r目錄。這其中必有蹊蹺。
原理
由于APKTOOL反編譯時(shí)只對(duì)RES目錄下的?二進(jìn)制XML進(jìn)行反編譯。
而對(duì)應(yīng)RES下的二進(jìn)制XML引用的其他目錄下的二進(jìn)制XML無(wú)法識(shí)別。
微信正是通過(guò)這個(gè)缺陷對(duì)APKTOOL進(jìn)行了欺騙。
<?xml?version="1.0"?encoding="utf-8"?>
<resources>
????<item?type="layout"?name="a3l">r/o/a3l.xml</item>
</resources>
破解方法:
ANDROID中activity查找資源文件的是
activity?(根據(jù)ID查找)->R.java對(duì)應(yīng)的資源標(biāo)號(hào)-》資源ID查找的對(duì)應(yīng)的資源路徑-》找到文件的路徑,讀取相應(yīng)的文件配置)。
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?控件對(duì)應(yīng)的ID?為?i.content
從中我們知道對(duì)應(yīng)的R.JAVA分別為?com.tencent.mm.k和?com.tencent.mm.i
通過(guò)com.tencent.mm.k.java?我們可以查到??
public?static?final?int?bek?=?2130903326;
通過(guò)十六進(jìn)制轉(zhuǎn)化?(2130903326->?0x7F03011E?)我們可以知道?EditSignatureUI.java對(duì)應(yīng)的布局文件的ID為?0x7F03011E
通過(guò)com.tencent.mm.k.java?我們可以查到??
?public?static?final?int?content?=?2131165340;
通過(guò)十六進(jìn)制轉(zhuǎn)化?(2131165340->?0x7F07009C?)我們可以知道?EditText控件對(duì)應(yīng)的布局文件的ID為?0x7F07009C。或者直接從com.tencent.mm.k.smali中查找,這樣可以不用進(jìn)行十六進(jìn)制轉(zhuǎn)化。
2.利用AAPT分析AP資源的表,得到相應(yīng)的資源編號(hào)文件
aapt?dump?--values?resources?weixin531.apk?>?resources.txt
3.通過(guò)查表我們可以找到對(duì)應(yīng)的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查找到的內(nèi)容對(duì)二進(jìn)制XML進(jìn)行反編譯輸出
aapt?dump?--values?xml
tree?weixin531.apk?r/t/h0.xml?>?h0.xml.txt?
到這一步基本就得到我們想要的資源布局文件了。
5.?我們還可以利用AXMLPrinter2對(duì)單個(gè)二進(jìn)制XML?進(jìn)行反編譯輸出
java?-jar?AXMLPrinter2.jar?h0.xml??>>?ho.xml.txt
得到的結(jié)果如下:
<?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>
通過(guò)布局文件,我們可以看到?EDITTEXT?控件?編號(hào)為(android:id="@7F07009C")對(duì)應(yīng)的風(fēng)格了。
如果布局文件太多,我們還可以批量進(jìn)行
for?/f??"tokens=*"?%%a?in?('dir?/s/b/a-d?"*.xml"')?do?(echo.%%a?
@java?-jar?AXMLPrinter2.jar?"%%a"??>>"%%na".txt)?
pause
由于AXMLPrinter2久未更新,AXMLPrinter2對(duì)ANDROID高版本的XML文件無(wú)法反編譯,為此我們需要下載修改過(guò)BUG的AXMLPrinter2
資源分享?修正后的AXMLPrinter2
???http://download.csdn.net/detail/simbaba/8625893
原文地址:http://www.kanxue.com/bbs/showthread.php?t=202303
總結(jié)
以上是生活随笔為你收集整理的微信系列研究之-----资源文件保护的小把戏的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 基于Android的ELF PLT/GO
- 下一篇: 关于android设备管理器的一些分析