Android App常見逆向工具和使用技巧
前言
本文將主要介紹個人在Android App逆向分析時常用到的一些工具和小技巧。說起Android 逆向,就不得不提到常用的逆向分析神器了,IDA,jadx,Android Killer,JEB。
常用工具介紹
jadx是一款非常不錯的apk反編譯工具,可以直接將apk轉(zhuǎn)換成java源碼,代碼還原度高,且支持交叉索引等等,以一款開源工具為例,反編譯后結(jié)構(gòu)圖
代碼顯示效果:
排除混淆的影響外,整體看來代碼的顯示效果基本是跟原工程一樣的,非常有邏輯感,右鍵還可以查看方法和變量的引用,但是jadx的缺點也很多,速度較慢,且不支持變量,方法重命名等等,在針對混淆代碼分析時有些力不從心,這里就推薦另一款工具JEB。
JEB是一款非常不錯的Android逆向分析工具,新版的JEB也已經(jīng)支持了app動態(tài)調(diào)試,但由于不穩(wěn)定性,暫時還不推薦使用,本文使用版本1.5,由于大部分人都接觸過JEB,也知道JEB的常見特性,本文就主要講解JEB的另一個功能,腳本功能,示例app為RE管理器。反編譯后可以看到:
方法中多數(shù)字符串已經(jīng)被轉(zhuǎn)換成了byte數(shù)組,這在逆向分析時會比較頭大,為了解決這一問題,我們可以嘗試寫個腳本來還原這些字符串,打開idea,新建一個java工程,導(dǎo)入jeb.jar(該文件在JEB目錄下可以找到),***步,需要知道JEB需要遍歷的方法是什么,這里調(diào)用了new String方法將byte數(shù)組轉(zhuǎn)換成string,那這里就需要匹配new String這個方法,如下
接下來需要讓JEB枚舉所有方法
這里主要就是利用JEB的插件功能枚舉所有引用到該簽名的方法,好處就是節(jié)省后面匹配替換的時間,找到關(guān)鍵處后自然就開始替換和解密操作了。
這里主要就是遍歷和迭代所有方法中的元素,取到元素后首先需要進行過濾,因為是new String,所以需要判斷當(dāng)前類型是否為New,是的話再去匹配簽名值是否跟上面設(shè)置的一致,當(dāng)匹配成功后就可以在元素中取值了,取到值后還需要進行相應(yīng)的處理,將類型轉(zhuǎn)換成我們需要的byte數(shù)組,今后再進行解密和替換,整體邏輯和實現(xiàn)并不復(fù)雜,上面的截圖也都做了詳細的備注,丟張?zhí)幚砗蟮慕貓D:
這樣分析起來就輕松多了,當(dāng)然這里只是簡單的舉了個new String的例子,同樣該腳本稍作修改可以解密如des,aes,base64等加密編碼操作。
當(dāng)然說到逆向工程,不得不提的工具當(dāng)然是IDA,作為一個適應(yīng)多種平臺的逆向分析工具,在安卓上的使用率也非常高,強大的反匯編功能以及F5轉(zhuǎn)偽C代碼功能都給分析者提供了便捷,下面以某個CrackeMe演示:
常見的native方法有靜態(tài)注冊和動態(tài)注冊兩種形式,靜態(tài)注冊均已java開頭,以類的路徑命名,所以可以很輕松的找到,雙擊該方法即可來到匯編代碼處,F(xiàn)5后發(fā)現(xiàn)代碼丟失了很多,如下圖:
在匯編代碼狀態(tài)下按下空格鍵即可切換至流程圖,如下:
發(fā)現(xiàn)該方法被識別出了兩個入口點,從而導(dǎo)致很多代碼未被識別到,找到***個分支的結(jié)束地方
選擇菜單欄的Edit->function->removefunction tail,之后在修改過后的地方點擊菜單欄Edit->other->forceBL call 即可,之后再此F5即可正常顯示所有代碼
而動態(tài)注冊方法較靜態(tài)注冊在尋找關(guān)鍵點時稍加麻煩一點,而動態(tài)注冊勢必會在jni_Onload中去處理這些函數(shù),以某so為例,F(xiàn)5后代碼如下
這里會看到很多的偏移地址,其實是指針在jniEnv中的相對位置,此時可以通過導(dǎo)入jni頭文件來自動識別,在網(wǎng)上可以很容易下載到這個文件,導(dǎo)入后右鍵Convert to Struct后代碼如下:
這里已經(jīng)看的很清晰了,調(diào)用了RegisterNatives方法注冊了兩個方法,off_8004則是記錄了該方法的偏移地址,雙擊進入:
這里已經(jīng)看到了兩個方法對應(yīng)的內(nèi)容,_Z10verifySignP7_JNIENVP8_jobect和_Z13getentyStringv,雙擊即可跳轉(zhuǎn)到該方法中,當(dāng)然這些對于ida來說根本都是基礎(chǔ)功能,而且新版本的IDA支持直接對字節(jié)碼進行patch,無需像之前一樣記錄修改地址,使用16進制編輯器對字節(jié)碼進行修改,示例如下:
在000025C6處我調(diào)用了一個檢測當(dāng)前是否處于調(diào)試狀態(tài)的方法,如果程序被調(diào)試器連接上,則會自動崩潰,而readStatus是個void方法,本身不帶參數(shù)和返回值,思路很簡單,nop掉該方法再重新打包即可正常調(diào)試,選擇菜單欄上的Options->General
此處將0改為4即可
此時每條指令對應(yīng)的機器碼已經(jīng)顯示出來,可以看到readStatus是個arm指令,修改方法很簡單,常見的nop方法可以使用全0替換機器碼
點擊到修改指令后選擇菜單欄的Edit->patch program->changebyte,修改前4個字節(jié)為00 00 00 00即可,效果如下:
可以看到反調(diào)試方法已經(jīng)被清除掉了,那么如何保存修改后的文件呢,也很簡單,點擊菜單欄的Edit->patchprogram->Apply patches to Input file,直接點擊ok即可,當(dāng)然ida的小技巧還有很多,比如在動態(tài)調(diào)試時改變android_server的默認端口即可過濾掉反調(diào)試對端口23946的檢測,命令為-p123 ,123為端口號,記得-p和端口號之間是沒有空格的。
***要介紹的就是Android Killer了,ak是一款不錯的apk反編譯集成工具,有良好的smali顯示效果和編輯功能
當(dāng)然作為一個反編譯工具,這些都是最基本的功能,ak有一項強大的功能是代碼插入,可以對代碼進行稍加的封裝,即可實現(xiàn)快速插入代碼,比如個人實現(xiàn)的log插樁插件,是在開源項目LogUtils的基礎(chǔ)上轉(zhuǎn)換成了smali插件,支持一鍵輸出任意基本類型的數(shù)據(jù)以及json,Intent等數(shù)據(jù)類型,使用方式也很簡單,右鍵選擇插入代碼即可
代碼就1句話,其中p0是需要打印的寄存器,在靜態(tài)方法中p0代表是是***個入?yún)?,在逆向工程上,代碼插樁可以很好的幫助我們進行數(shù)據(jù)的分析,這些插件我都發(fā)布到了網(wǎng)絡(luò)上,都可以下載到。
總結(jié)
本文主要介紹了Android App逆向時常用的工具和他們的一些使用小技巧,但逆向單靠一樣工具和常見的技巧往往還是不夠的,需要大家的嘗試和耐心以及自身對逆向的鉆研精神。