您的位置:首页 > 移动开发 > 微信开发

微信系列研究之-----资源文件保护的小把戏

2016-03-10 11:04 671 查看
前言

微信对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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: