使用IDA調試SO脫殼,環境準備及各步驟原理詳解

使用IDA調試SO脫殼,環境準備及各步驟原理詳解

引言

最近在搗鼓移動端的脫殼,雖然目前這方面的教程有挺多的了,但還是走了很多彎路,現在希望把這些內容記錄下來幫助有需要的人

環境準備

手機環境

首先請準備一台手機,這台手機需滿足以下三個條件:

  1. 必須是真機
  2. 手機系統版本為安卓4.4及之前的系統
  3. 手機已經root

首先解釋為什麼要是真機,因為模擬器經常會遇見各種各樣的問題(親測)導致有些步驟進行不下去。

關於第二點,因為目前網上能找到的教程都是幾年前的,那個時候的安卓系統仍然是用著dvm虛擬機,載入so文件用到的庫是libdvm,而5.0以上的系統已經統一使用ART進行載入了,所以如果你用5.0以上系統照著原來的教程做,就會發現做了一半就跟不下去了。再一個就是移動端的殼發展到現在已經更迭了好幾代了,一代比一代難脫,要入門最好還是從第一代開始脫。

至於第三點的話,自然就是因為準備環境時需要往手機根目錄下放一些文件,或是安裝xposed框架。

程序環境

程序的話,自然是要找一個已經加了殼的應用,且這個應用本身不會太複雜,以防反編譯的時候出現一些奇奇怪怪的問題。

關於這點,參考這篇文章:

v2ex.com/t/298813

這個鏈接里有目前幾款主流加殼應用的官網地址,在其官網裡一般都會有介紹哪些APP使用了他們家的殼,我在其中找到了計算管家這款看起來就很簡單的軟體。

接下來就是要找到這款軟體幾年前的版本,在這裡可以用PP助手或是安智市場,這兩個應用商店都可以下到歷史版本的APP。

在這裡我使用了在安智下載的計算管家3.1.1版本的APP

操作步驟

放置IDA的APP調試伺服器

找到IDA的根目錄,進入dbgsrv的子目錄下,可以看見有一個名為android_server的文件,這個就是要使用IDA調試so文件所需要的程序。你想啊,我在電腦上怎麼才能調試手機上的程序呢?一個方案當然是我在手機上弄一個調試器,但手機屏幕這麼小,根本不方便調試,那麼最好就是我在手機上這個調試器只提供調試功能,而把操作界面放到電腦上來,而android_server這個文件就是起到這個作用了。

接下來我們需要把這個文件弄到手機根目錄下去。在這裡我們可以在手機上下個RE管理器或者ES文件管理器(可能有人會說直接用adb

push,但是有些機子,即使已經root了,也會因為各種各樣的許可權問題導致傳不下去),先把文件通過數據線轉到手機內置或外置存儲卡上,然後使用上述APP將根目錄掛載為可讀寫,然後將這個文件複製過去。在這裡你可以任意更改這個文件的名字,也可以放在任意地方(網上有的說放在/data下,有的放在/data/local/tmp下,其實位置並不是固定的),我為了方便運行這個程序,直接放在了根目錄下,改名為as,然後通過adb

shell將這個文件許可權改為777。

將ro.debuggable的值改為1

為了使用jdb恢復程序的運行,我們需要:

APK的AndroidManifest.xml中debuggable為true

或是根目錄下的 ro.debuggable的值為1,如下圖所示:

關於這一步怎麼做,參考這篇文章:

blog.csdn.net/feibabeib

文章中提到了4種方法,其中第二種因為殼沒脫下來,沒辦法回編譯,更改不了,第三種太麻煩。就只剩下第一種和第四種。

第一種需要安裝第xposed,有的手機可能安裝不了這個。

就剩下第4種,這種方法因為某種原因也不能在我手機上正確運行,所幸我找到了mprop這個軟體的最新版:

bbs.pediy.com/thread-21

第4種方法因為是修改內存,所以default.prop中的值仍然是原來的,而且重啟後要重新運行一次。

以root許可權運行android_server

打開手機的usb調試,連接上數據線,在電腦上的cmd里運行adb

shell,有的人可能運行不成功,有可能是因為adb被佔用的原因(我曾經因為使用了酷狗,一直被它自己的音樂傳輸後台程序給佔用著),進入到shell後,輸入su獲取root獲取,然後./as運行android_server,這裡最好用su切換root許可權後再運行,以防出現許可權不夠的情況。

在這裡可以看到它在監聽埠23946,等著別人來連接它。

進行埠轉發

上一步里android_server在監聽埠23946,我們可以用adb

forward tcp:23946

tcp:23946這個命令將pc端的23946埠轉到手機端的23946,這樣ida附加調試的時的地址就只需要填127.0.0.1,即本機地址了。

實際上這一步並不是必要的,只不過如果省略的話,ida附加時要填上手機的IP,這樣會比較麻煩。

以調試模式啟動應用

使用AndroidKiller打開APK文件進行反編譯,可以看到

文件的包名和入口

在命令行里輸入如下命令,以調試模式啟動APP:

adb shell am start -D -n longbin.helloworld/longbin.helloworld.SplashActivit

命令最末尾那個就是我們APP對應的包名/入口,其他部分不能修改。

使用IDA附加調試

打開一個空的IDA,選擇debugger->attach->Remote

ARMLinux/Android debugger,然後在選擇debug options里選擇suspen on process entry

point,使其斷在程序入口點,這裡如果進行了埠轉發在hostname里填上127.0.0.1,如果沒有,就填上手機的IP地址,點擊確定之後找到對應的程序,載入。

打開DDMS

這一步也不是必要的,DDMS原本是ecplipse上的一個插件,如果你用的是android

studio,可以用tools->Android->Android Device

Monitor打開它。可以看見,我們要調試的程序出現在了這裡(如果沒有是因為ro.debuggable沒有設置成功),

待調試的程序前面有一個紅色的蟲子,條目的最後也多了個/8700,這裡就是DDMS幫我們進行了埠轉發,如果沒有打開DDMS,則要自己進行埠轉發

adb forward tcp:8700 jdwp:8606

這條命令即把pc端的8700埠轉發到手機端的8606埠上(待調試程序佔用的埠號是8606)

使用jdb恢復程序運行

最後在命令行中輸入:

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

這一步的作用是使程序恢復運行。注意這時候如果ida里還沒有點擊運行,程序是不會真的繼續運行的,這時候就可以正常地在IDA里下斷調試了。

這裡我對這個程序脫殼的步驟參考:

blog.csdn.net/jiangwei0

最後的話

感覺android端的下斷調試遠比pc端要繁瑣,坑也比較多,而網上的教程大多是只告訴我們具體的步驟,而不告訴我們為什麼需要這個步驟的原因,導致我們跟著做的時候也是懵懵懂懂,因此產生了寫這篇文章的動機。

文章的內容都是我參考網上的文章根據自己的理解寫出來的,如果有不對的地方,還請大家指出。

本文由看雪論壇 夢野間 原創,轉載請註明來自看雪社區

推薦閱讀:

程序邏輯錯誤的調試--以獎學金計算題目為例
遠程線程注入代碼
Windows 反調試技術——OpenProcess 許可權過濾
在windbg中細究函數調用
一個可以更好地調試的 Perl 模塊

TAG:IDA | 軟體調試 | 移動端 |