By Bob Pan 多線程
梆梆與愛加密都使用了將原有的dex隱藏, 在運行時解壓, 而且經過修改app的類加載器的方式實現加固. 參考: AndoridAPK反逆向解決方案:梆梆加固原理探尋 app
然而, 無論如何隱藏dex, 最終在運行時都必須釋放到內存, 因此本文的思路是從內存中找到解密後的dex文件, 進而獲得加固前的apk. 編輯器
愛加密的app並無作反調試的保護. 打開app以後直接使用gdb鏈接, 而後用gcore, 產生core dump. 工具
使用ps查看pid 加密
使用gdb鏈接pid .net
使用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. 從這個角度說, 愛加密和梆梆的加固形同虛設.