一、安卓apk的文件结构首先来看一下Android apk的内部文件结构。随便下载一款手机APP,用解压工具即可查看到其内部文件结构,如图1所示:
Apk中的主要文件内容有:1. AndroidManifest.xml:Android主配置文件,编译过程中由文本格式转化为二进制AXML文件格式。2. Classes.dex: java代码编译后产生的一种类似字节码的文件。3. res/文件夹:资源文件,其中的.xml文件,在编译过程中由文本格式转化为二进制AXML文件格式。4. META-INF/文件夹:签名文件。5. Lib: native代码编译后的so。6. 其他文件夹:由开发者自己添加的文件Android apk的核心逻辑主要存在于classes.dex中,通常破解者在进行破解和二次打包时,会对classes.dex和AndroidManifest.xml文件进行操作,所以对这两个文件进行保护尤为重要。了解了Android apk每个文件的含义与用途,就可以有针对性的对其进行二次打包操作。
一、apk二次打包步骤通常,Android apk的二次打包步骤主要包括:1. 反编译(1) 反编译java:classes.dex反编译成中间文件(smali、jar)。(2) 反编译布局文件:Axml文件反编译成xml文件。2. 修改(1) 修改smali文件。(2) 修改xml文件。3. 重新编译(1) 修改后的smali编译成classes.dex。(2) 修改后的xml编译成Axml。4. 重签名对新的apk进行重签名,一款新的APP便产生了。
三、反编译工具1、 反编译java代码工具:(1) APKTool(2) Smali/baksmali(3) Dex2jar + jd—gui(4) 集成化图像窗口工具:改之理、JEB2、 反编译布局文件(xml)工具:(1) AXMLPrinter2(2) APKTool(3) Github上的解析AXML文件的开源项目
四、反编译apk反编译java是指把classes.dex文件利用反编译工具,生成一种中间语言.samli文件或者jar文件的过程,常用手段有:(1) Java –jar Apktool.jar d –r –f input.apk output目录。(2) java -jar baksmali-1.4.1.jar -o output目录 classes.dex。(3) dex2jar.bat classes.dex。 (4) 图像窗口工具:改之理或者JEB。(5) Android sdk自带dexdump工具。其中,dex2jar.bat工具输出的是.jar文件,是只读不可修改的。如果还需要修改并二次打包,不可选用该工具。其他的工具生成的都是smali文件。
五、修改.samli文件修改.samli语言的一些技巧:(2) 信息反馈法(弹出提示信息未突破点)。(2) 特征函数法(Toast、Log、getPublicKey等)。(3) 代码注入法(Log输出配合LogCat查看状态数据)。(4) 栈跟踪法 可疑点插入以下代码,既可以得到函数调用顺序:new Exception(“print trace”).printStackTrace();
六、 反编译布局文件(xml)工具反编译布局文件是指:把APK中,二进制的Axml文件还原成文本格式xml文件。常用手段:Java –jar Axmlprinter2.jar AndroidManifest.xml > out.xmlJava –jar Apktool.jar d input.apk output目录其中AxmlPrinter2.jar只是单向的,无法把文本文件重新编译成AXML。另外如果有比较高级的需求,以上2中工具无法满足。读者可以自己实现一个Axml文件解析器。网络上已经有许多类似的开源项目。
八、 重新编译APK为了使修改生效,需要重新编译文件,生成新的APK。1. 重新编译java代码:用修改后的.smali文件重新生成classes.dex文件。(1) java –jar Apktool.jar b –f input目录 new.apk(2) java -jar smali-1.4.1.jar classout/ -o classes.dex(3) 图像窗口工具:改之理或者JEB(4) 重新编译xml文件:(5) java –jar Apktool.jar b –f input目录 new.apk(6)基于github开源项目自己实现Axml文件解析器。注意:APK反编译和重新编译使用的工具要配套,例如:使用APKTool进行反编译,那么重新编译也要使用APKTool。
九、 重新签名1. 重新编译APK,生成新的APK后,由于改动了文件内容,所以必须进行重签名。2. 安装运行新APK。就可以看到改动生效了。以上就是二次打包的步骤,操作起来真的很简单。为了避免自己辛苦开发的APP惨遭破解和二次打包,出现了不少第三方的加固保护类产品。本人也使用并进行了分析,下次就为大家介绍其中360加固保是如何做到防止APP破解和二次打包的。