2017-03-05 76 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