在記憶體中dump Dex檔案

來源:互聯網
上載者:User

標籤:

在現在的Mobile Security環境中,程式加殼已經成為家常便飯了,如果不會脫殼簡直沒法在破解界混的節奏。ZJDroid作為一種萬能脫殼器是非常好用的,但是當作者公開發布這個項目後就遭到了各種加殼器的針對,比如說搶佔ZJDroid的廣播接收器讓ZJDroid無法接收命令等。我們也會在”安卓動態調試七種武器之多情環 - Customized DVM”這篇文章中介紹另一種架構的萬能脫殼器。但工具就是工具,當我們發布的時候可能也會遭到類似ZJDroid那樣的針對。所以說手動脫殼這項技能還是需要學習的。在這一節中我們會介紹一下最基本的記憶體dump流程。在隨後的文章中我們會介紹更多的技巧。

這裡我們拿alictf2014中的apk300作為例子來介紹一下ida脫簡單殼的基本流程。 首先我們用調試JNI_OnLoad的技巧將程式在運行前掛起:

adb shell am start -D -n com.ali.tg.testapp/.MainActivity

![enter image description here][59]

然後在libdvm.so中的dvmDexFileOpenPartial函數上下一個斷點:

然後我們點擊繼續運行,程式就會在dvmDexFileOpenPartial()這個函數處暫停,R0寄存器指向的地址就是dex檔案在記憶體中的地址,R1寄存器就是dex檔案的大小:

然後我們就可以使用ida的script command去dump記憶體中的dex檔案了。

123456789 static main(void){  auto fp, begin, end, dexbyte;  fp = fopen("C:\\dump.dex", "wb");  begin = r0;  end = r0 + r1;  for ( dexbyte = begin; dexbyte < end; dexbyte ++ )      fputc(Byte(dexbyte), fp);}

Dump完dex檔案後,我們就可以用baksmali來反編譯這個dex檔案了。

因為過程有點繁瑣,我錄製了一個dump dex檔案的視頻在我的github,有興趣的同學可以去下載觀看。

當然這隻是最簡單脫殼方法,很多進階殼會動態修改dex的結構體,比如將codeoffset指向記憶體中的其他地址,這樣的話你dump出來的dex檔案其實是不完整的,因為程式碼片段儲存在了記憶體中的其他位置。但你不用擔心,我們會在隨後的文章中介紹一種非常簡單的解決方案,敬請期待。

 

在記憶體中dump Dex檔案

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.