【问题标题】:How can I extract API calls from an APK file?如何从 APK 文件中提取 API 调用?
【发布时间】:2018-07-09 20:34:55
【问题描述】:

使用 Python,我正在尝试提取 Android 应用程序发出的 API 调用,因为它是 .apk 文件。

有没有办法通过对其 APK 的静态分析来解析/提取包使用的 API 的名称?

这是我迄今为止尝试/发现的内容......

我已经看到了这个问题posted before,但无法遵循(非常有限的)有效解决方案的答案。

我知道有一些工具,例如 Cartographer 可以完成此任务,但我无法让代码的相关部分正常工作。另一个工具CHABADA 可以做到,但不是开源的。

我已经能够从 APK 中获取一些其他信息,例如使用 Androguard 的外部类,使用 APK Static AnalyzerAndroidManifest.xml 文件的组件,以及使用 Apktool,我可以将清单解码为一种可读的格式,还可以获取 smali 文件。

Another previous post 询问解析 API 的 smali 文件,来自以下行:

  invoke-virtual {p0, v0}, Landroid/net/ConnectivityManager;->getNetworkInfo(I)Landroid/net/NetworkInfo;

但这似乎不是一个有用的方法,因为 invoke-virtualinvoke-direct 并不总是指示 API 的使用情况,并且解析 smali 文件比有某种方法仅提取调用的 API 更繁重的任务通过静态分析 APK 本身。

Dexlib2 也被推荐了,但我看不出它可以在哪里提取 API 调用,而且它都是用 Java 编写的,而我一直在用 Python 工作。

API Key detector 工具为我提供了使用的 API 密钥,但我不知道如何从中获取 API 名称。

有什么解决办法吗?

更新 #1

我使用 Androguard 根据@ShirishSingh 生成 .gexf 格式的 CFG,它可以为我提供以下形式的节点:

<node id="0" label="Landroid/support/v4/widget/SearchViewCompatHoneycomb; newOnQueryTextListener (Landroid/support/v4/widget/SearchViewCompatHoneycomb$OnQueryTextListenerCompatBridge;)Ljava/lang/Object;">
<attvalues>
<attvalue id="1" value="Landroid/support/v4/widget/SearchViewCompatHoneycomb;"/>
<attvalue id="2" value="newOnQueryTextListener"/>
<attvalue id="3" value="(Landroid/support/v4/widget/SearchViewCompatHoneycomb$OnQueryTextListenerCompatBridge;)Ljava/lang/Object;"/>
<attvalue id="6" value="false"/>
</attvalues>
</node>

我可以在上面看到newOnQueryTextListener 是从Landroid 使用的方法。但是,内部类中还有许多其他方法节点。如何区分方法节点与内部类、从其他库导入的方法以及实际 API 调用的方法?

【问题讨论】:

  • 你需要控制流图吗?有一些方法可以从 APK 获取 API 调用。您需要整个 API 调用还是只需要包名/类名/方法名?
  • @ShirishSingh 我现在不需要控制流图,只要有被调用 API 的包/类/方法名称就会很有帮助。
  • 我可以推荐一些从 APK 生成 CFG 的工具,然后你可以编写一个脚本来从中提取 API 调用。这对你有用吗?
  • @ShirishSingh 那会很有帮助,是的,谢谢。理想情况下,我希望有某种轻量级工具可以在对 APK 进行静态分析后返回 API 名称,但如果首先生成 CFG 是最好的解决方案,那么是的,我会很感激你的建议!
  • 您可以在此处参考 Androguard:github.com/jrgifford/androguard。使用 androgexf.py 脚本生成 CFG。命令:androgexf.py -i -o

标签: android python api apk static-analysis


【解决方案1】:

我想在顶部发表评论,但由于我是堆栈新手,我不能。直接调用 Androguard 的 dx.get_methods() 不是更好吗?然后从那里检查?不创建文件CFG?

【讨论】:

    【解决方案2】:

    dx.get_classes() 将返回所有类。然后,您可以检查标记为“EXTERNAL”的 API 调用。见链接: Using the analysis object

    【讨论】:

      【解决方案3】:

      你可以使用apk-analyzer进行apk剖析。

      我在apkanalyzer dex packages [apk-file] 之前使用了以下命令。此命令的输出包含已定义/引用的包/类/方法/字段的所有详细信息。链接中给出了如何解析输出的详细信息。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多