Android程序反編譯的方法
Apk文件的格式 Android application package文件。每個要安裝到android平臺的應用都要被編譯打包為一個單獨的文件,后綴名為.apk,其中包含了應用的二進制代碼、資源、配置文件等。
apk文件實際是一個zip壓縮包,可以通過解壓縮工具解開。可以用zip解開*.apk文件,下面是一個helloword的apk示例文件
- |– AndroidManifest.xml
- |– META-INF
- | |– CERT.RSA
- | |– CERT.SF
- | `– MANIFEST.MF
- |– classes.dex
- |– res
- | |– drawable
- | | `– icon.png
- | `– layout
- | `– main.xml
- `– resources.arsc
1 Manifest文件:AndroidManifest.xml是每個應用都必須定義和包含的,它描述了應用的名字、版本、權限、引用的庫文件等等信息[ , ],如要把apk上傳到Google Market上,也要對這個xml做一些配置。注意:在apk中的xml文件是經過壓縮的,不可以直接打開。
2 Res文件:res文件夾下為所有的資源文件。
3 resources.arsc文件:為編譯后的二進制資源文件,許多做漢化軟件的人都是修改該文件內的資源以實現軟件的漢化的。
4 META-INF目錄:META-INF目錄下存放的是簽名信息,用來保證apk包的完整性和系統的安全。在eclipse編譯生成一個api包時,會對所有要打包的文件做一個校驗計算,并把計算結果放在META-INF目錄下。而在OPhone平臺上安裝apk包時,應用管理器會按照同樣的算法對包里的文件做校驗,如果校驗結果與META-INF下的內容不一致,系統就不會安裝這個apk。這就保證了apk包里的文件不能被隨意替換。比如拿到一個apk包后,如果想要替換里面的一幅圖片,一段代碼, 或一段版權信息,想直接解壓縮、替換再重新打包,基本是不可能的。如此一來就給病毒感染和惡意修改增加了難度,有助于保護系 統的安全。
5 classes.dex是java源碼編譯后生成的java字節碼文件。但由于Android使用的dalvik虛擬機與標準的java虛擬機是不兼容的,dex文件與class文件相比,不論是文件結構還是opcode都不一樣。
XML文件的反編譯
在apk中的xml文件是經過壓縮的,可以通過AXMLPrinter2工具解開,具體命令為:
- java -jar AXMLPrinter2.jar AndroidManifest.xml
- HelloAndroid程序中Manifest文件的實例:
- <?xml version="1.0" encoding="utf-8"?>
- <manifest xmlns:android="http://schemas.android.com/apk/res/android"
- android:versionCode="1"
- android:versionName="1.0"
- package="name.feisky.android.test"
- >
- <application
- android:label="@7F040001"
- android:icon="@7F020000"
- >
- <activity
- android:label="@7F040001"
- android:name=".HelloAndroid"
- >
- <intent-filter
- >
- <action android:name="android.intent.action.MAIN"
- >
- </action>
- <category android:name="android.intent.category.LAUNCHER"
- >
- </category>
- </intent-filter>
- </activity>
- </application>
- <uses-sdk
- android:minSdkVersion="6"
- >
- </uses-sdk>
- </manifest>
- 而原文件為:
- <?xml version="1.0" encoding="utf-8"?>
- <manifest xmlns:android="http://schemas.android.com/apk/res/android"
- package="name.feisky.android.test"
- android:versionCode="1"
- android:versionName="1.0">
- <application android:icon="@drawable/icon" android:label="@string/app_name">
- <activity android:name=".HelloAndroid"
- android:label="@string/app_name">
- <intent-filter>
- <action android:name="android.intent.action.MAIN" />
- <category android:name="android.intent.category.LAUNCHER" />
- </intent-filter>
- </activity>
- </application>
- <uses-sdk android:minSdkVersion="6" />
- </manifest>
#p#
classes.dex文件反編譯
classes.dex是java源碼編譯后生成的java字節碼文件。但由于Android使用的dalvik虛擬機與標準的java虛擬機是不兼容的,dex文件與class文件相比,不論是文件結構還是opcode都不一樣。目前常見的java反編譯工具都不能處理dex文件。
Android模擬器中提供了一個dex文件的反編譯工具,dexdump。用法為首先啟動Android模擬器,把要查看的dex文件用adb push上傳的模擬器中,然后通過adb shell登錄,找到要查看的dex文件,執行dexdump xxx.dex。但是這樣得到的結果,其可讀性是極差的。下面介紹一個可讀性比較好的工具。
工具準備:
1、把dex文件反編譯為jar文件的工具。(dex2jar)
2、把jar反編譯為java的工具。(JD-GUI)
反編譯的步驟
1、從APK中提取classes.dex文件,對APK文件解壓即可得到。 將其放到dex2jar的目錄下,打開cmd,運行dex2jar.bat classes.dex,生成classes.dex.dex2jar.jar。
2、運行JD-GUI工具,打開上面的jar文件,即可看到源代碼。
- HelloAndroid實例:
- package name.feisky.android.test;
- import android.app.Activity;
- import android.os.Bundle;
- public class HelloAndroid extends Activity
- {
- public void onCreate(Bundle paramBundle)
- {
- super.onCreate(paramBundle);
- setContentView(2130903040);
- }
- }
其原程序為:
- package name.feisky.android.test;
- import android.app.Activity;
- import android.os.Bundle;
- public class HelloAndroid extends Activity {
- /** Called when the activity is first created. */
- @Override
- public void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.main);
- }
- }
【編輯推薦】