首页 > 代码库 > 如何分析Android程序之破解第一个程序
如何分析Android程序之破解第一个程序
破解Android程序通常的方法是将apk文件利用ApkTool反编译,生成Smali格式的反汇编代码,然后阅读Smali文件的代码来理解程序的运行机制,找到程序的突破口进行修改,最后使用ApkTool重新编译生成apk文件并签名,最后运行测试,如此循环,直至程序被成功破解。
1. 反编译APK文件
ApkTool是跨平台的工具,可以在windows平台与linux平台下直接使用。使用前到:http://code.google.com/p/android-apktool/ 下载ApkTool,目前最新版本为1.4.3,Windows平台需要下载 apktool1.4.3.tar.bz2与apktool-install-windows-r04-brut1.tar.bz2两个压缩包,如果是linux系统则需要下载apktool1.4.3.tar.bz2与apktool-install-linux-r04-brut1.tar.bz2,将下载后的文件解压到同一目录下。进入到命令行的解压目录下,执行apktool命令会列出程序的用法:
反编译apk文件的命令为: apktool d[ecode] [OPTS] <file.apk> [<dir>]
编译apk文件的命令为: apktool b[uild] [OPTS] [<app_path>] [<out_file>]
那么在命令行下进入到apktool工具目录,输入命令:
$ ./apktool d /home/fuhd/apk/gnapk/nice/com.nice.main.apk outdir
稍等片刻,程序就会反编译完成,如图:
2. 分析APK文件
如上例,反编译apk文件成功后,会在当前的outdir目录下生成一系列目录与文件。其中smali目录下存放了程序所有的反汇编代码,res目录则是程序中所有的资源文件,这些目录的子目录和文件与开发时的源码目录组织结构是一致的。
如何寻找突破口是分析一个程序的关键。对于一般Android来说,错误提示信息通常是指引关键代码的风向标。以书中的注册示例为例,在错误提示附近一般是程序的核心验证代码,分析人员需要阅读这些代码来理解软件的注册流程。
错误提示是Android程序中的字符串资源,开发Android程序时,这些字符串可能硬编码到源码中,也可能引用 自“res/values”目录下的strings.xml文件,apk文件在打包时,strings.xml中的字符串被加密存储为“resources.arsc”文件保存到apk程序包中,apk被成功反编译后这个文件也被解密出来了。
以书中2.1.2节运行程序时的错误提示,在软件注册失败时会Toast弹出“无效用户名或注册码”,我们以此为线索来寻找关键代码。打开“res/values/strings.xml”文件,内容如下:
<?xml version="1.0" encoding="utf-8" ?> <resources> <string name="app_name">Crackme0201</string> <string name="hello_world">Hello world!<string> <string name="menu_settings">Settings</string> <string name="title_activity_main">crackme02</string> <string name="info">Android程序破解演示实例</string> <string name="username">用户名:</string> <string name="sn">注册码:</string> <string name="register">注册</string> <string name="hint_username">请输入用户名</string> <string name="hint_sn">请输入16位的注册码</string> <string name="unregister">程序未注册</string> <string name="registered">程序已注册</string> <string name="unsuccessed">无效用户名或注册码</string> <!-- 就是这一行 --> <string name="successed">恭喜您!注册成功</string> </resources>
开发Android程序时,strings.xml文件中的所有字符串资源都在“gen/<packagename>/R.java”文件的String类中被标识,每个字符串都有唯一的int类型索引值,使用Apktool反编译apk文件后,所有的索引值保存在strings.xml文件同目录下的public.xml文件中。
如何分析Android程序之破解第一个程序