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

问题描述 投票:0回答:2

使用Python,我试图提取Android应用程序所做的API调用,因为它是.apk文件。

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

这是我到目前为止尝试/发现的内容....

我已经看到这个问题posted before但是无法按照(非常有限的)解决工作解决方案。

我知道有些工具如Cartographer可以实现这一点,但我无法让代码的相关部分工作。另一个工具CHABADA可以做到但不是开源的。

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

qazxsw poi询问如何解析API的smali文件,如下所示:

Another previous post

但这似乎不是一个有用的方法,因为 invoke-virtual {p0, v0}, Landroid/net/ConnectivityManager;->getNetworkInfo(I)Landroid/net/NetworkInfo; invoke-virtual并不总是指示API使用,并且解析smali文件比通过静态分析APK本身只提取被调用API的某种方式更重要的任务。

invoke-direct也被推荐但我没有看到它可以提取API调用的地方,而且它都是用Java编写的,而我一直在使用Python。

工具Dexlib2给了我使用的API密钥,但我不知道如何从中获取API名称。

有解决方案吗

更新#1

我使用Androguard按照@ShirishSingh生成.gexf格式的CFG,它可以给我以下面的节点:

API Key detector

我可以在上面看到<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使用的方法。但是,内部类还有许多其他方法节点。如何区分方法的节点与内部类,从其他库导入的节点到实际API调用的节点?

android python api apk static-analysis
2个回答
0
投票

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


0
投票

dx.get_classes()将返回所有类。然后,您可以检查标记为“EXTERNAL”的API调用。请参阅链接:Landroid

© www.soinside.com 2019 - 2024. All rights reserved.