從今天開始我們正式開始Android的逆向之旅,關于逆向的相干知識,想必大家都不陌生了,逆向領域是1個充滿挑戰和神秘的領域。作為1名Android開發者,每一個人都想去探索這個領域,由于1旦你破解了他人的內容,成績感肯定爆棚,不過相反的是,我們不但要研究破解之道,也要研究加密之道,由于加密和破解是相生相克的。但是我們在破解的進程中可能最頭疼的是native層,也就是so文件的破解。所以我們先來詳細了解1下so文件的內容下面就來看看我們今天所要介紹的內容。今天我們先來介紹1下elf文件的格式,由于我們知道Android中的so文件就是elf文件,所以需要了解so文件,必須先來了解1下elf文件的格式,對如何詳細了解1個elf文件,就是手動的寫1個工具類來解析1個elf文件。
我們需要了解elf文件的格式,關于elf文件格式詳解,網上已有很多介紹資料了。這里我也不做太多的解釋了。不過有兩個資料還是需要介紹1下的,由于網上的內容真的很多,很雜。這兩個資料是最全的,也是最好的。我就是看這兩個資料來操作的:
第1個資料是非蟲大哥的經典之作:
看吧,是否是超級詳細?后面我們用Java代碼來解析elf文件的時候,就是依照這張圖來的。但是這張圖有些數據結構解釋的還不是很清楚,所以第2個資料來了。
第2個資料:北京大學實驗室出的標準版
http://download.csdn.net/detail/jiangwei0910410003/9204051
這里就不對這個文件做詳細解釋了,后面在做解析工作的時候,會截圖說明。
關于上面的這兩個資料,這里還是多數兩句:1定要仔細認真的瀏覽。這個是經典之作。也是后面工作的基礎。
固然這里還需要介紹1個工具,由于這個工具在我們下面解析elf文件的時候,也非常有用,而且是檢查我們解析elf文件的模板。
就是很出名的:readelf命令
不過Window下這個命令不能用,由于這個命令是Linux的,所以我們還得做個工作就是安裝Cygwin。關于這個工具的安裝,大家可以看看這篇文章:
http://blog.csdn.net/jiangwei0910410003/article/details/17710243
不過在下載的進程中,我擔心小朋友們會遇到挫折,所以很貼心的,放到的云盤里面:
http://pan.baidu.com/s/1C1Zci
下載下來以后,需要改1個東西才能用:
該1下這個文件:
這個路徑要改成你本地cygwin64中的bin目錄的路徑,不然運行毛病的。改好以后,直接運行Cygwin.bat就能夠了。
關于readelf工具我們這里不做太詳細的介紹,只介紹我們要用到的命令:
1、readelf -h xxx.so
查看so文件的頭部信息
2、readelf -S xxx.so
查看so文件的段(Section)頭的信息
3、readelf -l xxx.so
查看so文件的程序段頭信息(Program)
4、readelf -a xxx.so
查看so文件的全部內容
還有很多命令用法,這里就不在細說了,網上有很多介紹的~~
上面我們介紹了elf文件格式資料,elf文件的工具,那末下面我們就來實際操作1下,來用Java代碼手把手的解析1個libhello-jni.so文件。關于這個libhello-jni.so文件的下載地址:
http://download.csdn.net/detail/jiangwei0910410003/9204087
這個我們需要參考elf.h這個頭文件的格式了。這個文件網上也是有的,這里還是給個下載鏈接吧:
http://download.csdn.net/detail/jiangwei0910410003/9204081
我們看看Java中定義的elf文件的數據結構類:
有了結構定義,下面就來看看如何解析吧。
在解析之前我們需要將so文件讀取到byte[]中,定義1個數據結構類型
關于這些字段的解釋,要看上面提到的那個pdf文件中的描寫
這里我們介紹幾個重要的字段,也是我們后面修改so文件的時候也會用到:
1)、e_phoff
這個字段是程序頭(Program Header)內容在全部文件的偏移值,我們可以用這個偏移值來定位程序頭的開始位置,用于解析程序頭信息
2)、e_shoff
這個字段是段頭(Section Header)內容在這個文件的偏移值,我們可以用這個偏移值來定位段頭的開始位置,用于解析段頭信息
3)、e_phnum
這個字段是程序頭的個數,用于解析程序頭信息
4)、e_shnum
這個字段是段頭的個數,用于解析段頭信息
5)、e_shstrndx
這個字段是String段在全部段列表中的索引值,這個用于后面定位String段的位置
依照上面的圖我們就能夠很容易的解析
這個結構中字段見pdf中的描寫吧,這里就不做解釋了。后面我們會手動的構造這樣的1個數據結構,到時候在詳細說明每一個字段含義。
依照這個結構。我們解析也簡單了:
這里的字段,這里也不做解釋了,看pdf文檔。
我們依照這個結構來進行解析:
那末上面我們的解析工作做完了,為了驗證我們的解析工作是不是正確,我們需要給每一個結構定義個打印函數,也就是從寫toString方法便可。
然后我們在使用readelf工具來查看so文件的各個結構內容,對照就能夠知道解析的是不是成功了。
解析代碼下載地址:http://download.csdn.net/detail/jiangwei0910410003/9204119
上面我們用的是Java代碼來進行解析的,為了照顧廣大程序猿,所以給出1個C++版本的解析類:
C++代碼下載:http://download.csdn.net/detail/jiangwei0910410003/9204139
關于Elf文件的格式,就介紹到這里,通過自己寫1個解析類的話,可以很深入的了解elf文件的格式,所以我們在以后遇到1個文件格式的了解進程中,最好的方式就是手動的寫1個工具類就行了。那末這篇文章是逆向之旅的第1篇,也是以后篇章的基礎,下面1篇文章我們會介紹如何來手動的在elf中添加1個段數據結構,縱情期待~~
PS: 關注微信,最新Android技術實時推送
生活不易,碼農辛苦
如果您覺得本網站對您的學習有所幫助,可以手機掃描二維碼進行捐贈