反编译apk工具
来源:互联网 发布:mysql 自增函数 编辑:程序博客网 时间:2024/06/06 14:03
http://lytsing.org/wiki/android/decompile.html
反编译apk工具
目前有几种工具:
- smali
- dedexer
- dexdump
- apktool
关于smali的使用,请参考jserv的http://jserv.blogspot.com/2010/05/android.html
dexdump功能比较弱,且麻烦,就不讨论介绍了。
解压apk
这里拿com.himsn.apk 做例子,apk包其实是一个zip文件,把它重命名,然后解压
mv com.himsn.apk com.himsn.zip unzip com.himsn.zip
得到一驼的东西:
.├── AndroidManifest.xml├── classes.dex├── 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 -pAndroidManifest.xml classes.dex META-INF/ res/ resources.arsc。
AndroidManifest.xml
这个没必要解释了,不过用vim打开,都是乱码,看看这是什么文件类型的:
[deli@athena himsn]$ file AndroidManifest.xmlAndroidManifest.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"?><manifestxmlns:android="http://schemas.android.com/apk/res/android"android:versionCode="210"android:versionName="2.1.0"package="com.himsn"><uses-sdkandroid:minSdkVersion="2"></uses-sdk><uses-permissionandroid:name="android.permission.READ_PHONE_STATE"></uses-permission><applicationandroid:label="@7F080000"android:icon="@7F02002A"><activityandroid:label="@7F080000"android:name=".ChooseContactActivity"android:launchMode="2"android:configChanges="0x000000E0"><intent-filter><actionandroid:name="android.intent.action.MAIN"></action><categoryandroid:name="android.intent.category.LAUNCHER"></category></intent-filter></activity><activityandroid:theme="@7F090001"android:label="@7F080004"android:name=".AuthReqActivity"android:configChanges="0x000000E0"></activity><meta-dataandroid: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 srcjava -jar ddx1.11.jar --helpjava -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.jarException 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 41invoke-direct{v2},android/app/Activity/<init>; <init>()V.line 43new-instancev0,com/himsn/HiMSN$1....
真是难懂! 没关系,Gabor Paller为我们整理好了 Dalvik opcodes 文档,对照一下,记住常用的,慢慢研读,会有一番风景,enjoy!
学习ddx格式最简单的方法,就是把现成的代码编译成apk的,再用反编译工具弄出ddx格式文件,代码与ddx文件对照阅读,一目了然。这段时间花了不少时间去研读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
- 反编译apk工具
- APK 反编译 工具 图解
- APK反编译工具
- APK反编译工具
- APK反编译工具
- APK反编译工具
- APK反编译工具
- apk反编译工具-apktool
- APK反编译工具
- APK反编译工具使用
- apk反编译工具
- apk反编译工具:apktool
- apk反编译工具
- Android APK 反编译工具
- apk 反编译 工具
- APK文件反编译工具
- APK反编译工具使用
- apk反编译常见工具
- Spring 使用注解的简单梳理
- DataGridView添加ComboBox
- Windows操作系统堆和栈的区别
- java.lang.OutOfMemoryError: Java heap space的解决方法
- windows开机密码跳过
- 反编译apk工具
- java设计模式之浅见(一)-----初学javame
- 坚持就是胜利
- java 充当浏览器访问网站
- 在Qemu/KVM下虚拟Windows XP中的鼠标位置偏移问题
- 进程,线程概念
- android aapt (android asset packaging tool)使用详解
- squid2.6配置反向代理实验
- SDL.H