什么是apk文件
APK是Android Package Kit的缩写,即Android安装包。APK文件其实是zip格式,但后缀名被修改为apk,通过UnZip解压后,可以看到Dex文件,Dex是Dalvik VM executes的全称,即Android Dalvik执行程序,并非Java ME的字节码而是Dalvik字节码。APK文件结构为:

1
2
3
4
5
META-INF:Jar文件中常可以看到
res:存放资源文件的目录
AndroidManifest.xml:程序全局配置文件
classes.dex:Dalvik字节码
resources.arsc:编译后的二进制资源文件
Android在运行一个程序时首先需要UnZip,再通过dexdump命令可以反编译,这样做对于程序的保密性和可靠性不是很高但符合发展规律。Dalvik Vm的执行文件被打包为apk格式,最终运行时,加载器会解压apk并获取编译后的androidmanifest.xml文件中的permission中相关的安全访问。

如果你将apk文件传到/system/app文件夹下会发现执行是不受限制的,android rom中系统的apk文件默认会放入这个文件夹,它们拥有着root权限。但第三方程序并不是安放在这个文件夹的。

apk的打包
在Eclipse中,编译好的android project,在该project的bin目录下会自动生成一个apk文件,与J2ME不同,无需手动打包。只要代码有改动就自动build,build出来的apk是签过名的,也可以在project右键菜单的Andoid Tools菜单下export签名的或未签名的apk。如果使用adb shell rm手工删除过应用,此时在Eclipse中运行Android项目时会出错,你可以选择Project-Clean…菜单来清空项目,然后再运行Android项目时就会重新编译安装了。

将apk安装到android simulator中
通过tools/emulator启动模拟器。这里要注意,这个命令只有在avd配置好后才可以使用,例如我有一个名为android3的avd,所以我要用如下方法启动emulator:emulator –avd android3

将要安装的apk文件copy到tools目录下;

cmd进入命令行输入,进入到tools目录下,输入命令:adb install ***.apk安装应用到模拟器中。

apk破解之dexdump反编译Android程序
反编译Android程序目前没有什么好的方法,但是在Android/platforms/android-2.0.1/tools中可以找到一个名为dexdump的程序,通过dexdump可以查看出apk文件中的dex执行情况,ophone8.com粗略分析出原始java代码是什么样的和Dot Net中的Reflector很像。android编译器生成的java class相关内容都放到了dex文件中,为什么要反编译apk文件呢? 就目前来看Android开放度还很低,很多东西只有反编译官方的app才可以了解一些底层的东西。

对于软件开发人员来说,保护代码安全也是比较重要的因素之一,不过目前来说Google Android平台选择了Java Dalvik VM的方式使其程序很容易破解和被修改,首先APK文件其实就是一个MIME为ZIP的压缩包,我们修改ZIP后缀名方式可以看到内部的文件结构,类似Sun JavaMe的Jar压缩格式一样,不过比较去别的是Android上的二进制代码被编译成为Dex的字节码,所有的Java文件最终会编译进该文件中去,作为托管代码既然虚拟机可以识别,那么我们就可以很轻松的反编译。所有的类调用、涉及到的方法都在里面体现到,至于逻辑的执行可以通过实时调试的方法来查看,当然这需要借助一些我们自己编写的跟踪程序。模拟器自带了一个dexdump,有兴趣的网友可以先了解下,同时以及有关APK文件的汉化,我们将在下一次做详细的分析,因为这里主要是修改的不是dex而是资源文件,使用类似UltraEdit这样的工具以字节对齐的方式逐个替换即可,最终再签名下即可使用,这样的行为可以算作是非法修改,不过目前这样的方法在国内很流行,Google最然在Android Market上设置了权限保护app-private文件夹的安全,但是最终我们使用修改定值的系统仍然可以获取到需要的文件。

首先要把apk的class.dex dump出来,具体步骤:

1
2
3
4
用winrar或者winzip打开apk,直接拖出来;
用android sdk1.1版本以上的一个dexdump工具把class.dex文件dump成文本;
把刚才的class.dex文件放在和dexdump工具同目录;
用命令窗口执行:dexdump -d classes.dex > spk.dump.txt,意思是将classes.dex dump出来形成一个txt文件;
下一步就要读懂这个txt文件了,先从header中可以看清楚这个应用的总体信息,有几个类,包括内部类 ,header只是了解概况。要详细去分析下面的每一个class才能真正理解这个软件的设计过程。最好的方法是一边研究里面的opcode一边打开api来查看里面调用到的类和方法,减少误解的机率。opcode就是介于高级编程语言和二进制代码之间的一层中间码,operation
code叫操作码。读懂opcode主要是熟悉里面的逻辑跳转以及一些个别助记符的含义。

通过opcode你就可以清晰的知道里面每个方法资源的调用过程和逻辑跳转过程。做过的例子都有点复杂,就不举例了。当然,要破解整个apk最好是翻译opcode和应HexWorkShop查看资源文件相结合比较合理和轻松,尤其是ManiFest.xml这个文件,一定要看清楚里面的activity和service receiver,permissions 这几个部分的信息,这可能会成为整个破译流程的关键部分。

能够说的经验暂时就只有这么多,正着手写一个工具专门用来翻译opcode成java代码。这是一个复杂的过程,普通的资源调用只需要匹配相关的文本就能翻译过来,但是一些复杂的跳转和个别特殊表达式需要费时费力去想想。

反编译dex文件的命令和参数解释:

1
2
3
4
5
6
adb shell dexdump -d -f -h /data/dalvik-cache/data@app@com.superdroid.list@classes.dex > code.text
-d : disassemble code sections
-f : display summary information from file header
-h : display file header details
-C : decode (demangle) low-level symbol names
-S : compute sizes only
non-IDE开发android
如果不使用Eclipse的ADT组件开发Android,必须要熟悉Android SDK提供下面几个工具:

android (android工具)
创建/更新Android工程和创建/移动/删除Android虚拟设备,使用android命令创建的工程中会自动生成build.xml的ant编译文件,使用它可以将项目编译成.apk文件。

Android Emulator (emulator工具)
Android的应用程序需要在模拟的Android平台上运行

Android Debug Bridge (adb工具)
连接模拟器或者设备(安装应用程序,进入设备的shell,发出命令等等)。

除了上面这些Android SDK提供的工具外,还需要下面的几个开源的第三方工具:

Ant
把项目编译并组建成可安装的.apk文件

Keytool
创建一个密钥证书存储文件和一个私钥,用来为.apk文件签名

Jarsigner (类似的签名工具)
用Keytool产生的私钥为.apk文件签名

创建一个Android工程:如果创建一个Android工程,必须使用android工具,它会产生一个含有默认的程序文文件,存根文件,配置文件和一个组建文件的目录。

android的用法:
android create project --target <targetID> --path <projectPath> --activity <activityName> --package <packageName>

参数:
target 与创建工程使用的Android平台库有关,使用android list target命令可以查看所有的可用target.
path 是工程的存储位置
activity 是Activity类的名字.它被创建的位置在<工程文件路径> /src/<包路径> .
package 是项目的包名,符合java的规范

例如:
android create project --target 1 --path ./nonIDEProject --activity nonIDEProjet --package nonIDEpackage

运行这个命令之后就会生成以下几个文件或者目录:
AndroidManifest.xml 应用程序的manifest文件,与制定的Activity类保持同步.
build.xml Ant的编译文件
default.properties 组件系统的默认属性信息,一般不要修改这个文件.
build.properties 自定义的组件系统属性信息,可以修改这个文件覆盖Ant使用的默认组建配置信息.
src/package_path/ActivityName.java 创建项目时产生的Activity类.
bin/ ant脚本的输出目录.
gen/ 保存Ant生成的文件.
libs/ 保存私有库.
res/ 保存工程资源
tests/ 保存上面所有文件的副本,做测试用
为应用程序提供数字签名:每一个Android应用程序必须要有数字签名才能安装.有两种方法:一种是使用调试密钥(可以在模拟器或者设备上做调试时使用),还有一种就是私钥(为应用程序发布用).当组建Adriod应用程序时组建工具会自动为应用程序提供签名,但是如果想发布应用程序的时候,必须使用自己的私钥.

有两种方法编译应用程序,一种是调试模式,在组建的时候系统会自动加上签名;另一种是发布模式,需要手工添加签名.只有有签名的应用程序才可以安装.这里以调试模式举例:

ant debug # 或者ant release发布模式
之后会在bin目录下生成名字为<acvitityName>-debug.apk,因为是以调试模式编译的,所以系统已经自动加上了签名。

运行应用程序:运行应用程序,必须经过以下步骤:

创建一个模拟器
要创建一个模拟器,要提供一个target参数,命令android list targets可以列出可用的所有target:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
$ android list targets
Available Android targets:
id: 1
Name: Android 1.1
Type: Platform
API level: 2
Skins: HVGA (default), HVGA-L, HVGA-P, QVGA-L, QVGA-P
id: 2
Name: Android 1.5
Type: Platform
API level: 3
Skins: HVGA (default), HVGA-L, HVGA-P, QVGA-L, QVGA-P
id: 3
Name: Google APIs
Type: Add-On
Vendor: Google Inc.
Description: Android + Google APIs
Based on Android 1.5 (API level 3)
Libraries:
* com.google.android.maps (maps.jar)
API for Google Maps
Skins: QVGA-P, HVGA-L, HVGA (default), QVGA-L, HVGA-P

#使用下面的命令创建模拟器:
android create avd --name <avdName> --target <targetID>
接下来会提示是否自定义配置硬件配置信息,如果选择yes,会被继续提示选择配置的各个选项让你选择,如果选择no(默认),就会使用默认的配置信息。

运行模拟器
使用下面的命令运行模拟器:

1
emulator -avd <avdName>
这时候就会出现模拟器的运行画面:)

安装应用程序
1
adb install /appPath/apps.apk
这时,如果安装成功的话,就可以在模拟器的主菜单上看到安装的应用了,点击就可以运行:)

总结:
说了这么多,其实创建一个非Eclipse IDE的android项目就一下几个步骤,使用几个工具:

创建项目:android create project
编写程序
编译,创建应用程序(添加数字签名):ant debug 或者 ant release
运行模拟器:emulator -avd
安装应用程序:adb install
运行程序
注意事项
所有运行的命令都在Linux shell或者Windows命令提示符下运行,所以必须设置好各种环境变量,包括JDK的path变量,JAVA_HOME变量,classpath变量,Android的bin目录和Ant工具也要加入path路径中,否则必须在运行命令时指明完整路径。值得一提的是,jdk的安装路径默认是c:\program files\java,由于空格的原因,可能会导致Ant编译失败。
来自http://gooss.org/apk-package/

更多相关文章

  1. Android(安卓)中的微型云
  2. Android自动化测试之Monkey工具
  3. android 文件系统分析
  4. android 自定义进度条颜色
  5. android反编译
  6. Android(安卓)NDK学习之 一. Android(安卓)NDK简介
  7. 箭头函数的基础使用
  8. NPM 和webpack 的基础使用
  9. Python list sort方法的具体使用

随机推荐

  1. android中APK开机自动运行
  2. Android(安卓)长按setOnItemLongClickLis
  3. Android(安卓)Drawable、Bitmap、byte[]
  4. 如何为Android(安卓)Activity设置背景图
  5. android 6.0系统 make otapackage 错误
  6. Android(安卓)RecyclerView(1)——范例篇
  7. Intent在Android中的几种用法 .
  8. Android(安卓)6.0 关于WiFi的改变
  9. android 仿微信5版本实现滑动导航条
  10. Android监听屏幕屏幕锁屏与解锁