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

问题描述

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

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

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

目前我正在使用 DexBackedDexFile.getClasses() 从 dex 文件获取所有类并将它们全部解码为 smali 代码。然后在生成的 smali 代码搜索字符串。我可以通过这种方式找到我想要的方法,但是解码数千个类很耗时。所以我在想是否有一种快速方法来做到这一点。

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

解决方法

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

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

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

现代 Android 设备有 4-8 个内核,解码 DEX 方法是一个可以并行运行而无需同步任何内容的过程,因此您应该能够几乎获得加速,例如在 4 核系统上提高 400%。