0x00 場景
在測試某個app的時候,抓取數據包,發現某些參數存在被加密的情況,或者有簽名校驗的情況,這個時候如果我們想直接去篡改數據包的內容往往是做不到的,那就來看看抓取的某個app登錄數據包,如下所示,password字段明顯進行了加密:
接下來,就開始通過JEB對apk進行反編譯后動態調試定位關鍵加密函數。
0x01 對APP進行調試的前提
在Android系統中,如果需要調試Android應用程序,需要滿足以下兩個條件之一:
- apk配置文件AndroidManifest.xml中顯示的聲明了android:debuggable="true"。
- 在安卓系統的根目錄下的default.prop文件中ro.debuggable=1
對於上述的第一個可以調試android應用程序的條件,在android應用商店等下載的正式上架應用,通常不會遇到在AndroidMainfest中設置了android:debuggable="true"的情況,所以如果想要使用第一種方法,通常就需要對apk進行解包添加android:debuggable="true"再打包,隨着加殼軟件以及apk本身的校驗等防護措施,再重新打包apk的過程往往容易出現異常,不容易成功,而第二種調試的條件在手機發布時或者官方的原版rom包中,ro.debuggable=0,也就是說默認不允許調試的,可以通過刷機的方式或者臨時修改內存的方式進行修改:ro.debuggable=1
0x02 反編譯apk文件
打開反編譯工具JEB,直接將需要反編譯的apk(未加殼)文件拖到JEB中即可進行反編譯得到smali代碼和java偽代碼
等待一會兒,反編譯結束如下:
0x03 通過關鍵字搜索打斷點
根據截取到的登錄數據包中的參數關鍵字(mobile_tel、op_station、mobile_uuid、terminal_os、terminal_platform、terminal_device、password、channel)在JEB的反編譯文件Byecode中進行搜索,定位加密的關鍵函數的位置。
ctrl+F 開始進行搜索:
搜索到以下位置,不止一處位置類似與以下位置,將搜索到的此類似位置都打上斷點
將可能的位置都打上斷點過后,接着就開始進行調試了。
0x04 通過JEB調試找到加密函數位置
1、所有的斷點都下好過后,點擊調試按鈕,附上設備程序,開始調試,如下:
2、當將手機上運行的應用附上JEB過后,操作app至登錄界面,點擊登錄
如果剛才下的所有斷點當中存在正確的,則點擊登錄過后jeb會直接停在正確斷點位置,反正,沒有任何效果,說明斷點沒有打在正確的地方,需要重新搜索。
在調試過程當中,會提示程序沒有響應,記得點擊等待
3、在斷點處單擊右鍵選擇解析或者按tab鍵,跳轉到當前斷點位置的反編譯的java源碼處
發現password的值是由v0_2賦值而來
雙擊v0_2,跳轉到如下位置處,說明v0_2的值在onClick()函數中得到:
繼續在onClick()函數中找其他v0_2所在的位置
雙擊encrypt,跳轉到加密函數所在位置
通過分析,基本可以確定此處就為password字段加密的函數位置所在
接下來可以再通過下斷點加以確定,回到以下java源碼位置,再按tab或者解析回到此位置對應的smali代碼處並打下斷點:
重新點擊app應用的登錄,成功跳轉到調用加密函數的斷點位置,如下:
4、雙擊加密函數encrypt,進入加密函數所在位置,分析加密函數以便解密:
實現加密的函數如下:
實現解密的函數如下:
解密需要用到的相關密鑰被硬編碼如下:
5、最后根據加密函數中的填充模式,加密模式、密鑰,數據塊,偏移量信息通過在線網站解密
將數據包中抓取到的加密字段進行url轉碼過后解密如下,得到加密之前的原始密碼