使用Python,我试图提取Android应用程序发出的API调用,因为它是.apk文件。在
有没有一种方法可以通过对APK的静态分析来解析/提取包所使用的api的名称?在
以下是我迄今为止尝试/发现的
我见过这个问题posted before,但还没能从(非常有限的)答案中找到一个可行的解决方案。在
我知道有一些工具,比如Cartographer可以完成这项工作,但是我还不能让代码的相关部分正常工作。另一个工具CHABADA可以做到,但不是开源的。在
我已经能够从apk获得一些其他信息,例如使用Androguard的外部类,AndroidManifest.xml文件的组件使用APK Static Analyzer,并且使用{a6},我可以将清单解码为可读格式,还可以获得smali文件。在
Another previous post询问如何解析smali文件中的api,内容如下:invoke-virtual {p0, v0}, Landroid/net/ConnectivityManager;->getNetworkInfo(I)Landroid/net/NetworkInfo;
但是这似乎不是一个有用的方法,因为invoke-virtual或{}并不总是指示API的用法,解析smali文件比通过静态分析APK本身来提取调用的API的任务更重。在
Dexlib2也被推荐使用,但我不知道它在哪里可以提取API调用,而且都是用Java编写的,而我一直在Python中工作。在
工具API Key detector提供了所使用的API密钥,但我不知道如何从中获取API名称。在
有什么解决办法吗?在
更新#1
我使用Androguard按照@ShirishSingh生成.gexf格式的CFG,它可以给我以下形式的节点:
^{pr2}$
我可以在上面看到newOnQueryTextListener是一个使用Landroid的方法。然而,还有许多来自内部类的方法节点。如何区分方法的节点与内部类、从其他库导入的节点、以及那些实际的API调用?在