聲明
? ?1. 本人初次寫技術類文章,如寫的不好請大家見諒,在這里只是想讓自己能有一個語言上的沉淀和技術經驗上的積累。
????2. 由于是逆向分析App中的登陸請求中的密碼加密跟一個s值加密的過程,為了不引起不必要的麻煩這里就不公開是什么app了(該文都以某App稱呼),只是給大家一個技術上的思路。同時也給那些Java開發或者是Andorid開發等人一個警鐘,不要認為什么都是安全的,也不要只顧著寫功能,不注重安全問題。
?????3. 由于初次寫技術類文章,如有侵權或者威脅到該App安全問題請及時聯系我。作者郵箱itdreamlmc@163.com.。
????4.版權聲明:本文為博主原創文章,未經博主允許不得私自轉載。
前言
????????周六周日閑著蛋疼總是有事沒事的找點東西研究下,當我拿起手機不知道研究啥好的時候,手機上一個App引起了我的注意。接下來就開始的了我的逆向分析之路。
準備工具
? ? ? ?工欲善其事必先利器,要想做好后邊的加密分析那點事,那么工具是不可缺少的,整個過程需要的工具主要有如下。
1.安卓手機一部(已獲取ROOT權限的)。
2.抓包神器Fiddler(主要抓取該app的登陸請求數據)。
3.安卓的adb命令工具(主要用操作手機終端)。
4.安卓逆向助手AntiDroid V1.4.3。
5.App反編譯工具Android kill。
6.SO調試工具IDA Pro。
7. Java項目開發工具IntelliJ IDEA(主要用作動態調試app和算法的測試)。
對App的登陸接口數據靜態分析
????????如果你要對一個App的某個接口分析,那么首先你不得不先抓取到接口請求的數據,然后在對其請求跟響應數據參數做分析。接下來就是對某App的登陸接口的請求數據進行分析過程。
????????首先下載某App并安裝到手機上,然后設置Fiddler抓包工具(具體如何抓包大家自行百度就行了,注需要配置證書問題,否則或抓不到htpps接口請求的數據),打開某app找到登陸頁面隨便輸入個登陸手機號跟密碼點擊登陸,然后到Fiddler中會看到如圖請求數據。
????????我們點擊WebForms查看提交表單數據會看如下請求數據,這里只對參數p登陸密碼,跟一個校驗參數s做分析,p參數還好,有經驗的程序員都能基本猜到90%就是一個RSA加密只要拿到公鑰然后自己寫一個RSA加密就可以了,對于參數S就顯得有點麻煩,本來我以為就是一個簡單的MD5之類的簽名然后截取字符串,或者是一個隨機值之類的,可事實上并非如此,多換幾個賬號登錄或換密碼就會發現S參數值每次隨著登錄賬號跟密碼的不同而改變,所以大致能猜到S應該是賬號跟密碼經過某個算法計算出的加密值,接下來我們就開始去一點點分析這兩個參數。
反編譯某App獲取它的字節碼文件
????????首先打開安卓逆向助手AntiDroid V1.4.3 然后選擇 Dex轉Jar,之后選擇下載的Apk文件,選擇jar保存路徑最后點擊Dex轉為Jar等待準換完成,如圖所示。
分析參數p的密碼加密過程
成功將dex轉為jar之后之后到AntiDroid跟目錄找到jd-gui 工具如圖
打開其應用,將轉換成功的jar拖進該工具上,我們就可以看到該apk80%以上的java代碼了(因為java代碼是逆向過來的,所以會有部分數據損壞),之后我們全文搜索RSA關鍵字如圖所示,并打開這個c文件我們會看到RSA 加密方法。
????????好了看到這個我們就大概能猜到密碼加密是調用了這里,那接下來我們就動態的調試下app在這個了下斷點,看看這里是不是密碼加密。
????????首先打開Andorid killer 將apk拖進去反編譯拿到該apk的所有smail文件,之后打開IDEA新建java工程,然后將所有的smail文件全部拷貝到IDEA java項目的src目錄下然后附加遠程調試apk(IDEA如何附加調試Apk大家自行百度下,這里不做詳細說明),找到該c文件對應的smail文件打開,在方法開始打上斷點,具體如圖所示。
????????之后打開手機app點擊登陸會看到程序會斷在這個位置我們看下傳進來的參數剛好為數據的密碼,所有可以斷定該app的密碼的密碼就是用的這個RSA公鑰進行加密的,所以我們將該公鑰拷貝出來之后就可以自己寫這個密碼加密的算法了。如圖所示。
到此某app的登陸密碼加密參數p分析就算到此結束了。
分析某app的加密參數s
????????接下來就是本文的重點了,分析加密參數s的加密過程,還是一樣老套路,我們在jd-gui工具中搜索登陸請求包的一些關鍵參數如checktoken、device_id、skin等這些參數。我們看到某app的某包下的t.class文件如圖所示。
????????在這里我們可以看到s參數是經過s類的p方法獲取的值,之后我們點擊s類會發現該s.class并不能打開,那么我們怎么辦呢?難道我們就到此放棄了嗎?哈哈。當然不能,既然他的s.class文件我們看不到,那我們就看該s.class文件對應的s.smail文件,我們在smail文件中找到p方法,然后在該方法上打下斷點,一步步跟進,看看該s值是如何計算的,如圖所示。
????????接下來一樣,打開app點擊登陸會停在這個位置,我們F8跟進會執行到invoke-virtual {v0, p0}, Lcom/***/***/***Application;->calculateS(Ljava/lang/String;)Ljava/lang/String;
這里,之后我們F7跟進,會進入***Application類的calculateS方法,之后我們打開jd-gui找到***Application類的calculateS方法看看是個什么鬼,如圖所示。
我們會看到該方法用native修飾,顯然是一個so庫中的方法,我們在jd-gui中向上看找到該方法加載了哪個so庫,如圖所示。
????????從這段代碼我可以知道該類被加載的時候執行靜態代碼塊,然后動態加載utility SO庫,之后獲取s加密參數時,傳進一個字符串參數調用該so庫中的calculateS方法獲取最終的加密結果。到這里我們知道算法在so庫中了,那么我們接下來就是用IDA pro動態的去附加調試app的so代碼了。
IDA Pro附加調試SO
附加調試so文件大致流程如下:
1.? 首先找一根數據線,然后打開手機的usb開發者調試開關,連接上你的電腦,打開cmd命令窗口執行 adb devices 命令檢測設備是否連接,如圖所示。
出現如圖中的信息則代表手機連接成功。
2.之后找到IDA Pro 跟目錄下的 dbgsrv/android_server文件并執行 adb push android_server /data/local/tmp/android_server
命令將該文件上傳到手機終端上,如圖所示。
3.文件上傳成功后執行 adb shell連接手機終端 執行 su命令獲取手機root權限,然后進入/data/local/tmp目錄下,ls查看android_server 文件是否成功上傳。
????????如果android_server文件上傳成功,那么執行 chmod 777 android_server命令,給該文件賦值上最高權限,然后執行該文件,如圖所示。
執行成功會出現23946 這個端口信息,之后另外在打開一個cmd窗口,將手機終端的23946端口轉發到電腦上,執行命令adb forward tcp:23946 tcp:23946 如圖所示
4.打開IDA Pro工具找到菜單欄中的Debugger->Attach->Remote andro/Debugger選項,點擊確定,如圖所示。
之后出現如圖所示的手機進程列表,之后根據某app的包名,找到某App的進程點擊OK即可,如圖所示。
5.App附加成功,接下來找到我們要找的utility庫,在IDA Pro中知道模塊列表,并搜索utility庫。如圖所示。
雙擊打開,然后找到java中的calculateS方法。如圖所示。
雙擊該方法進入方法位置。????????
之后我們按F5 轉為c語言格式,然后在方法開始打上斷點。如圖所示。
6.在手機app上輸入賬號密碼,點擊登陸會發現該app會端在這個位置,之后我們就開始一步步調試,查看變量值,如圖所示。
執行到到這里我們就會發現該app是將登陸用戶名加密碼加一串固定的字符串拼接在了一起然后取md5的值得到如下結果。
7.拿到MD5值后然后分別按順序取1?5?2?10?17?9?25?27幾位置的數值組成最終的加密結果,最終返回給java代碼的中s參數發送出去
到此某app的p參數加密跟s參數的加密分析就到此結束了。
結果測試
我們找到p參數的加密方法,跟s參數的參數加密方法,接著就用java簡單的測試下結果
登陸成功ok,大功告成哈哈。
總結
整個逆向過程中遇到的問題有如下:
1.IDA Pro附加調試出現 Bogus or irresponsive remote server 錯誤,解決方案? 在adb shell中執行 setenforce 0 關閉selinux安全機制(需要root權限)