摘要:Reverse Engineering破解Android NDK程式(*.so)
【本篇僅供教學用途】
為了要保護自己的Android App,開發者有時會把「付費註冊、序號處理、加解密」等重要的程式碼使用C/C++來撰寫,因為C/C++無法反編譯(或是沒有這麼簡單),只能反組譯,因此較難破解
要破解Java程式碼較簡單,只要熟悉dalvik bytecode就好了,參考資料:
- http://source.android.com/devices/tech/dalvik/dalvik-bytecode.html
- http://pallergabor.uw.hu/androidblog/dalvik_opcodes.html
但要破解C/C++程式碼其實也沒這麼難(若是程式的流程規劃不好,則破解C/C++甚至比破解Java簡單),以下是必要基礎或工具:
- 熟悉ARM指令集(https://www.tenlong.com.tw/items/1558608745?item_id=22049),Good Tutorial for ARM Assembly: http://www.eggwall.com/2011/09/android-arm-assembly-device-set-up-part.html
- IDA Pro 6.4或更新版本(逆向工程ARM組語用)
- Arm_Asm - slam80(如果不會將ARM指令集轉為hex,則該工具可以幫忙)
- Hex Editor Neo(修改hex用)
為什麼要破解呢?
- 因為廠商會想到要這樣防禦:http://www.youtube.com/watch?v=vAlxp1H1IxA
破解的步驟大致上是:
- 取得apk中的.so(這就是由Android NDK/JNI編出來的程式)
- 使用IDA Pro找到關鍵點(以下是範例):
- 通常開發者要判斷「是否已註冊」或「是否正確」都會透過一個判斷式,若有判斷則會進行Branch指令,BEQ則代表condition是EQual的
- 找到對應的hex,如「CMP R0, #0」對應「00 28」,BEQ要進去的branch是當掉的判斷式,當然就可以將上一個指令「CMP R0, #0」改為「CMP R0, #1」,就不會進入判斷式或「就會進入付費版模式」 (僅舉例,實際情況依不同的.so而定)
- 透過工具算出hex為「01 28」
- 當然您也可以自己算hex,請參考:
- 使用Hex Editor NEO修改為新的hex,再儲存即可
- 把修改後的.so丟進去apk,再重新compile與sign
- 找到的修改點不一定正確,因此可能需要嘗試數次,若成功了就把關鍵點拿掉了