游戏开发论坛

 找回密码
 立即注册
搜索
查看: 11699|回复: 2

Android - 反编译android apk文件

[复制链接]

1万

主题

1万

帖子

2万

积分

管理员

中级会员

Rank: 9Rank: 9Rank: 9

积分
20387
发表于 2013-5-30 22:33:24 | 显示全部楼层 |阅读模式
反编译apk工具

目前有几种工具:

关于smali的使用,请参考jserv的http://jserv.blogspot.com/2010/05/android.html

dexdump功能比较弱,且麻烦,就不讨论介绍了。


解压apk

这里拿com.himsn.apk 做例子,apk包其实是一个zip文件,直接解压

$ unzip com.himsn.apk

得到一驼的东西:


  1. ├── AndroidManifest.xml  程序全局配置文件
  2. ├── classes.dex Dalvik 字节码
  3. ├── META-INF
  4. │   ├── ALIAS_NA.RSA
  5. │   ├── ALIAS_NA.SF
  6. │   └── MANIFEST.MF
  7. ├── res 存放资源文件的目录
  8. │   ├── anim
  9. │   │   ├── cycle_7.xml
  10. │   │   └── shake.xml
  11. │   ├── drawable
  12. │   │   ├── avatar_unknown.png
  13. │   │   ├── ...
  14. │   │   ├── button_choose_contact.xml
  15. │   │   ├── typing4.png
  16. │   │   └── typing.xml
  17. │   ├── layout
  18. │   │   ├── add_contact.xml
  19. │   │   ├── ...
  20. │   │   └── two_line_list_item.xml
  21. │   ├── menu
  22. │   │   ├── choose_contact_offline.xml
  23. │   │   ├── choose_contact.xml
  24. │   │   └── main.xml
  25. │   ├── raw
  26. │   │   ├── key_char.jpg
  27. │   │   ├── key_num.jpg
  28. │   │   ├── ...
  29. │   │   ├── key_pressed_right.png
  30. │   │   └── winks.png
  31. │   └── xml
  32. │       └── preferences.xml
  33. └── resources.arsc 编译后的二进制资源文件
复制代码


目录下三个文件两个文件夹,一一来说

[deli@athena himsn]$ ls -pAndroidManifest.xml  classes.dex  META-INF/  res/  resources.arscAndroidManifest.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的内容如下省略一部分)


  1. <?xml version="1.0" encoding="utf-8"?>
  2. <manifest
  3.         xmlns:android="http://schemas.android.com/apk/res/android"
  4.         android:versionCode="210"
  5.         android:versionName="2.1.0"
  6.         package="com.himsn"
  7.         >
  8.         <uses-sdk
  9.                 android:minSdkVersion="2"
  10.                 >
  11.         </uses-sdk>
  12.         <uses-permission
  13.                 android:name="android.permission.READ_PHONE_STATE"
  14.                 >
  15.         </uses-permission>
  16.         <application
  17.                 android:label="@7F080000"
  18.                 android:icon="@7F02002A"
  19.                 >
  20.                 <activity
  21.                         android:label="@7F080000"
  22.                         android:name=".ChooseContactActivity"
  23.                         android:launchMode="2"
  24.                         android:configChanges="0x000000E0"
  25.                         >
  26.                         <intent-filter
  27.                                 >
  28.                                 <action
  29.                                         android:name="android.intent.action.MAIN"
  30.                                         >
  31.                                 </action>
  32.                                 <category
  33.                                         android:name="android.intent.category.LAUNCHER"
  34.                                         >
  35.                                 </category>
  36.                         </intent-filter>
  37.                 </activity>
  38.                 <activity
  39.                         android:theme="@7F090001"
  40.                         android:label="@7F080004"
  41.                         android:name=".AuthReqActivity"
  42.                         android:configChanges="0x000000E0"
  43.                         >
  44.                 </activity>
  45.                 <meta-data
  46.                         android:name="ADMOB_PUBLISHER_ID"
  47.                         android:value="a149c8f51949be3"
  48.                         >
  49.                 </meta-data>
  50.         </application>
  51. </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 看看吧。


  1. .class public com/himsn/HiMSN
  2. .super android/app/Activity
  3. .source HiMSN.java

  4. .field public static final ACTIVITY_ONGOING_CONTACTS I = 112        ; 0x70
  5. .field public static final ACTIVITY_WINKS I = 113        ; 0x71
  6. .field private static final TAG Ljava/lang/String; = "IMEasy"
  7. .field private final mFilter Landroid/content/IntentFilter;
  8. .field private mManager Lcom/shiyansucks/imeasy/manager/IMMgr;
  9. .field mMenu Landroid/view/Menu;
  10. .field private final mReceiver Landroid/content/BroadcastReceiver;

  11. .method public <init>()V
  12. .limit registers 3

  13. .line 41
  14.         invoke-direct        {v2},android/app/Activity/<init>        ; <init>()V

  15. .line 43
  16.         new-instance        v0,com/himsn/HiMSN$1

  17. ....
复制代码



真是难懂! 没关系,Gabor Paller为我们整理好了 Dalvik opcodes 文档,对照一下,记住常用的,慢慢研读,会有一番风景,enjoy!


读ddx,或多或少做一些笔记,零零散散,再补充一下。


行首为 ".field" 字段的,是类变量。 grep "\.field" xxx.ddx ,列出所有的变量。


行首为 ".method " 字段的,是成员函数 grep "\..method " xxx.ddx ,列出所有的成员函数。


  1. 88     if-eqz  v1,l2d9da
  2. 89 ; v1 : single-length
  3. 90 .line 482
  4. 91     new-instance    v0,android/content/Intent
  5. 92 ; v0 : Landroid/content/Intent;
  6. 93     invoke-direct   {v0},android/content/Intent/<init>  ; <init>()V
  7. 94 ; v0 : Landroid/content/Intent;
  8. 95 l2d9ca:
复制代码


上面的条件是这样的:


if (v != 0) {         intent = new Intent(); // intent 在该代码段上边有定义过。 } else {         // l2d9ca: }

if 里的判断顺序正好相反。


基本的数据类型


Long => Long J => long I => int V => void Z => boolean D => doubleapktool

目前最好的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 ,多个工具一起用,互相验证,会有意想不到的效果。



来自:互联网

0

主题

1

帖子

6

积分

新手上路

Rank: 1

积分
6
发表于 2013-9-25 20:31:13 | 显示全部楼层
不错,要是有手游破解更加详细点的文章就好了。

0

主题

4

帖子

30

积分

新手上路

Rank: 1

积分
30
发表于 2015-4-1 21:07:06 | 显示全部楼层
我是新人,今天看了这个牛逼的帖子,ho~ho~ho~~!
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

作品发布|文章投稿|广告合作|关于本站|游戏开发论坛 ( 闽ICP备17032699号-3 )

GMT+8, 2024-12-22 17:01

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表