首页 文章

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

提问于
浏览
0

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

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

1 回答

  • 0

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

    • 首先使用Jadx反编译dex文件并将Smali转换为Java . 通过这种方式,您可以大致了解应用程序的基础知识 .

    • 如果应用程序使用本机代码,您还可以从APK中的/ lib文件夹中提取lib并分析它们,但由于您的问题与本机代码无关,因此我将跳过此主题 .

    • 现在让我们通过查看代码来获取它,你需要挂钩方法!

    • 我在Android上最喜欢的工具是Xposed . 它是您在设备上安装的框架(通常需要root),它允许您创建将在加载目标应用程序时加载的模块并挂钩其任何方法(甚至是系统方法) .

    • 让我们说神秘的加密函数是: 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更稳定 .

相关问题