用apktool反编译apk

apktool 现在最流行的apk反编译工具,下载apktool之后会发现下面几个文件(Windows平台,mac 和Linux应该类似)

  1. aapt.exe 这个工具其实来自于Android SDK 是用来把代码和资源打包成 apk 用的
  2. apktool.jar 这个接近3M的jar文件是 apktool所有的代码了,主要用来反编译代码和Android的二进制格式资源
  3. apktool.bat 一个批处理的脚本,方便你执行 apktool.jar 这个文件
>apktool
Apktool v1.5.2 - a tool for reengineering Android apk files
Copyright 2010 Ryszard Wi?niewski <brut.alll@gmail.com>
with smali v1.4.1, and baksmali v1.4.1
Updated by @iBotPeaches <connor.tumbleson@gmail.com>
Apache License 2.0 (http://www.apache.org/licenses/LICENSE-2.0)

Usage: apktool [-q|--quiet OR -v|--verbose] COMMAND [...]

COMMANDs are:

    d[ecode] [OPTS] <file.apk> [<dir>](反编译)
        Decode <file.apk> to <dir>.

        OPTS:
        -s, --no-src
            Do not decode sources. (不反编代码)
        -r, --no-res
            Do not decode resources.(不反编资源文件,因为Android中的资源都是重新打包成二进制格式的,所以也需要反编之后才能看因为比较耗时,所以有这个选项可以跳过)
        -d, --debug
            Decode in debug mode. Check project page for more info.
        -b, --no-debug-info
            Baksmali -- don't write out debug info (.local, .param, .line, etc.)
        -f, --force
            Force delete destination directory. (如果反编的文件夹已经存在,强制删除)
        -t <tag>, --frame-tag <tag>
            Try to use framework files tagged by <tag>.
        --frame-path <dir>
            Use the specified directory for framework files (指定framework文件的路径)
        --keep-broken-res
            Use if there was an error and some resources were dropped, e.g.:
            "Invalid config flags detected. Dropping resources", but you
            want to decode them anyway, even with errors. You will have to
            fix them manually before building.

    b[uild] [OPTS] [<app_path>] [<out_file>](重新打包)
        Build an apk from already decoded application located in <app_path>.

        It will automatically detect, whether files was changed and perform
        needed steps only.

        If you omit <app_path> then current directory will be used.
        If you omit <out_file> then <app_path>/dist/<name_of_original.apk>
        will be used.

        OPTS:

        -f, --force-all (强制打包,略过错误检测,因为资源可能会变化或者反编译的时候就损坏了)
            Skip changes detection and build all files.
        -d, --debug
            Build in debug mode. Check project page for more info.
        -a, --aapt (指定一个 aapt ,原始的apk打包的时候可能使用的版本可能比较新,这时候如果用较旧的aapt可能会出现问题)
            Loads aapt from specified location.

    if|install-framework <framework.apk> [<tag>] --frame-path [<location>]
        Install framework file to your system.

For additional info, see: http://code.google.com/p/android-apktool/
For smali/baksmali info, see: http://code.google.com/p/smali/

反编译一个APK:执行 apktool d xxx.apk 就可以把 xxx.apk 反编译,反编译之后的东西在 xxx 这个文件夹中,调用 apktool b xxx out.apk 就可以把 xxx 文件夹中的东西打包成 out.apk。

有两个没有解释的选项 -d-b 这两个选项是在把dex文件中的代码反编译成smali文件的时候使用的,具体也没有深入研究过,可以参考下 这里.

有些选项是和framework文件相关的,这是什么东西呢?如果使用过一次apktool这个工具,就会发现在当前用户名的目录下会多一个目录,比如我的 机器 C:\Users\Administrator\apktool\framework 这个目录中包含一个文件叫1.apk, 解压1.apk里面只包含一个 resources.arsc 文件,这是 Android中资源文件的打包方式,res目录下的非二进制资源都会按照一定格式打包在这中文件中。

但是这个文件究竟做什么用的呢?原因是这样的,在写Android程序的时候我们有时候会引用一些系统的资源,比如 android.R.string.ok 这会 引用一个内置在系统里面的字符串,如果App在机器上运行的时候使用到了这个资源,就是显示 “Ok” 这个字符串,但是在反编apk的时候,解析 到了这个值(R文件中定义的都是整型值比如 android.R.string.ok 等价于 0x0104000a)反编工具看到的是0x0104000a 这样一个值我们需要 一个映射表找到对应的资源, resources.arsc 文件就是这个映射表,里面定义了”0x0104000a” -> “Ok” 的映射。

在apktool中内置一个1.apk是标准Android程序需要的,但是在修改一些特有机型上的App的时候比如HTC的 sense UI 的home程序,这个桌面程序 会引用一些标准Android中不存在,但是这台机器上存在的资源,那么就需要专门再指定HTC机器上的framework文件。具体可以看看 这里的描述。

反编的时候一个常见问题是Android的版本一直在升级,framework 文件也一直在变化,这导致不同版本的apktool所携带的frmework文件也会升级。但是我们 这些用现成工具搞反编译的,有时候会下载不同版本的apktool工具,然后每个工具都会引用用户名\apktool\framework\1.apk这个文件,但是 这个文件适用的版本又不一样,就会导致反编译不成功,这时候只要删除这个文件,让 apktool 重新再生成一次就行了。

PS:使用友盟的渠道打包工具的时候,有时候会报一些错误”Parsing ‘AndroidManifest.xml’ eror:” 这个错误实际是由于打包工具反编译APK失败 导致的,反编失败有两种可能一种是 java的环境变量设置有错误,一种是上面提到的 framework文件版本不对导致的,删除旧的就行了。

nTop 05 December 2014
blog comments powered by Disqus