Android - 反编译android apk文件
Yes or Not?
主要目的: 学习优秀的软件设计,解决封闭包特定问题
邪恶的做法:去除广告,修改别人的软件包名,重新打包发布。
有争议的: 中文汉化
注意 请遵循Google相关协议和相关法律法规
反编译apk工具
目前有几种工具:
smali
dedexer
dexdump
apktool
dex2jar + jd-gui
关于smali的使用,请参考jserv的http://jserv.blogspot.com/2010/05/android.html
dexdump功能比较弱,且麻烦,就不讨论介绍了。
解压apk
这里拿com.himsn.apk 做例子,apk包其实是一个zip文件,直接解压
$ unzip com.himsn.apk
得到一驼的东西:
.
├── AndroidManifest.xml 程序全局配置文件
├── classes.dex Dalvik 字节码
├── META-INF
│ ├── ALIAS_NA.RSA
│ ├── ALIAS_NA.SF
│ └── MANIFEST.MF
├── res 存放资源文件的目录
│ ├── anim
│ │ ├── cycle_7.xml
│ │ └── shake.xml
│ ├── drawable
│ │ ├── avatar_unknown.png
│ │ ├── ...
│ │ ├── button_choose_contact.xml
│ │ ├── typing4.png
│ │ └── typing.xml
│ ├── layout
│ │ ├── add_contact.xml
│ │ ├── ...
│ │ └── two_line_list_item.xml
│ ├── menu
│ │ ├── choose_contact_offline.xml
│ │ ├── choose_contact.xml
│ │ └── main.xml
│ ├── raw
│ │ ├── key_char.jpg
│ │ ├── key_num.jpg
│ │ ├── ...
│ │ ├── key_pressed_right.png
│ │ └── winks.png
│ └── xml
│ └── preferences.xml
└── resources.arsc 编译后的二进制资源文件
目录下三个文件两个文件夹,一一来说
[deli@athena himsn]$ ls -p
AndroidManifest.xml classes.dex META-INF/ res/ resources.arsc
。
AndroidManifest.xml
用vim打开,都是乱码,看看这是什么文件类型的:
[deli@athena himsn]$ file AndroidManifest.xml
AndroidManifest.xml: DBase 3 data file (4256 records)
除了这个,还有layout目录下的二进制xml文件,可以使用AXMLPrinter工具将其转换为可读的xml文件,工具下载地址:http://code.google.com/p/android4me/downloads/list, 使用很简单:
$ java -jar AXMLPrinter2.jar AndroidManifest.xml AndroidManifest2.xml
很多xml一个个转化很麻烦,这样的工作,当然是用shell完成了。
$ cd res
$ for file in */*.xml; do java -jar AXMLPrinter2.jar $file > temp; echo $file; mv temp $file -f; done
AndroidManifest2.xml的内容如下:(省略一部分)
<?xml version="1.0" encoding="utf-8"?>
<manifest
xmlns:android="http://schemas.android.com/apk/res/android"
android:versionCode="210"
android:versionName="2.1.0"
package="com.himsn"
>
<uses-sdk
android:minSdkVersion="2"
>
</uses-sdk>
<uses-permission
android:name="android.permission.READ_PHONE_STATE"
>
</uses-permission>
<application
android:label="@7F080000"
android:icon="@7F02002A"
>
<activity
android:label="@7F080000"
android:name=".ChooseContactActivity"
android:launchMode="2"
android:configChanges="0x000000E0"
>
<intent-filter
>
<action
android:name="android.intent.action.MAIN"
>
</action>
<category
android:name="android.intent.category.LAUNCHER"
>
</category>
</intent-filter>
</activity>
<activity
android:theme="@7F090001"
android:label="@7F080004"
android:name=".AuthReqActivity"
android:configChanges="0x000000E0"
>
</activity>
<meta-data
android:name="ADMOB_PUBLISHER_ID"
android:value="a149c8f51949be3"
>
</meta-data>
</application>
</manifest>
感觉还行,但是像 android:label="@7F080000" android:icon="@7F02002A"
@7F080000这个神秘的东西,是什么意思呢? 下面会有提到。
classes.dex
目前反编译classes.dex比较好的工具是 Dedexer,可以下载已经编译好的jar文件ddx1.11.jar.
mkdir src
java -jar ddx1.11.jar --help
java -jar ddx1.11.jar -o -D -r -d src classes.dex
然后在src目录下,又生成一坨东西。
注意: ddx1.11.jar 对应java 1.6版本,我用 1.5.0_18,就会遇到
[deli@athena tools-common]$ java -jar ddx1.11.jar
Exception in thread "main" java.lang.UnsupportedClassVersionError: Bad version number in .class file
也可以下载源代码自行编译。
进入 src/com/himsn 目录
[deli@athena himsn]$ grep -i 7F080000 *
R$string.ddx:.field public static final app_name I = 2131230720 ; 0x7f080000
好家伙,回前面提到的 @7F080000,原来在 R$string。其他xml文件出现神秘的字符,grep 一下,就出来了。 xml还有其他神秘数字, 比如
<ImageView>
android:scaleType="3"
这个3是啥意思? 开始我是用最原始的方式,我深信,一切尽在ApiDemos中,结果在ApiDemos的反编译文件里grep,一般80%都可以找到,然后跟源代码对比,就出来了。
android:scaleType="3" 就是android:scaleType="fitCenter" 类似的
| android:scaleType="7"| android:scaleType="centerInside"
android:scaleType="6" android:scaleType="centerCrop"
android:ellipsize="4" android:ellipsize="marquee"
android:ellipsize="3" android:ellipsize="end"
后面发现用eclipse打开xml layout文件,在属性选项里,点击,在下拉菜单,都有相应的数字,从0开始,那么就好办多了。
还有一些情况,比如
android:textColor="?android:01010036" android:textColor="?android:01010212"
这个比较好办,看到有android字样,就知道是系统定义的常量,在android sdk Reference android.R.xxx 页面搜索01010036,找到:
"?android:01010036" 对应 "?android:attr/textColorSecondary" "?android:01010212" 对应 "?android:attr/textColorTertiary"
反编译过两个apk,我都能把xml文件100%还原出来。
解读ddx格式
挑个src/com/himsn/HiMSN.ddx 看看吧。
.class public com/himsn/HiMSN
.super android/app/Activity
.source HiMSN.java
.field public static final ACTIVITY_ONGOING_CONTACTS I = 112 ; 0x70
.field public static final ACTIVITY_WINKS I = 113 ; 0x71
.field private static final TAG Ljava/lang/String; = "IMEasy"
.field private final mFilter Landroid/content/IntentFilter;
.field private mManager Lcom/shiyansucks/imeasy/manager/IMMgr;
.field mMenu Landroid/view/Menu;
.field private final mReceiver Landroid/content/BroadcastReceiver;
.method public <init>()V
.limit registers 3
.line 41
invoke-direct {v2},android/app/Activity/<init> ; <init>()V
.line 43
new-instance v0,com/himsn/HiMSN$1
....
真是难懂! 没关系,Gabor Paller为我们整理好了 Dalvik opcodes 文档,对照一下,记住常用的,慢慢研读,会有一番风景,enjoy!
读ddx,或多或少做一些笔记,零零散散,再补充一下。
行首为 ".field" 字段的,是类变量。 grep "\.field" xxx.ddx ,列出所有的变量。
行首为 ".method " 字段的,是成员函数 grep "\..method " xxx.ddx ,列出所有的成员函数。
88 if-eqz v1,l2d9da
89 ; v1 : single-length
90 .line 482
91 new-instance v0,android/content/Intent
92 ; v0 : Landroid/content/Intent;
93 invoke-direct {v0},android/content/Intent/<init> ; <init>()V
94 ; v0 : Landroid/content/Intent;
95 l2d9ca:
上面的条件是这样的:
if (v != 0) {
intent = new Intent(); // intent 在该代码段上边有定义过。
} else {
// l2d9ca:
}
if 里的判断顺序正好相反。
基本的数据类型
Long => Long
J => long
I => int
V => void
Z => boolean
D => double
apktool
目前最好的Android反编译工具,可以修改并重新打包.输出文件格式smail,与ddx类似。用法:
apktool d your.apk
apktool可以很完美的把xml文件还原出来,比 AXMLPrinter2.jar 做得更彻底。不过AXMLPrinter2.jar还对xml格式化,看来美观一些。
最佳实践
用dedexer反编译出来的ddx文件,参数名没显示出来,可读性强.
.method public static getSearchQueryForPublisher(Ljava/lang/String;)Ljava/lang/String;
.limit registers 3
apktool 反编译出来的smali文件,参数名都列出来
.method public static getSearchQueryForPublisher(Ljava/lang/String;)Ljava/lang/String;
.locals 2
.parameter "publisher"
加上 dex2jar + jd-gui ,多个工具一起用,互相验证,会有意想不到的效果。
转自:http://lytsing.org/wiki/android/decompile.html
分享到:
相关推荐
Android应用开发的哲学是把一切都看作是组件。把应用程序组件化的好处是降低模块间的耦合性,同时提高模块的复用性。Android的组件设计思想与传统的组件设计思想最大的区别在于,前者不依赖于进程。也就是说,进程...
----------------------------------- Android 编程基础 1 封面----------------------------------- Android 编程基础 2 开放手机联盟 --Open --Open --Open --Open Handset Handset Handset Handset Alliance ...
《Android框架揭秘》通过对Android系统源代码的分析,主要介绍Android框架的初始化过程及主要组件的工作原理。作者直接分析和整理了Android框架的主要源代码,并详细讲解了理解框架工作原理所需的各种基础知识和构成...
第2篇为应用开发篇,通过实例介绍了Android UI布局、Android人机界面、手机硬件设备的使用、Android本地存储系统、Android中的数据库、多线程设计、Android传感器、Android游戏开发基础、Android与Internet,以及...
源码里面有Bluetooth4_3/BLEDemo/Android_Lightblue.apk三个.前两个是BLE的demo。BLEDemo这个功能较Bluetooth4_3多一些,有兴趣的可以都看下。Android_Lightblue.apk是Android版的lightblue,在进行ble开发的时候用...
Android 4.3才开始支持BLE API,所以请各位客官把本文代码运行在蓝牙4.0和Android 4.3及其以上的系统,另外本文所用的BLE终端是一个蓝牙4.0的串口蓝牙模块。 PS:我的i9100刷了4.4系统后,竟然也能跟BLE蓝牙模块通信...
使用: export ANDROID_HOME="/opt/android-...# mv /opt/android-sdk/platforms/android-8.0.0 /opt/android-sdk/platforms/android-26 官网下载地址:https://dl.google.com/android/repository/platform-26_r01.zip
# mv /opt/android-sdk/platforms/android-25/android-7.1.1/* /opt/android-sdk/platforms/android-25/ # rm -rf /opt/android-sdk/platforms/android-25/android-7.1.1 官网下载地址:...
最近在网络上看到有网友抱怨Android游戏源码找不到,所以小弟收集了一些AndEngine和Libgdx的游戏源码,以Eclipse工程的形式配置好环境,再陆续发出(某引擎避嫌,不在此列)。 虽说主要是由Libgdx与AndEngine开发的...
Android support.v7包
第1章“Android系统概述”,概述Android系统方面的内容,包括智能手机平台的发展历程、Android系统的特点、Android的3种开发工作,以及Android的2种不同的开发方式。 第2章“Android系统开发综述”,介绍Android...
android 经典代码例子,若干个。。。。
《Android平台开发之旅(第2版)》涵盖Android 3/4的新特性,立足实际的开发案例,介绍了Android平台开发的基础概念、实用技术和应用模式。主要内容包括应用程序框架、高级界面、数据库应用、网络通信与Web开发、无线...
调用服务器的webservice接口,实现从Android上传图片到服务器,然后从服务器下载图片到Android客户端 从Android端用io流读取到要上传的图片,用Base64编码成字节流的字符串,通过调用webservice把该字符串作为参数...
在Android应用程序中,有一类特殊的消息,是专门负责与用户进行交互的,它们就是触摸屏和键盘等输入事件。触摸屏和键盘事件是统一由系统输入管理器InputManager进行分发的。也就是说,InputManager负责从硬件接收...
全书共分11章,主要以范例集的方式来讲述android的知识点,详细介绍了开发android的人机交互界面、android常用的开发控件、android手机收发短信等通信服务、开发android手机的自动服务功能和娱乐多媒体功能以及...
• Android 开发之旅:android架构 • Android 开发之旅:应用程序基础及组件 • Android 开发之旅:应用程序基础及组件(续) • Android 开发之旅:活动与任务 • Android 开发之旅:进程与线程 • Android ...
Android系统 = Linux内核 + Android运行时。 Android系统使用的Linux内核包含了一些专用驱动,例如Logger、Binder、Ashmem、Wakelock、Low-Memory Killer和Alarm等,这些Android专用驱动构成了Android运行时的基石。...