• Archive by category "android"

Blog Archives

android apk破解

1 破解目的

android破解应用可以分为两类,一类纯粹的破解,获取有价值信息:如获取该资源素材、获取该应用webservice接口、代码实现、使用的开源组件等;第二类破解后修改:如本地化(汉化)、去广告、添加广告、替换资源素材等。

2 破解对象

先来看看破解对象,即后缀为apk的安装包apk,这是一个压缩包,可以直接修改后缀为zip,然后用解压工具查看。演示应用压缩包内容结构如下图。

 

apk_stru

每个应用都会包括的而且也是最重要的文件是AndroidManifest.xml 、res、assets、META-INF、classes.dex。AndroidManifest.xml是整个的配置文件,里面会包括使用到的权限、activity、service的声明等,加密;res存放定义drawable、string、layout、color的xml,通常加密;assets存放静态的资源文件,如图片、音频、视频、数据文件等,通常不加密;classes.dex是dex是Android系统中可以在Dalvik虚拟机上直接运行的文件格式,java源代码经过ADT的复杂编译后转换成Dex文件,Dalvik是Google公司自己设计用于Android平台的Java虚拟机;META-INF的文件夹,这个里边存储的是关于签名的一些信息。例如汉化通常要修改res文件夹下的字符串xml,去广告通常要修改res下布局xml,获知实现的Java代码通常通过反编译classes.dex。为了获取你想要的东西,每个可疑文件都不能放过。

 

3 如何破解

下面将从两种目的的破解介绍如何破解。

3.1查看型

查看型破解要求尽可能还原出可读信息,可读性最好的当然是源码,如Java源码,xml源码;次之为中间代码,如smali字节码;最后二进制代码,如so文件。

3.1.1 xml文件的反编译

1.使用AXMLPrinter2.jar单独反编译一个

wingyiu@mbp101:~$java -jar AXMLPrinter2.jar /User/user/V1.5.8_V4.0_demaiwebsite/AndroidManifest.xml > /User/user/demai/AndroidManifest.xml

2.使用apktool反编译全部

 wingyiu@mbp101:~/Android/apktool-install-macosx-r05-ibot$./apktool d ../V1.5.8_V4.0_demaiwebsite.apk ../demai
 I: Baksmaling...
 I: Loading resource table...
 W: Skipping "android" package group
 I: Loaded.
 I: Decoding AndroidManifest.xml with resources...
 I: Loading resource table from file: /Users/user/Library/apktool/framework/1.apk
 I: Loaded.
 I: Regular manifest package...
 I: Decoding file-resources...
 W: Cant find 9patch chunk in file: "drawable-hdpi/contact_detail_item_deep.9.png". Renaming it to *.png.
 W: Cant find 9patch chunk in file: "drawable-hdpi/message_chat_edit_normal.9.png". Renaming it to *.png.
 I: Decoding values */* XMLs...
 I: Done.
 I: Copying assets and libs...

1DFA5429-3973-484E-94A4-B2F9E67E9C37
此时res/下的xml和AndroidManifest.xml都已反编译好。smali/文件夹,里面存放着所有反编译出的smali字节码文件,按包目录结构存放。

3.1.2 classes.dex反编译

1.使用dex2jar把classes.dex转换为jar文件,可以类比为把smali转换为class

wingyiu@mbp101:~$cd Android/V1.5.8_V4.0_demaiwebsite
wingyiu@mbp101:~/Android/V1.5.8_V4.0_demaiwebsite$../dex2jar-0.0.9.15/d2j-dex2jar.sh classes.dex 
dex2jar classes.dex -> classes-dex2jar.jar

jar文件class文件的压缩包,即使直接解压无法直接阅读,此时可以使用jd-gui、jode、jad(或者他们的eclipse插件jodeclipse、jadclipse)。
2.使用jd-gui打开classes-dex2jar.jar

B5BDDAD3-72AE-4BAA-AF69-11F4833E0FCF可以看出这个应用除了第三方库做了代码混淆,其自身的代码是没有做混淆的。从报名可以大概看出该应用使用了高德地图、Google Gson等第三方库,如果不知道报名对应的库,只要把包名搜一下就知道了。虽然没混淆,但也不是所有代码都可以顺利查看的,比如下面的常量类。
32AB125A-634D-4606-8D4F-B40A3EFA0E56

 

混淆过得代码包名、类名、变量名、参数名会被无意义的a、b、aa之类代替,无法轻易理解,在一定程度上起到防反编译的效果,但效果不大。

F1865A1F-F9FC-4180-A043-2760F8E0F626

 

如果混淆过,只能通过反编译得到smali字节码文件,然后尝试从字节码文件获取信息了。

3.使用apktool反编译smali
此处不再复述,参考上面

3.1.3 so文件

未完待续

3.2 修改型

流程:通过apktool反编译整个apk,然后修改xml和smali文件或者so文件,重新打包,然后重新签名。

3.2.1 反编译,还是使用apktool

3.2.2 修改

3.2.2.1 修改静态资源

例如汉化时遇到文字是图片形式的,则可以用ps修改然后替换图片文件即可

3.2.2.2 修改xml

可以修改string、color数值,layout不可随意修改,此时可以通过修改属性值。例如把广告空间改为隐藏,或者宽高为0

3.2.2.3 修改smali

smali字节码资料参考这里。只需修改需要的地方,所以首先是定位到关键点,然后修改之。找到关键点办法:
1.资源id(通过布局xml和R类);
2.字符串(中文在smali文件里以utf8裸编码格式存储,如“\u91d1\u5e01\u4e0d\u8db3,\u65e0\u6cd5\u8d2d\u4e70”,可以通过字符转码工具来把中文转为utf8然后搜索smali文件);
3.动态调试smali(参考这里,工具如AndBug

3.2.2.4 修改so

 3.2.3 重新打包

wingyiu@mbp101:~/Android/apktool-install-macosx-r05-ibot$./apktool b ../duoxin
I: Checking whether sources has changed...
I: Smaling...
I: Checking whether resources has changed...
I: Building resources...
I: Copying libs...
I: Building apk file...

在原目录duoxin/dist就可以见到新的apk了

3.2.4 重新签名

apk还没有签名是无法安装的,开发时调试用的是debug签名。签名需要keystore文件,请参阅这里进行生成。

执行以下命令为重新编译的demai.apk签名:

$jarsigner -verbose -keystore wingyiu.keystore demai.apk Alias_name
Enter Passphrase for keystore: 
 adding: META-INF/MANIFEST.MF
 adding: META-INF/WINGYIU.SF
 adding: META-INF/WINGYIU.RSA
 signing: assets/frontia_plugin/plugin-deploy.jar
 ...
jar signed.

Warning: 
No -tsa or -tsacert is provided and this jar is not timestamped. Without a timestamp, users may not be able to validate this jar after the signer certificate's expiration date (2042-03-28) or after any future revocation date.

$zipalign -v 4 your_project_name-unaligned.apk your_project_name.apk

最后,在安装到手机前,需要把手机中的已有版本先卸载,因为如果签名不同,是不能覆盖安装的,会提示“应用程序未安装”错误。