IDA在內存中dump出android的Dex文件


轉載自http://drops.wooyun.org/tips/6840

在現在的移動安全環境中,程序加殼已經成為家常便飯了,如果不會脫殼簡直沒法在破解界混的節奏。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函數上下一個斷點:

enter image description here

然后我們點擊繼續運行,程序就會在dvmDexFileOpenPartial()這個函數處暫停,R0寄存器指向的地址就是dex文件在內存中的地址,R1寄存器就是dex文件的大小:

enter image description here

enter image description here

然后我們就可以使用ida的script command去dump內存中的dex文件了。

enter image description here

enter image description here

1
2
3
4
5
6
7
8
9
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文件了。

enter image description here

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

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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM