使用Python,我试图提取Android应用程序所做的API调用,因为它是.apk文件。
有没有办法通过静态分析其APK来解析/提取包使用的API的名称?
我已经看到这个问题posted before但是无法按照(非常有限的)解决工作解决方案。
我知道有些工具如Cartographer可以实现这一点,但我无法让代码的相关部分工作。另一个工具CHABADA可以做到但不是开源的。
我已经能够从APK获得一些其他信息,例如使用Androguard的外部类,使用AndroidManifest.xml
的APK 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名称。
有解决方案吗
我使用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调用的节点?
我想在顶部发表评论,但由于我是新的筹码,我不能。调用Androguard的dx.get_methods()不是更好吗?然后从那里检查?没有创建文件CFG?
dx.get_classes()将返回所有类。然后,您可以检查标记为“EXTERNAL”的API调用。请参阅链接:Landroid