近日分析某一款Android上面的手游,反編譯后再起asset目錄下可以看到加密過的腳本,lib目錄下發現lua的so 初步懷疑其使用lua腳本實現的
- 解密函數定位
- 動態跟蹤解密函數流程
- 靜態分析解密函數流程
- 編寫程序進行解密
lib目錄下so的名稱
1. 解密函數定位。
IDA加載SO,導出函數搜索關鍵字loadbuffer,定位到lua腳本加載的地方。Android so中使用lua腳本需使用loadbuffer函數進行加載該腳本。
2. 動態跟蹤解密函數流程。
啟動游戲后,動態調試該so,loadbuffer上一步的操作為其解密函數跟蹤分析。(最終跳轉的函數為bt_decrypt)
1.getFileData函數
2.doGetFileData
3.bt_decrypt函數
3. 靜態分析解密函數流程。
1.分析bt_decrypt函數,有明顯的頭部判斷操作。
分析其操作為讀取第八位后即1,左移兩位1<<2 == 4 在加40的位移 剛好4c對應的操作及函數_Z13decrypt_basicPhi
2.分析decrypt_basic函數,有過濾掉前32位無效操作以及讀取第九位作為偏移量進行函數操作。
偏移的函數列表
3.分析各個函數操作,以encrypt_hash_odd為例。(主要對HASH_BITS進行操作,步驟2中的解密最后需要改哈希表進行異或解密)
4.原理總結:讀取加密腳本的第九位判斷,使用對應偏移函數對哈希表前32字節進行操作,最后將修改的位數填充到哈希表128位。完成對哈希表的操作,使用該哈希表進行異或解密。
4.編寫解密程序解密腳本文件夾驗證
解密后結果可以直接看到lua源碼