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

Editor發表於2017-10-31

引言

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

環境準備

手機環境

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

——必須是真機

——手機系統版本為安卓4.4及之前的系統

——手機已經root

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

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

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

程式環境

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

關於這點,參考這篇文章:https://www.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,如下圖所示:

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

關於這一步怎麼做,參考這篇文章:http://blog.csdn.net/feibabeibei_beibei/article/details/52744231文章中提到了4種方法,其中第二種因為殼沒脫下來,沒辦法回編譯,更改不了,第三種太麻煩。就只剩下第一種和第四種。

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

就剩下第4種,這種方法因為某種原因也不能在我手機上正確執行,所幸我找到了mprop這個軟體的最新版:https://bbs.pediy.com/thread-215311.htm第4種方法因為是修改記憶體,所以default.prop中的值仍然是原來的,而且重啟後要重新執行一次。

以root許可權執行android_server

開啟手機的usb除錯,連線上資料線,在電腦上的cmd裡執行adbshell,有的人可能執行不成功,有可能是因為adb被佔用的原因(我曾經因為使用了酷狗,一直被它自己的音樂傳輸後臺程式給佔用著),進入到shell後,輸入su獲取root獲取,然後./as執行android_server,這裡最好用su切換root許可權後再執行,以防出現許可權不夠的情況。

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

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

進行埠轉發

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

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

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

以除錯模式啟動應用

使用AndroidKiller開啟APK檔案進行反編譯,可以看到

檔案的包名和入口

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

在命令列裡輸入如下命令,以除錯模式啟動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地址,點選確定之後找到對應的程式,載入。

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

開啟DDMS

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

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

Monitor開啟它。可以看見,我們要除錯的程式出現在了這裡(如果沒有是因為ro.debuggable沒有設定成功),

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

待除錯的程式前面有一個紅色的蟲子,條目的最後也多了個/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裡下斷除錯了。

這裡我對這個程式脫殼的步驟參考:http://blog.csdn.net/jiangwei0910410003/article/details/51620236

最後的話

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

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

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

相關文章