`
bawking
  • 浏览: 34280 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
社区版块
存档分类
最新评论
阅读更多
                          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
分享到:
评论
1 楼 originwxit 2011-05-12  
嗯 不错哦   值得学习学习...

相关推荐

    android 经典代码例子

    在Android开发领域,经典代码例子是开发者学习和提升技能的重要资源。这些例子涵盖了各种关键功能和组件的实现,有助于深入理解Android应用的工作原理。在这个压缩包中,我们可能找到了多个有关Android编程的示例...

    Android开发入门60个小案例+源代码

    在Android开发领域,初学者经常会面临许多挑战,如理解Android应用程序的基本架构、学习XML布局、掌握Java或Kotlin编程语言,以及如何与设备硬件交互等。"Android开发入门60个小案例+源代码"这个资源提供了丰富的...

    Android省市区三级联动滚轮选择——Cascade_Master

    该组件是基于开源库`Android-wheel`实现的,`Android-wheel`是一个适用于Android的滚轮选择器,它可以创建类似于iOS中PickerView的效果,让用户通过滚动来选取所需的数据。在省市区三级联动中,当用户在一级(省)...

    Android自定义日期选择器源码

    在Android开发中,系统默认的日期和时间选择器虽然实用,但往往无法满足所有场景的需求。因此,开发者经常需要自定义日期选择器来提供更符合应用风格或特定功能的交互体验。这篇内容将深入探讨如何在Android中创建一...

    Android通过webservice连接Sqlserver实例

    在Android开发中,有时我们需要与远程数据库进行交互,例如SQLServer。这个场景通常是通过Web服务,如WebService来实现。本文将详细介绍如何在Android应用中利用WebService接口连接到SQLServer数据库,实现数据的增...

    Android串口通信(Android Studio)

    在Android开发中,串口通信(Serial Port Communication)是一种重要的技术,它允许设备之间通过串行接口进行数据交换。在Android Studio环境下实现串口通信,开发者可以构建与硬件设备交互的应用,例如读取传感器...

    Android设置虚线、圆角、渐变

    在Android开发中,为UI元素添加虚线、圆角和渐变效果是常见的需求,可以提升应用的视觉吸引力。下面将详细讲解如何实现这些效果。 ### 一、虚线(Dashed Line) 在Android中,我们可以使用`Shape Drawable`来创建...

    Android组件设计思想

    Android应用开发的哲学是把一切都看作是组件。把应用程序组件化的好处是降低模块间的耦合性,同时提高模块的复用性。Android的组件设计思想与传统的组件设计思想最大的区别在于,前者不依赖于进程。也就是说,进程...

    新版Android开发教程.rar

    ----------------------------------- Android 编程基础 1 封面----------------------------------- Android 编程基础 2 开放手机联盟 --Open --Open --Open --Open Handset Handset Handset Handset Alliance ...

    Android 完美实现图片圆角和圆形

    在Android开发中,有时我们需要对显示的图片进行特殊处理,比如让图片呈现圆角或完全圆形。本知识点将深入探讨如何在Android应用中完美实现图片的圆角和圆形效果。 首先,我们来看如何实现图片的圆角效果。Android...

    Android.bp文件说明.pdf

    Android新编译规则Android.bp文件语法规则详细介绍,条件编译的配置案例。 Android.bp 文件首先是 Android 系统的一种编译配置文件,是用来代替原来的 Android.mk 文件的。在 Android7.0 以前,Android 都是使用 ...

    JS调用Android方法,向Android方法传递json数据

    在现代的移动应用开发中,JavaScript与原生平台之间的交互变得越来越常见,特别是在使用Android的WebView组件时。本文将深入探讨如何使用JavaScript调用Android的方法,并传递JSON数据,以实现两者之间的高效通信。 ...

    Android扫雷游戏(基于Android Studio)

    【Android扫雷游戏开发详解】 在移动开发领域,Android Studio是Google推出的官方集成开发环境(IDE),用于构建Android应用程序。本项目"Android扫雷游戏"就是利用Android Studio进行开发的一个实例,旨在帮助初学...

    android应用开发范例精解

    第2篇为应用开发篇,通过实例介绍了Android UI布局、Android人机界面、手机硬件设备的使用、Android本地存储系统、Android中的数据库、多线程设计、Android传感器、Android游戏开发基础、Android与Internet,以及...

    android 仿微信语音聊天demo

    【Android 微信语音聊天Demo】是一个典型的移动应用开发示例,主要展示了如何在Android平台上构建类似微信的语音聊天功能。这个Demo包含了按钮状态切换、语音录制、本地存储、回放和加载等一系列关键操作,是Android...

    Android SDK离线包合集(Android 4.0-5.0)

    Android SDK离线包合集(Android 4.0-5.0)。不用去Google下载,直接国内下载离线包,各版本文件独立,任意下载。手机流量上传了一部分,好心疼。如不能下载,请告诉我更新地址。 附上简单教程。 这是Android开发所...

    Android 图片浏览全屏缩放

    在Android开发中,实现图片浏览的全屏缩放效果是一项常见的需求,特别是在社交应用中,如QQ好友动态和微信朋友圈。这种功能不仅需要提供良好的用户体验,还需要考虑性能和内存优化,因为图片通常较大,处理不当可能...

    Android小项目集合100多个

    1. **Android SDK**:Android软件开发工具包(SDK)是开发Android应用的基础,包含了开发、调试和发布应用所需的所有工具,如Android Studio IDE、Java Development Kit(JDK)、模拟器以及各种版本的Android平台库...

Global site tag (gtag.js) - Google Analytics