android - 如何从 APK 文件中提取 API 调用?

标签 android python api apk static-analysis

我尝试使用 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-virtualinvoke-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>

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

最佳答案

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

关于android - 如何从 APK 文件中提取 API 调用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51253619/

相关文章:

python - TK |制作 TTK 样式时图像 "pyimage1"不存在

python - 如何旋转等高线图的标签?

c# - C#中的开源视频手势识别库

api - Go - 中间件阻止每个请求的 MIME 类型

api - 如何通过 API 调用将 kibana(ELK 堆栈)中的数据导出为 CSV?

android - android中的pidstat命令?

android - MediaRecorder音频无法在计算机上播放

java - 广播接收器,在启动时检查复选框首选项状态,然后发送通知

c# - Unity 中的移动世界比例?

python - 如何将此 SQL 语句转换为 Python : MID? SUBSTRING?