九色国产,午夜在线视频,新黄色网址,九九色综合,天天做夜夜做久久做狠狠,天天躁夜夜躁狠狠躁2021a,久久不卡一区二区三区

打開APP
userphoto
未登錄

開通VIP,暢享免費電子書等14項超值服

開通VIP
Android - 反編譯android apk文件

Yes or Not?

  • 主要目的: 學習優(yōu)秀的軟件設(shè)計,解決封閉包特定問題
  • 邪惡的做法:去除廣告,修改別人的軟件包名,重新打包發(fā)布。
  • 有爭議的: 中文漢化

注意 請遵循Google相關(guān)協(xié)議和相關(guān)法律法規(guī)

反編譯apk工具

目前有幾種工具:

關(guān)于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 字節(jié)碼├── 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)

除了這個,還有l(wèi)ayout目錄下的二進制xml文件,可以使用AXMLPrinter工具將其轉(zhuǎn)換為可讀的xml文件,工具下載地址:http://code.google.com/p/android4me/downloads/list, 使用很簡單:

$ java -jar AXMLPrinter2.jar AndroidManifest.xml AndroidManifest2.xml

很多xml一個個轉(zhuǎn)化很麻煩,這樣的工作,當然是用shell完成了。

$ cd res$  for file in */*.xml; do java -jar AXMLPrinter2.jar $file > temp; echo $file; mv temp $file -f; done

AndroidManifest2.xml的內(nèi)容如下:(省略一部分)

<?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,可以下載已經(jīng)編譯好的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 對應(yīng)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文件出現(xiàn)神秘的字符,grep 一下,就出來了。 xml還有其他神秘數(shù)字, 比如

<ImageView>android:scaleType="3"

這個3是啥意思? 開始我是用最原始的方式,我深信,一切盡在ApiDemos中,結(jié)果在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"

后面發(fā)現(xiàn)用eclipse打開xml layout文件,在屬性選項里,點擊,在下拉菜單,都有相應(yīng)的數(shù)字,從0開始,那么就好辦多了。

還有一些情況,比如

android:textColor="?android:01010036" android:textColor="?android:01010212"

這個比較好辦,看到有android字樣,就知道是系統(tǒng)定義的常量,在android sdk Reference android.R.xxx 頁面搜索01010036,找到:

"?android:01010036" 對應(yīng) "?android:attr/textColorSecondary" "?android:01010212" 對應(yīng) "?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....

真是難懂! 沒關(guān)系,Gabor Paller為我們整理好了 Dalvik opcodes 文檔,對照一下,記住常用的,慢慢研讀,會有一番風景,enjoy!

讀ddx,或多或少做一些筆記,零零散散,再補充一下。

行首為 ".field" 字段的,是類變量。 grep "\.field" xxx.ddx ,列出所有的變量。

行首為 ".method " 字段的,是成員函數(shù) grep "\..method " xxx.ddx ,列出所有的成員函數(shù)。

 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 里的判斷順序正好相反。

基本的數(shù)據(jù)類型

 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文件,參數(shù)名沒顯示出來,可讀性強.

.method public static getSearchQueryForPublisher(Ljava/lang/String;)Ljava/lang/String;.limit registers 3

apktool 反編譯出來的smali文件,參數(shù)名都列出來

.method public static getSearchQueryForPublisher(Ljava/lang/String;)Ljava/lang/String;    .locals 2    .parameter "publisher"

加上 dex2jar + jd-gui ,多個工具一起用,互相驗證,會有意想不到的效果。


本站僅提供存儲服務(wù),所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊舉報。
打開APP,閱讀全文并永久保存 查看更多類似文章
猜你喜歡
類似文章
Android Little Tips系列之一:如何反編譯apk文件
Android應(yīng)用程序開發(fā)以及背后的設(shè)計思想深度剖析(2)
Unity與Android
android第三方應(yīng)用安裝來源設(shè)置分析
兩個android程序間的相互調(diào)用(apk互調(diào))
android架構(gòu)設(shè)計之插件化、組件化
更多類似文章 >>
生活服務(wù)
熱點新聞
分享 收藏 導長圖 關(guān)注 下載文章
綁定賬號成功
后續(xù)可登錄賬號暢享VIP特權(quán)!
如果VIP功能使用有故障,
可點擊這里聯(lián)系客服!

聯(lián)系客服