先前聽說許多關於 Android 程式很容易被逆向工程,我也抱持這樣的觀點去戳 Android 開發者 XDD 直到今天開完會,前輩跟我說 Android 產生出的 dex file 很難閱讀,因此我就去找一下相關資料,找到一篇 2007/11/28 How to decompile .dex file on Android 文章,上頭也是敘述要去解讀 dex 有點不好讀,但隨後找到 2009/08/08 decompiling DEX into Java sourcecode 這篇文章,細看一下原來還有 dex2jar 的方式!這下可好了...
所以,咱們來試試吧!我在 Ubuntu 10.04 的環境下測試
準備工具:
- dex2jar
- A tool for converting Android's .dex format to Java's .class format
- JD-GUI
- JD-GUI is a standalone graphical utility that displays Java source codes of “.class” files.
- 一份編譯好的 apk 檔案
- 我以之前練習寫為例,Android 開發教學筆記 - 簡易的 Widget 實作,在 Eclipse 的 workspace 裡頭,可以找到 project 名稱,裡頭有個 bin 目錄,就可以找到一個 apk 檔
接著就把 dex2jar 解壓縮出來,並執行
$ cd dex2jar-0.0.7.7-SNAPSHOT
$ sh dex2jar.sh MyWidget.apk
然後就會看到一個對應的 jar 檔:MyWidget.apk.dex2jar.jar
解壓縮 JD-GUI 去開啟 MyWidget.apk.dex2jar.jar 檔案,不囉唆,程式碼就可以看了!整個過程不用 30 秒吧!打快一點可能 3 秒喔 XD
這...還真的叫我難以投入 Android 開發啊 *誤* 不過仔細一看,之前在 MyWidget 寫的程式,有些地方式用 R.layout.main 的地方,已經直接被換成數值了,但我想這樣也不會太難閱讀,畢竟整個 source code 都丟在你眼前了!更別提 dex2jar 仍然很活躍地進行維護及開發,真的開感謝一下對岸,第一次看到簡體中文有那種莫名的感動 XD 太多東西都嘛是英文先衝啦
至於 dex2jar 的原理,可以參考這邊:介绍dex2jar的核心思想,有原理才會有相對應的解法喔!
順便筆記一下 iPhone 的:
arm-elf-objcopy -I binary -O elf32-littlearm iPhoneApp out.elf && arm-elf-objdump -marm9 -D out.elf
但組語嘛,雖然學過,但我想我應該看不下去 XD
最後,關於逆向工程的事情,如果程式碼非常冗長,那一樣不好啃啊!所以,玩玩就好。
版主你好,請問你寫的這句
回覆刪除筆記一下 iPhone 的:
arm-elf-objcopy -I binary -O elf32-littlearm iPhoneApp out.elf && arm-elf-objdump -marm9 -D out.elf
是甚麼意思?也有可以反組譯iOS IPA檔的工具跟指令嗎?
版主回覆:(10/01/2012 01:11:11 AM)
IPA 檔案用解壓縮軟體就可以打開來看。至於反組譯是將裡頭的 binary 檔案(通常跟app名稱一樣)翻成組語而已。其中解成組語是用 arm-elf-objcopy 和 arm-elf-objdump 指令,並搭配上述的參數來進行。我覺得返組譯的效果不佳啦 XD 供你參考。