微信系列研究之-----资源文件保护的小把戏
16lz
2021-01-26
前言
微信对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"?>
- r/o/a3l.xml
破解方法:
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"?>
xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="1"
android:layout_width="-1"
android:layout_height="-2"
>
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"
>
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"
>
android:textSize="@7F0A0016"
android:textColor="@7F090029"
android:layout_gravity="0x00000055"
android:id="@7F070380"
android:padding="@7F0A001D"
android:layout_width="-2"
android:layout_height="-2"
>
android:gravity="0x00000001"
android:layout_width="-1"
android:layout_height="-2"
android:layout_marginTop="@7F0A0023"
>
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"
>
通过布局文件,我们可以看到 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"?>
破解方法:
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"?>
xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="1"
android:layout_width="-1"
android:layout_height="-2"
>
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"
>
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"
>
android:textSize="@7F0A0016"
android:textColor="@7F090029"
android:layout_gravity="0x00000055"
android:id="@7F070380"
android:padding="@7F0A001D"
android:layout_width="-2"
android:layout_height="-2"
>
android:gravity="0x00000001"
android:layout_width="-1"
android:layout_height="-2"
android:layout_marginTop="@7F0A0023"
>
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"
>
通过布局文件,我们可以看到 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(安卓)开发技巧-以友盟为例在Android(安卓)Studio利用gra
- Android(安卓)使用腾讯的TBS浏览器X5内核的集成加载pdf等文件
- 别让Android(安卓)Studio占据你的C盘
- Android入门教程(六)之------拿来主义.apk文件的反编译
- Android中批处理drawable-xxx目录中图片资源的那些事儿
- [Android] 底部菜单布局+PopupWindows实现弹出菜单功能(初级篇)
- Android(安卓)UI 实现表格布局
- Android(安卓)UI绘制优化及建议
- gradle教程 [原创](eclipse/ADT下 非插件 非Android(安卓)Studio/