首先是Dalvik虛擬機(jī)下的操作驾孔。
1赴肚、先將ida安裝目錄下的dbgsrv文件夾下的android_server文件push到手機(jī)里锈颗,因?yàn)槲疫@里用的是x86架構(gòu)的虛擬機(jī)(arm架構(gòu)的虛擬機(jī)簡(jiǎn)直太慢了)已亥,使用的是android_x86_server采蚀。如果是arm架構(gòu)的虛擬機(jī)或者手機(jī)則使用android_server疲牵。
2、修改android_x86_server的權(quán)限榆鼠。
3纲爸、開(kāi)啟android_x86_server服務(wù)并且使用adb forward命令進(jìn)行端口轉(zhuǎn)發(fā)。
4妆够、使用adb shell pm list package -3命令獲取手機(jī)內(nèi)安裝的第三方應(yīng)用的包名(參數(shù)-3表示獲取第三方應(yīng)用)识啦,找到我們需要dump的應(yīng)用包名。
5神妹、使用adb shell am start -D -n [包名]/.[MainActivity主入口]以調(diào)試模式開(kāi)啟app颓哮。
6、使用IDA新建一個(gè)空的工程鸵荠,選擇Debugger -> Attach下的選項(xiàng)進(jìn)行遠(yuǎn)程連接冕茅。
這里需要注意的是,如果不使用調(diào)試狀態(tài)下的手機(jī)如虛擬機(jī)、安裝有xpose的xinstall模塊的手機(jī)等姨伤,是無(wú)法在DDMS看到手機(jī)的應(yīng)用狀態(tài)哨坪,這時(shí)候需要將待調(diào)試應(yīng)用的進(jìn)程ID記錄下來(lái),如上圖的進(jìn)程ID為3193乍楚。
7当编、開(kāi)啟DDMS并選擇調(diào)試的應(yīng)用。
這里要注意的是徒溪,如果不使用虛擬機(jī)或者裝有xpose中的xinstaller模塊的話忿偷,DDMS是讀取不了數(shù)據(jù)的,上述步驟省略词渤,并且使用命令adb forward tcp:8700 jdwp:[進(jìn)程id] 進(jìn)行端口轉(zhuǎn)發(fā)牵舱,如上程序需使用adb forward tcp:8700 jdwp:3193。
8缺虐、使用命令jdb -connect com.sun.jdi.SocketAttach:hostname=127.0.0.1,port=8700芜壁,之后在IDA使用F9鍵繼續(xù)執(zhí)行下一步,此時(shí)手機(jī)內(nèi)存中的信息即可全部加載到IDA里高氮。
9慧妄、進(jìn)入adb shell,使用ps命令獲取手機(jī)當(dāng)前的進(jìn)程信息剪芍,可以使用grep進(jìn)行信息的過(guò)濾,塞淹,獲取所需要dump出來(lái)的程序進(jìn)程id(如上步驟5,如果在IDA選擇需要連接程序時(shí)記錄了該程序的進(jìn)程id罪裹,則此步可以省略)饱普。
10、在adb shell里使用/proc/[進(jìn)程id]/maps獲取我們需要dump出來(lái)的dex文件所在內(nèi)存的地址状共。
11套耕、在IDA的Hex view窗口使用G鍵跳轉(zhuǎn)內(nèi)存地址到剛剛獲得的dex文件內(nèi)存地址,根據(jù)標(biāo)識(shí)符看看是不是dex文件峡继。
因?yàn)镈alvik虛擬機(jī)下對(duì)運(yùn)行的dex文件做了優(yōu)化冯袍,真正在內(nèi)存中運(yùn)行的是odex文件,如上文件頭為dey.036碾牌,雖然能看到有dex文件的文件頭dex.035康愤,但是dex文件的結(jié)構(gòu)被修改了,直接dump出dex文件可能需要修改校驗(yàn)碼等其他操作舶吗。
12征冷、進(jìn)入IDA的File -> script command進(jìn)行dump出dex文件的腳本編寫(xiě)。
寫(xiě)入如下腳本裤翩,并將odex文件的起始地址和結(jié)束地址资盅、文件存儲(chǔ)位置進(jìn)行相應(yīng)的更改调榄。
static main(void){
????auto fp, begin, end, dexbyte;
????fp = fopen("d:\\dump.dex", "wb");
????begin = 0x8ba9200;
????end = 0x8bd8d00;
????for ( dexbyte = begin; dexbyte < end; dexbyte ++ )
? ? ?{
????????fputc(Byte(dexbyte), fp);
????}
}
Run!:强浮每庆!
13、得到odex文件之后今穿,使用baksmali對(duì)odex文件進(jìn)行反編譯后再使用smali進(jìn)行編譯成dex文件缤灵,baksmali和smali下載地址點(diǎn)擊這里,我用的是2.2.2的版本蓝晒。
我在使用baksmali的時(shí)候遇到一個(gè)坑是缺少一些文件腮出,如下圖錯(cuò)誤。解決方法是將手機(jī)里的/system/framework/目錄下的所有文件都pull到電腦上芝薇。
以上順利反編譯后胚嘲,得到一個(gè)文件夾,里面裝的就是dump出來(lái)dex文件的smali代碼洛二,通過(guò)使用與baksmali配套的smali.jar對(duì)smali文件夾進(jìn)行回編譯就得到dex文件了馋劈。
在Android6.0以上的Art虛擬機(jī)下。
dump出文件的步驟與上面的dalvik虛擬機(jī)下的步驟1-12是一致的晾嘶,不同的在于art虛擬機(jī)下dump出來(lái)的文件是oat文件妓雾,oat文件內(nèi)的dex文件能直接分離出來(lái)而不需要像odex文件那樣反編譯再回編譯。這里我用的是010editor進(jìn)行對(duì)oat文件內(nèi)提取dex文件垒迂。
1械姻、將oat文件拖到010editor里,搜索dex文件頭机断,使用ctrl + F鍵后選擇搜索text楷拳,輸入搜索的關(guān)鍵詞,因?yàn)椴荒芩阉鳂?biāo)點(diǎn)符號(hào)吏奸,所以我搜索的是035關(guān)鍵詞唯竹。有的oat文件可能會(huì)有多個(gè)dex文件,這就需要多搜索幾次了苦丁。
2、獲取dex文件的長(zhǎng)度物臂,了解dex文件格式的同學(xué)應(yīng)該知道旺拉,dex文件的長(zhǎng)度保存在dex文件的頭地址后第20位至第24位里(16進(jìn)制),如上圖中dex文件頭地址為0x26BC棵磷,加上20蛾狗,即0x26DC開(kāi)始的4位存的是dex文件的長(zhǎng)度,為0x1F09EC仪媒。
3沉桌、dex文件頭地址加上dex文件長(zhǎng)度后谢鹊,得到dex文件的尾地址,將dex頭地址至尾地址的內(nèi)容復(fù)制留凭,并在010editor新建一個(gè)文件將所得內(nèi)容拷貝過(guò)來(lái)保存為dex文件即可得到完整的dex文件佃扼。
如上為0x26BC + 0x1F09EC = 0x1F30A8,在010editor將頭尾地址所有內(nèi)容復(fù)制蔼夜。
在010editor新建文件兼耀,選擇Hex格式,將剛才復(fù)制的內(nèi)容拷貝過(guò)來(lái)求冷,可以看到下圖中文件的尾地址剛好是dex的文件長(zhǎng)度0x1F09EC瘤运,說(shuō)明文件完整,保存為dex文件后即可進(jìn)行分析匠题。