Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> 利用IDA學習一個簡單的安卓脫殼

利用IDA學習一個簡單的安卓脫殼

編輯:關於Android編程

這是看別人的文章學習的,當然還有加點自己的思考,截圖用自己的,這樣的學習才有效果啊

學習附件及文檔:(這是別人的)http://pan.baidu.com/s/1nuyxc9N 密碼:d29f

原理篇

dvmDexFileOpenPartial這是函數是關鍵,據說在這下 斷點就可以了,看名字就是虛擬機去打開Dexfile的意思,應該那時已經解殼完成了吧   函數原型:
int dvmDexFileOpenPartial(const void* addr, int len, DvmDex** ppDvmDex);
第一個參數就是dex內存起始地址,第二個參數就是dex大小。所以在這個函數下斷點可以直接dump出明文dex.   為了深入學習我們去看看安卓源碼,這個參考底部有個大神的 http://androidxref.com/4.4_r1/xref/dalvik/dexopt/OptMain.cpp 這個應該是優化dex的,odex相關的東西,小白我不懂的 \ 這裡分別對三種不同類型的文件做不同的處理,傳進去的參數是--dex就走中間那一步了,我們跟進去 \ 根據log信息,我們知道,顯示初始化VM虛擬機(應該是dalvik虛擬機吧) 跟著就執行優化,我們看看那個優化 \ 可以看到上面的英文注釋:重寫文件,字節重排,結構重排,類驗證,字節優化都在那個rewriteDex函數中,優化成功下面才去調用我們的dvmDexFileOpenPartial 可以看到第三個參數為NULL 既然這樣,我們繼續跟進 \   可以看到裡面調用了dexFileParse,就是解析dex文件的了,既然都開始解析dex文件了,那麼殼肯定已經對dex解密完成了,不然也無法解析啊


順手簡單看看是如何解析的,不懂啊 ,只看這兩個看著有點眼熟的,因為學過PE文件的格式

\

可以看到這裡也有一些可選頭,通過可選頭可以讀取一些信息,什麼長度啊,偏移什麼的, 中間有個解析Data的函數,這裡是學習脫殼啊,不是看安卓源碼,都跑哪去了

\ 接下來還會作一些校驗和的檢測   好了,我們開始學習脫殼吧驚訝  

開始我們的脫殼之路

一開始來個apk,你不能說一來就脫殼啊,沒殼的你脫毛啊   用壓縮軟件打開我們的學習用的apk,跟著將那個dex拖出來,其實不拖出來也是可以的,因為下面用的軟件支持直接拖apk進去 \ 轉化成jar(這個軟件還是比較好用的,支持文件拖拽) \ 跟著自動就幫你打開JD-GUI了 \ 全部函數都放到so文件中了,load了一個庫mobisec 看到這,就是要脫殼了,就像我們平時win逆向的時候,打開ida,發現只有一個函數   那我們接下來就開始吧   ida的動態調試可以百度哦 ,或者很多安卓安全的書都有了,想得起的話我去寫個記錄   首先安裝,看看,熟悉一下整個應用,應該是輸入正確的url,跟著出flag,key啊什麼的 \   對了,還沒知道包名,上apktool,解包 \   看看包名 \   在手機上運行server \   作一下端口轉發(應該是本地的端口,轉發到adb那邊的23946端口吧),當然如果利用局域網調試就不用這一步了 \   跟著一條是調試模式打開應用的首頁 \   那接著就上ida咯 \ \   ok後可以看到我們那個進程了,附加上去 \   跟著看看模塊吧 \     跟著查找libdvm,這個看名字就知道跟Dalvik虛擬機有個,dvm嘛,優化dex的應該也在裡面,我對自己是這麼想的 \   雙擊點過去,繼續查找dvmDexFileOpenPartial \ 再點過去 \   F9運行!!!!!   接下來jdb命令動態調試Apk   先打開ddms,可以看到調試端口,還有哪個紅蟲 \   JDB是基於文本和命令行的調試工具(例如Sun JDB);雖然現在有一些很好的調試工具,然而 Java 調試器 (JDB) 提供了一些優點。最重要的是 JDB 可以免費獲取並且是平台獨立的。其缺點是它只有命令行格式,一些開發人員認為這很原始,而且難以使用。一些 IDE 已經將 GUI 界面構建到 JDB 調試 API(如 Jikes)。JDB 是 JDK 安裝的一部分。它在 Java 2 平台中得到了增強。   使用jdb命令進行調試時,一般選擇8700端口,因為8700是默認的調試端口 都一樣的了,沒什麼特殊,我們可以看到使用的包中有個jdi,這也滿足我們的預想 \     跟著ida就出現這個,取消就好 \   繼續 \   跟著程序就斷下來了 \   R0是傳過來的第一個參數,R1是第二個參數,根據這個函數的原型,所以如下 \   跟著就用腳本把它dump出來吧 \   一開始應該就是相當於我們C語言的聲明變量,看來那些寄存器我們直接寫名字就可以訪問了 \   算了,直接給代碼吧
auto fp, dex_addr, end_addr;
    fp = fopen("C:\\dump.dex", "wb");
    end_addr = r0 + r1;
    for(dex_addr = r0; dex_addr < end_addr; dex_addr++)
        fputc(Byte(dex_addr), fp);
點擊run \   稍等片刻,馬上就好 \   結果發現只有安卓的庫(不要急,我就入坑了,這個dex2jar不能用於dump出來的應該,我把上面的步驟至少重復了5遍) \   再看看那個地址,確實是個dex文件啊 \   直接上JEB神器,終於看到了 \  
  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved