IDA Pro脫殼實戰(一)

IDA Pro脫殼實戰(一)

標籤(空格分隔): Apk逆向


1. 前言

關於IDA Pro的介紹,已不用多說了,是目前最棒的一個靜態反編譯軟件,編程天才的傑作。這裏的脫殼實戰我們以阿里比賽樣本AliCrackme_3.apk樣本爲例。

2. 調試環境的搭建

2.1 安裝IDA Pro

[下載地址][1]
直接解壓運行

2.2 使用IDA進行調試設置

在IDA安裝目錄dbgsrv下獲取android_server命令文件
運行命令:

adb root
adb remount
adb push android_server /data   #將文件拷貝到手機data目錄
adb shell
cd /data
chmod 755 android_server    #更改權限,賦予可執行權限
./android_server            #運行
root@Che1:/data # ./android_server
IDA Android 32-bit remote debug server(ST) v1.17. Hex-Rays (c)     2004-2014
Listening on port #23946...

錯誤1:error: only position independent executables (PIE) are supported
這個主要是Android5.0以上的編譯選項默認開啓了pie,在5.0以下編譯的原生應用不能運行,有兩種解決辦法,一種是用Android5.0以下的手機進行操作,還有一種就是用IDA6.6+版本即可。

2.3 配置端口轉發

這裏開始監聽了設備的23946端口,那麼如果要想讓IDA和這個android_server進行通信,那麼必須讓PC端的IDA也連上這個端口,那麼這時候就需要藉助於adb的一個命令了:
adb forward tcp:遠端設備端口號(進行調試程序端) tcp:本地設備端口(被調試程序端)
另起一個cmd,運行命令
adb forward tcp:23946 tcp:23946

2.4 以debug模式啓動apk

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

2.5 使用IDA進行連接

選擇Debugger->Attach->Remote ARMLinux/Android debugger

這裏寫圖片描述

點擊OK按鈕,按ctrl+F搜索com.ali進行進程附加操作

這裏寫圖片描述

2.6 啓動jdb調試器

jdb -connect com.sun.jdi.SocketAttach:hostname=127.0.0.1,port=8700

處於等待狀態

這裏寫圖片描述

2.7 下斷點

給dvmDexFileOpenPartial函數下斷點,原因如下:
dvmDexFileOpenPartial這個函數是最終分析dex文件,加載到內存中的函:

int dvmDexFileOpenPartial(const void* addr, int len, DvmDex** ppDvmDex);

第一個參數就是dex內存起始地址,第二個參數就是dex大小。

找到dvmDexFileOpenPartial的函數地址
IDA靜態分析libdvm.so得到這個函數的相對地址爲Ox46CCC

這裏寫圖片描述

按Ctrl + S查看libdvm.so在虛擬內存中的映射位置

這裏寫圖片描述

然後將兩者相加得到絕對地址:Ox46CCC + Ox415CA000 = Ox41610CCC,使用G鍵,跳轉:

這裏寫圖片描述

2.8 點擊運行按鈕或者F9,然後按F8進行單步調試

這裏寫圖片描述

其中R0和R1就是傳遞給dvmDexFileOpenPartial的參數,R0對應於addr,R1對應於len,也就是dex文件的長度

然後按下Shirt+F2 調出IDA的腳本運行界面

這裏寫圖片描述

然後使用jeb工具打開dump到的dex文件

這裏寫圖片描述

於是得到了被加固的dex文件

2.9 總結

該樣本直接使用dvmDexFileOpenPartial函數實現dex的文件加載,我們直接可在改函數出下斷點,然後從內存中直接dump出dex文件,是一個比較簡單樣例,也算是複習下IDA pro調試的基本步驟,然後真正的現實情況並沒有這麼簡單,很多多應用會採取一系列額反調試手段,比如:

SO的反調試
IDA是使用android_server在root環境下注入到被調試的進程中,那麼這裏用到一個技術就是Linux中的ptrace
那麼Android中如果一個進程被另外一個進程ptrace了之後,在他的status文件中有一個字段:TracerPid 可以標識是被哪個進程trace了,我們可以使用命令查看我們的被調試的進行信息:
status文件在:/proc/[pid]/status
如果檢測到這個字段不爲0,說明當前so文件正在被調試,這是一種常用的反調試技術

還有有些加固的apk對dex文件的加載不一定就走dvmDexFileOpenPartial進行加載,會自己實現dex文件的加載函數,但不管怎麼樣,最終還是會使用mmap內存映射函數,所以下斷點的地方又有所區別。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章