我尝试使用 Python 提取 Android 应用程序进行的 API 调用,前提是它是 .apk 文件。
有没有办法通过对其 APK 的静态分析来解析/提取包所使用的 API 的名称?
这是我迄今为止尝试/发现的......
我看过这个问题posted before但一直无法遵循(非常有限的)可行解决方案的答案。
我知道有一些工具,例如 Cartographer除其他事项外完成此操作,但我无法使代码的相关部分正常工作。另一个工具 CHABADA可以做到,但不是开源的。
我已经能够从 APK 中获取一些其他信息,例如使用 Androguard 的外部类,AndroidManifest.xml
文件的组件使用 APK Static Analyzer ,并使用 Apktool ,我可以将 list 解码为可读格式,还可以获取 smali 文件。
Another previous post询问有关为 API 解析 smali 文件的问题,来自如下行:
invoke-virtual {p0, v0}, Landroid/net/ConnectivityManager;->getNetworkInfo(I)Landroid/net/NetworkInfo;
但这似乎不是一个有用的方法,因为 invoke-virtual
或 invoke-direct
并不总是指示 API 使用,解析 smali 文件是一个与如果有某种方法通过静态分析 APK 本身来提取调用的 API 相比,任务更重。
Dexlib2也有人推荐,但我看不到它在哪里可以提取 API 调用,而且它全部使用 Java,而我一直在使用 Python。
工具API Key detector给我使用的 API key ,但我不知道如何从中获取 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 调用的方法节点?
最佳答案
dx.get_classes() 将返回所有类。然后,您可以检查标记为“外部”的 API 调用。见链接: Using the analysis object
关于android - 如何从 APK 文件中提取 API 调用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51253619/