如何使用 dex 文件中的字符串引用查找 java 方法

How to find a java method using a string reference from a dex file

我在 Android Studio 项目中使用 baksmali 和 dexlib2 库。我试图从 dex 文件中找到一个方法。在方法定义内部,其中一个方法主体语句中有一个唯一的字符串。我想以最快的方式找到那个方法。
例如:

public boolean A01() {
    ..........
    return tvar.quals("unique_string") ? false : true;
}

我想用这个"unique_string"找到这个方法。

目前我正在使用 DexBackedDexFile.getClasses() 从 dex 文件中获取所有 classes 并将它们全部解码为 smali 代码。然后在生成的smali代码中搜索字符串。我可以通过这种方式找到我想要的方法,但是解码数千个 class 非常耗时。所以我在想有没有什么快捷的方法。

有一种方法可以使用 DexBackedDexFile.getStringReferences() 从 dex 文件中快速获取字符串引用,其中 returns 一个 DexBackedStringReference 对象。我可以通过这种方式快速找到我想要的字符串引用,其中包含一个 stringIndex。我想知道是否有办法使用这个索引号找到方法。 谢谢

如果应用有多个 dex 文件,使用字符串 table 你知道要加载哪个 dex 文件,因此你可以减少搜索方法的数量。

不幸的是,除了在所有方法中搜索字符串引用解码之外,我认为没有其他方法。 Android 不需要从字符串池到所用方法的任何反向引用,因此它不以 dex 格式存在。

但是您可以通过将方法解码和搜索字符串引用分配到多个线程来加快搜索过程。 据我所知,在 baksmali 中使用的 Dex 解码库 dexlib2 根本不使用线程。

现代 Android 设备有 4-8 个核心,解码 DEX 方法是一个可以 运行 并行的过程,无需同步任何东西,因此你应该能够接近速度-向上例如在 4 核系统上提高 400%。