12306 2.2版本SO的分析和修復

     這篇文章純粹屬於安全分析研究,請勿用於非法用途。如有侵犯到廠家,請告知作者刪除

   老早寫的,現在已經2.3版本了,把這個放出來,這個方法要比之前的簡單很多。

      12306的so加載順序是先libDexHelper.so後libcheckcode.so

      一、修復libDexHelper.so

      我們先把libDexHelper.so dump出來,並修復,修復後的IDA分析結果如下圖:


libDexHelper.so修復好後,備用,後面需要用到這個so來輔助分析。

二、修復libcheckcode.so

先dump出libcheckcode.so

之前在_mmap2函數上dump出原始libcheckcode.so方式2.2版本已經無效了,

那麼這次我們就直接等功能已經跑起來後,直接把libcheckcode.so內存dump出來

把這個dump用修復工具修復

三個關鍵的函數checkcoode,decheckcode,JNI_Onload,如下圖所示




IDA分析結果都是arm指令集,但是JNI_OnLoad後面接着的函數卻是thumb指令集,很顯然,這裏其實被故意改了函數的偏移。那麼偏移了多少呢?

    對dlsym進行HOOK,輸出如下:



JNI_OnLoad的地址是0x525a3d11-0x52585000=0x1ED11

跟IDA分析出的0x1ED50相差了0x3F

把0x1ed10指向的地址分析爲函數,如下圖所示,已經是正常的函數了:


checkcode和decheckcode兩個函數則不行,因爲這兩個函數是處於加密狀態

checkcode和decheckcode兩個函數是動態加解密的,該函數運行前被解密,運行完後又加密回去。

那麼解密點,就要找到這個動態加解密的位置。




把590c3000-100__Java_com_MobileTicket_CheckCodeUtil_checkcode.dmp文件用IDA打開(指定爲arm指令集)


libDexHelper.so的基址是0x51a25000,則可以計算出解密函數地址是0x51a4c305-0x51a25000=0x27305,加密函數是0x51a4c2ed-0x51a25000=0x272ed

解密函數:


在這裏的解密函數上進行hook,等其解密完後,把libcheckcode.so dump出來即可。

因爲這裏有兩個函數decheckcode和checkcode,所以需要dump兩次。

可以在解密函數裏通過輸入長度的大小不同來分別dump

 

將直接dlopen完dump出的libcheckcode.so和解密函數執行完dump出來的進行二進制比較,可以看到有一部分是不一樣的,不一樣的地方,就是被解密的函數。


那麼剩下的工作就是把這兩個解密後的函數二進制,寫個覆蓋到dlopen完的dump上,即可。這個工作可以用腳本來實現。

 

剩下需要修復的工作是:

1.把JNI_OnLoad、checkcode、decheckcode三個函數地址減去0x3f

2.修復so,使其可以正常運行

3.把init_proc函數去掉,不讓其再進行解密


(創建了一個Android逆向分析羣,歡迎有興趣的同學加入,羣號碼:376745720)

0


發佈了36 篇原創文章 · 獲贊 55 · 訪問量 34萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章