愛加密和梆梆加固的破解方法
By Bob Pan
梆梆與愛加密都使用了將原有的dex隱藏, 在運行時解壓, 並且通過修改app的類加載器的方式實現加固. 參考: AndoridAPK反逆向解決方案:梆梆加固原理探尋
然而, 不管如何隱藏dex, 最終在運行時都必須釋放到內存, 所以本文的思路是從內存中找到解密后的dex文件, 進而得到加固前的apk.
愛加密
愛加密的app並沒有做反調試的保護. 打開app之后直接使用gdb連接, 然后用gcore, 產生core dump.
使用ps查看pid
使用gdb連接pid
使用gcore產生core dump
將產生的core.1033復制回電腦, 並使用編輯器打開, 通過類名找到dex中string-data段, 然后通過查找’dex.035’可以找到多離string-data最近的個dex頭. dex文件頭偏移32的整形值就是dex的文件長度. 使用dd命令可以從內存中摳出dex.
通過類名找string-data段
找到最近的dex文件頭(0x4f87a08)和dex文件大小0x07c0
使用dd摳出dex
這個文件是個完整的dex文件, 並且可以被dexdump直接打印
梆梆
梆梆加固的程序做了anti-ptrace, 表現為使用gdb --pid 連接不上對應的進程, 利用kernel-model打印ptrace的記錄, 可以看出梆梆
l 使用了3個進程互相ptrace.
l 發送錯誤指令來檢查ptrace是否被劫持(反回值是-3行, 嘗試讓1568進程繼續執行, 但是1568並未被ptrace, 必須出錯),
l 利用ptrace修改另一個進程的數據(action是5的行).
ptrace系統調用的記錄, 右邊是ptrace的參數
雖然連不上1552, 但是dalvik是一個多線程的程序, 里面包含主進程, gc線程, binder線程等, 雖然我們用gdb連不上主線程, 但是我們可以連上其他線程, 這些線程的tid在/proc/[pid]/task/目錄下.
Gdb連接任意一個tid
拿到coredump后與愛加密一樣做相同的處理, 可以拿到dex.
總結
愛加密和梆梆通過隱藏dex確實可以讓大部分靜態分析工具找不到執行代碼, 但是在動態運行的時候無可避免的需要將dex在內存中還原. 雖然梆梆做了反調試, 但是通過其他方式也同樣可以獲取其內存. 通過本文的方法分析其內存然后恢復dex, 更進一步可以完全恢復原始apk. 從這個角度說, 愛加密和梆梆的加固形同虛設.