如何在调试android应用程序时获取反汇编代码?

时间:2017-03-05 19:10:12

标签: debugging adb

当我在x86上对应用程序进行逆向工程时,我可以在调试时获得x86汇编代码,例如:将EIP / RIP指向的操作码反汇编为x86汇编。但是对于android应用程序,我总是需要提前使用某种源来使调试有用。我的问题是,我可以获得我实时调试的程序的java / smali代码,而不是对apk进行反汇编吗?换句话说,调试器可以反汇编"动态的代码就像它在x86上可以做的一样?

我想要的原因是因为当我使用APK的反汇编代码时,我只获得程序的静态反汇编代码,但如果方法被挂钩怎么办?

1 个答案:

答案 0 :(得分:0)

我已经反转了一段时间,我从来没有遇到过Smali字节码的实时调试工具。但是,当您拥有一些复杂的目标时,在我们的工具集中同时进行静态和动态分析非常有用。我就是这样做的,它可能会帮到你。

  1. 首先使用Jadx反编译dex文件并将Smali转换为Java。通过这种方式,您可以全面了解应用程序的基础知识。
  2. 如果应用程序使用本机代码,您还可以从APK中的/ lib文件夹中提取lib并进行分析,但由于您的问题与本机代码无关,因此我将跳过此主题。
  3. 现在假设您发现了一些使用密钥加密数据的神秘加密函数,但密钥是动态生成的,您只需查看代码就无法获取它,您需要挂钩方法!
  4. 我在Android上最喜欢的工具是Xposed。它是您在设备上安装的框架(通常需要root),它允许您创建将在加载目标应用程序时加载的模块并挂钩其任何方法(甚至是系统方法)。
  5. 让我们说神秘的加密函数是:String encrypt(String key, String data);使用Xposed,我们可以执行以下操作来转储密钥:
  6. 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());
            }
        });
    
    1. 密钥现在将显示在您的设备logcat中。
    2. 你可以使用Xposed在方法之前和之后挂钩,替换方法,避免方法调用,直接使用你的代码调用方法等等!还有一个名为Frida的工具,它允许您同时挂钩Java代码以及本机代码,它易于使用,并且所有内容都通过其自定义Javascript API进行包装。但是,我发现Xposed更稳定。