Reverse Engineering破解Android NDK/JNI程式(*.so)

  • 18916
  • 0
  • 2014-09-21

摘要:Reverse Engineering破解Android NDK程式(*.so)

【本篇僅供教學用途】

為了要保護自己的Android App,開發者有時會把「付費註冊、序號處理、加解密」等重要的程式碼使用C/C++來撰寫,因為C/C++無法反編譯(或是沒有這麼簡單),只能反組譯,因此較難破解

要破解Java程式碼較簡單,只要熟悉dalvik bytecode就好了,參考資料:

  1. http://source.android.com/devices/tech/dalvik/dalvik-bytecode.html
  2. http://pallergabor.uw.hu/androidblog/dalvik_opcodes.html

 

但要破解C/C++程式碼其實也沒這麼難(若是程式的流程規劃不好,則破解C/C++甚至比破解Java簡單),以下是必要基礎或工具:

  1. 熟悉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
  2. IDA Pro 6.4或更新版本(逆向工程ARM組語用)
  3. Arm_Asm - slam80(如果不會將ARM指令集轉為hex,則該工具可以幫忙)
  4. Hex Editor Neo(修改hex用)

 

為什麼要破解呢?

 

破解的步驟大致上是:

  1. 取得apk中的.so(這就是由Android NDK/JNI編出來的程式)
  2. 使用IDA Pro找到關鍵點(以下是範例):
  3. 通常開發者要判斷「是否已註冊」或「是否正確」都會透過一個判斷式,若有判斷則會進行Branch指令,BEQ則代表condition是EQual的
  4. 找到對應的hex,如「CMP R0, #0」對應「00 28」,BEQ要進去的branch是當掉的判斷式,當然就可以將上一個指令「CMP R0, #0」改為「CMP R0, #1」,就不會進入判斷式或「就會進入付費版模式」  (僅舉例,實際情況依不同的.so而定)
  5. 透過工具算出hex為「01 28」
  6. 當然您也可以自己算hex,請參考:
  7. 使用Hex Editor NEO修改為新的hex,再儲存即可
  8. 把修改後的.so丟進去apk,再重新compile與sign
  9. 找到的修改點不一定正確,因此可能需要嘗試數次,若成功了就把關鍵點拿掉了