【Android每週專題】Android中的逆向工程

本系列文章均爲A2BGeek原創,轉載務必在明顯處註明:
轉載自A2BGeek的【Android每週專題】系列,原文鏈接:http://blog.csdn.net/a2bgeek/article/details/15338911

我們對一個apk做逆向工程分爲兩個方面,一是java源代碼,二是xml。apk其實是一個壓縮包,你可以把後綴名apk改成zip,解壓後你就能看到一個apk內部的全貌:

META-INF:存放的是簽名信息,用來保證apk包的完整性和系統的安全。在eclipse編譯生成一個apk包時,會對所有要打包的文件做一個校驗計算,並把計算結果放在META-INF目錄下。在手機上安裝apk包時,應用管理器會按照同樣的算法對包裏的文件做校驗,如果校驗結果與META-INF下的內容不一致,系統就不會安裝這個apk。這就保證了apk包裏的文件不能被隨意替換。比如拿到一個apk包後,如果想要替換裏面的一幅圖片,一段代碼, 或一段版權信息,想直接解壓縮、替換再重新打包,基本是不可能的。如此一來就給病毒感染和惡意修改增加了難度,有助於保護系統的安全。

res:存放資源文件的目錄,例如圖片和佈局文件,注意圖片可以直接拿出來用的,不用反編譯。

AndroidManifest.xml:和Eclipse工程裏面的那個是一樣的,只不過不能直接看,需要反編譯。

classes.dex:Java虛擬機運行的是Java字節碼,而Dalvik虛擬機運行的則是其專有的文件格式DEX(Dalvik Executable)。在Java SE程序中的Java類會被編譯成一個或者多個字節碼文件(.class)然後打包到JAR文件,而後Java虛擬機會從相應的CLASS文件和JAR文件中獲取相應的字節碼;Android應用雖然也是使用Java語言進行編程,但是在編譯成CLASS文件後,還會通過一個工具(dx)將應用所有的CLASS文件轉換成一個DEX文件,而後Dalvik虛擬機會從其中讀取指令和數據。

resources.arsc:編譯後的二進制資源文件。

只是看一看

首先來講一下Android中第一種反編譯方法,這種方法可以讓你直觀地閱讀別人的源代碼,雖然反編譯出來的源代碼和真正的源代碼有一些不同,但不太影響閱讀的。下面開講:

1、工具下載

dex2jar :這個工具可以把.dex文件反編譯成爲.jar文件。

Java Decompiler :這個工具用來查看.jar文件。

AXMLPrinter :用來反編譯xml文件。

2、開始反編譯

首先需要把apk包解壓縮,然後開始反編譯。

step1:反編譯xml文件

這一步需要使用剛纔下載的AXMLPrinter2.jar,使用方法如下:

java -jar AXMLPrinter2.jar AndroidManifest.xml > AndroidManifest_decode.xml

反編譯後AndroidManifest_decode.xml如下:


step2:反編譯dex文件

這裏首先需要使用的是dex2jar,使用方法如下:

sh dex2jar.sh classes.dex

執行完畢之後會得到一個文件classes_dex2jar.jar

接下來我們就可以使用Java Decompiler直接打開classes_dex2jar.jar:

OK,第一種反編譯的方法就講到這裏,如果你只是抱着學習的心態,那麼第一種就足夠了,你可以看到別人的功能是怎麼實現的。

索馬里海盜

使用第一種方法我們雖然可以直觀地查看源代碼,但是做不到修改真正執行的代碼,因爲我們看到的是使用dex2jar轉換來的代碼。但是,使用smali,我們可以做到直接修改真正執行的代碼,做一些好玩的事情,電子市場上一些流氓軟件也是用這種方法添加惡意代碼的,請讀者不要學了之後搞破壞哦。

先來說一下smali是什麼?看圖:

這是一個smali文件,對應的java源代碼是:

public class MainActivity extends Activity {

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
	}
}

其實對照着看就能看出一些語法的規律,比如函數的結尾用.end method,p、v這樣的都叫寄存器,我個人覺得沒有必要學習太多smali語法,你可以把要添加的功能用java寫好,反編譯出來就能看到對應的smali寫法,再加進去就可以了,不過這裏還是附上smali語法介紹的鏈接http://blog.csdn.net/wdaming1986/article/details/8299996

下面來介紹使用smali反編譯的步驟:

1、工具下載:

smali&&baksmali :用來反編譯和回編譯classes.dex。

apktool :封裝了smail和baksmali,而且同時也能處理xml。推薦這種方法。

2、開始反編譯:

使用smali和baksmali

首先需要把apk解壓縮,得到classes.dex:

將classes.dex反編譯:

java -jar baksmali.jar -o classesout/ classes.dex

將classesout目錄回編譯:

java -jar smali.jar classesout/ -o classes.dex

使用apktool

將整個apk反編譯

 apktool d DeCompileDemo.apk DeCompileDemo/
DeCompileDemo目錄如下:

將DeCompileDemo目錄回編譯:

 apktool b DeCompileDemo
會發現在DeCompileDemo/dist/下有一個apk。

OK,這個專題就到這裏,下個專題準備寫如何漢化apk以及如何利用masterkey漏洞,是對反編譯的運用,敬請期待。

參考資料:

http://www.cnblogs.com/panchunting/archive/2011/10/25/android_apk.html


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章