2017-03-05 37 views
0

當我在x86上對應用程序進行逆向工程時,可以在調試時獲取x86彙編代碼,例如,將EIP/RIP指向的操作碼拆分爲x86程序集。但是對於android應用程序,我總是需要提供某種源代碼才能使調試變得有用。我的問題是,而不是做一個apk反彙編,我可以得到我將實時調試的程序的java/smali代碼?換句話說,調試器可以像在x86上可以做的那樣「即時」拆卸代碼嗎?如何在調試android應用程序時獲取反彙編代碼?

我想要的原因是因爲當我使用APK的反彙編代碼時,我只能得到程序的靜態反彙編代碼,但如果該方法被鉤住了怎麼辦?

回答

0

我一直在倒退一段時間,我從來沒有遇到過Smali字節碼的實時調試工具。但是,當您有一些複雜的目標時,在我們的工具集中進行靜態和動態分析是非常有用的。這就是我的做法,它可能會幫助你。

  1. 首先使用Jadx反編譯dex文件並將Smali轉換爲Java。這樣你就可以對應用程序的基本知識有一個大致的瞭解。
  2. 如果應用程序使用本地代碼,您還可以從APK中的/ lib文件夾中提取庫並分析它們,但由於您的問題不是關於本地代碼,因此我將跳過此主題。
  3. 現在我們假設您發現了一些使用密鑰加密數據的神祕加密函數,但密鑰是動態生成的,您只需查看代碼即可得到它,您需要掛鉤方法!
  4. Android上我最喜歡的工具是Xposed。它是一個你在你的設備上安裝的框架(通常需要root),它允許你創建一個模塊,當你的目標應用程序被加載並掛接其任何方法(即使是系統方法)時,它將被加載。
  5. 比方說,神祕的密碼功能:使用String encrypt(String key, String data); Xposed我們可以做以下傾倒的關鍵是:
public void handleLoadPackage(final XC_LoadPackage.LoadPackageParam lpparam) throws Throwable { 
if (!lpparam.packageName.equals("com.target.app")) { 
     return; 
    } 

findAndHookMethod("com.target.app.CryptoClass", lpparam.classLoader, "encrypt", String.class, String.class, new XC_MethodHook() { 
     @Override 
     protected void beforeHookedMethod(MethodHookParam param) throws Throwable { 
      Log.i("TargetApp_Hook", "Secret Key: " + param.args[0].toString()); 
     } 
    }); 
  • 的關鍵將現在出現在你的設備logcat的。
  • 您可以使用Xposed方法前後勾取,替換方法,避免方法調用,直接使用您的代碼調用方法等等!還有一個名爲Frida的工具,可以讓您在同一時間掛接Java代碼,但也可以使用本地代碼,使用起來很簡單,而且所有內容都通過自定義JavaScript API進行封裝。但是,我發現Xposed更穩定。

    +0

    謝謝,xposed功能強大,但反向速度太慢。所以你的意思是,目前沒有工具可以即時反彙編Dalvik字節碼? –

    +0

    順便說一句,我不得不說,查看反編譯的java代碼是大多數情況下最好的方法,但我只想在這裏找到一個最動態和「可靠」的方法 –

    +0

    如果您能夠負擔IDA的專業版,一個將調試器附加到Android設備並調試Dalvik的模塊,但我不能說它是好的還是易於使用,因爲我從來沒有使用它。 – EquiFox