【发布时间】:2018-07-09 20:34:55
【问题描述】:
使用 Python,我正在尝试提取 Android 应用程序发出的 API 调用,因为它是 .apk 文件。
有没有办法通过对其 APK 的静态分析来解析/提取包使用的 API 的名称?
这是我迄今为止尝试/发现的内容......
我已经看到了这个问题posted before,但无法遵循(非常有限的)有效解决方案的答案。
我知道有一些工具,例如 Cartographer 可以完成此任务,但我无法让代码的相关部分正常工作。另一个工具CHABADA 可以做到,但不是开源的。
我已经能够从 APK 中获取一些其他信息,例如使用 Androguard 的外部类,使用 APK Static Analyzer 的 AndroidManifest.xml 文件的组件,以及使用 Apktool,我可以将清单解码为一种可读的格式,还可以获取 smali 文件。
Another previous post 询问解析 API 的 smali 文件,来自以下行:
invoke-virtual {p0, v0}, Landroid/net/ConnectivityManager;->getNetworkInfo(I)Landroid/net/NetworkInfo;
但这似乎不是一个有用的方法,因为 invoke-virtual 或 invoke-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