國內apk加固的破解方法
By Bob Pan
國內的apk加固技術都使用了將原有的dex隱藏, 在運行時解壓, 並且通過修改app的類加載器的方式實現加固. 參考: AndoridAPK反逆向解決方案:bb加固原理探尋
然而, 不管如何隱藏dex, 最終在運行時都必須釋放到內存, 所以本文的思路是從內存中找到解密后的dex文件, 進而得到加固前的apk.
注意: 這個方法截止2014-07-29有效, 后續版本未測試. 由於dalvik的執行機制要求dex在內存中是連續的, 所以想辦法拿到內存的coredump總是不錯的選擇.
更新: 某公司會對名字為gdb的程序進行檢測, 請將gdb重命名, 比如hello.
注意: 如果gdb連不上對應的pid, 請嘗試連接/proc/[pid]/task/目錄下的tid
某公司
某公司加固的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.
更新: 拿到的事實上是一個odex文件, 里面會包含odex的指令. 通過一個修改過的baksmali處理后可以恢復原始的dex.
更新: 修復odex的方法,
1. 將系統的/system/framework目錄復制到本地的framework目錄
2. 運行baksmali -x -d framework abc.odex //將輸出smali文件到out目錄, 請盡量使用linux
3. 運行smali out -o classes.dex //重新制作dex
通過類名找string-data段
找到最近的dex文件頭(0x4f87a08)和dex文件大小0x07c0
使用dd摳出dex
這個文件是個完整的dex文件, 並且可以被dexdump直接打印
[注意: 部分內容已丟失]
總結
通過隱藏dex確實可以讓大部分靜態分析工具找不到執行代碼, 但是在動態運行的時候無可避免的需要將dex在內存中還原. 通過本文的方法分析其內存然后恢復dex, 更進一步可以完全恢復原始apk.