引言
最近在搗鼓移動端的脫殼,雖然目前這方面的教程有挺多的了,但還是走了很多彎路,現在希望把這些內容記錄下來幫助有需要的人
環境準備
手機環境
首先請準備一臺手機,這臺手機需滿足以下三個條件:
——必須是真機
——手機系統版本為安卓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,如下圖所示:
關於這一步怎麼做,參考這篇文章: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許可權後再執行,以防出現許可權不夠的情況。
在這裡可以看到它在監聽埠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裡下斷除錯了。
這裡我對這個程式脫殼的步驟參考:http://blog.csdn.net/jiangwei0910410003/article/details/51620236
最後的話
感覺android端的下斷除錯遠比pc端要繁瑣,坑也比較多,而網上的教程大多是隻告訴我們具體的步驟,而不告訴我們為什麼需要這個步驟的原因,導致我們跟著做的時候也是懵懵懂懂,因此產生了寫這篇文章的動機。
文章的內容都是我參考網上的文章根據自己的理解寫出來的,如果有不對的地方,還請大家指出。
本文由看雪論壇 夢野間 原創,轉載請註明來自看雪社群