如何分析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文件中。

时间: 2024-08-27 00:18:13

如何分析Android程序之破解第一个程序的相关文章

分析Android程序之破解第一个程序

破解Android程序通常的方法是将apk文件利用ApkTool反编译,生成Smali格式的反汇编代码,然后阅读Smali文件的代码来理解程序的运行机制,找到程序的突破口进行修改,最后使用ApkTool重新编译生成apk文件并签名,最后运行测试,如此循环,直至程序被成功破解. 1. 反编译APK文件 ApkTool是跨平台的工具,可以在windows平台与linux平台下直接使用.使用前到:http://code.google.com/p/android-apktool/  下载ApkTool,

Android使用AndEngine创建第一个程序

首先要把andengine.jar复制到libs文件夹里 01 package com.hu.anden; 02   03 import org.anddev.andengine.engine.Engine; 04 import org.anddev.andengine.engine.camera.Camera; 05 import org.anddev.andengine.engine.options.EngineOptions; 06 import org.anddev.andengine.

Arcgis runtime sdk for android(二)第一个程序Holle Map

说实话,我卡在第一个程序很久,不会,懂得人觉得太简单了,不想理我,很无助,不过习惯了.做事靠自己. 在做这个之前,你需要确保你的环境已经搭建好了,最好你的第一个安卓程序hello world!也跑起来了,那么下面这个hello map将变得非常简单. 做第一个程序,你需要的是什么都不要知道,只需要,我做什么你做什么,因为我了解的不多,回答不来你的很多问题,我也是初学者,写这个主要是心路历程.其实,等你有安卓开发基础,来看这个东西就比较轻松了,不然和我刚开始一样很吃力. 根据官网的guide指导,

破解第一个程序----分析APK文件

反编译APK成功后,在outdir目录下会生成一系列目录与文件. smali:程序所有的反汇编代码: res:程序中所有的资源文件: 如何寻找突破口是分析程序的关键.错误提示一般是指引关键代码的风向标,错误提示附近一般是核心验证代码,我们需要阅读这些代码来理解软件的注册流程. 错误提示是安卓中的字符串资源: 1:硬编码到源码中: 2:引用自“res\values"目录下的string.xml文件. apk文件在打包时,string.xml文件中的字符串被加密存储在resources.arsc文件

android学习三---创建第一个程序

1.创建一个Helloworld程序 1.1 new-android application 点击file-new-android application出现如下界面 填上应用名,项目名,包名,选择所需最低的SDK版本,目标版本和编译版本,next next 选择一个Activity,默认是blank.然后Finish. 就创建好一个android项目了.不需要添加任何代码,就可以运行了. 2.创建虚拟机和在真机上运行 2.1 模拟器运行 打开工具栏上AVD的按钮 出现创建VD(虚拟机)的界面

Chapter2——如何分析Android程序(一)

前几天买了<Android软件安全与逆向分析>这本书,决定在这里记一些笔记. 第一章介绍了如何搭建环境,此处略去:第二章开始讲分析Android程序. 下面按顺序记录关键内容. -------------------------------------- 2.1.编写一个需要填写注册码的APK 要破解要现有「试验品」,作者编写了一个叫做crackme02的APP, 主要代码有: MessageDigest digest = MessageDigest.getInstance("MD5

Android中的软件安全和逆向分析[二]—apk反破解技术与安全保护机制

在Android应用开发中,当我们开发完软件之后,我们不希望别人能够反编译破解我们的应用程序,不能修改我们的代码逻辑.实际上,在应用程序的安全机制考虑中,我们希望自己的应用程序安全性高,通过各种加密操作等来增大竞争对手的反编译破解成本.设想,竞争对手开发一个同样的应用程序需要10天,而破解我们的软件程序需要100天,那么势必会打消黑客程序员破解我们应用程序的念头.如何增加对手的破解成本,就需要考验我们应用程序的安全性有多高,加密技术有多强.一个优秀的应用程序,不仅能为用户带来利益,同时也能保护自

你好,世界——新手的第一个程序

第一篇 大学的时候就开始学习C#语言了,然后工作以后也做的是相关的开发.一晃就是5年,也没有变成大牛,感觉在C#上面还是个菜鸟呢. 要开始你程序生涯的第一个程序,工欲善其事必先利其器,所以你需要安装 Visual Studio,和其它语言相比C#的开发工具还是比较不错的,不像java有好多种开发工具,着实让一个想进入编程世界的新手头痛一阵子.关于如何安装和版本的选择,安装Visual Studio 2008.2010.2015或者别的版本均可,如何安装可以百度Visual Studio安装教程就

在Eclipse中使用MAT分析Android程序内存使用状况(转)

对于Android这种手持设备来说,通常不会带有太大的内存,而且一般用户都是长时间不重启手机,所以编写程序的时候必须要非常小心的使用内存,尽量避免有内存泄露的问题出现.通常分析程序中潜在内存泄露的问题是一件很有难度的工作,一般都是由团队中的资深工程师负责,而且随着程序代码量的提高,难度还会逐步加大. 今天要介绍一个在Eclipse中使用的内存分析工具——MAT(Eclipse Memory Analyzer,主页在http://www.eclipse.org/mat/).它是一个功能非常丰富的J