一、安装
进入网址Apktool
windows照着下载 配置好环境变量就好
二、APK解压
直接解压 获得主要文件 均是编译后文件 无法查看
- AndroidManifest.xml 程序配置文件
- classed.dex 编译后的文件 反编译可以获得smali后缀文件 即Dalvik寄存器语言
- resources.arsc 二进制资源文件
使用Apktool 修改路径到apk文件目录下
apktool d xxx.apk
获得的文件可读 原始代码文件
对classes.dex文件进行反编译
获得smali文件夹:*.smali后缀文件由Dalvik指令组成
smali具体介绍 见smali文件
三、Smali构建Call Graph
- 新建nx.Graph对象
- 解析smali文件夹中所有.smali后缀文件 构建节点和边,添加到图形中‘
- 遍历处理完成所有smali文件后,完成Call Graph的构建
import fnmatch
import os
import matplotlib.pyplot as plt
import networkx as nx
apk = r"E:\system\桌面\1\smali"
graph = nx.DiGraph()
for dirpath,dirs,files in os.walk(apk):
print(dirpath)
print(dirs)
print(files)
for filename in fnmatch.filter(files,'*.smali'):
with open(dirpath+'\\'+ filename,'r',encoding='utf8') as f:
data = f.readlines()
caller_class = ''
caller_method = ''
for line in data:
line = line.strip()
line_list = line.split()
if line.startswith(".class") and len(line_list) > 1:
caller_class = line_list[-1]
elif line.startswith(".method") and len(line_list) > 1:
caller_method = caller_class + '->' + line_list[-1]
elif line.startswith(".end method"):
caller_method = ''
elif line.startswith("invoke-") and len(line_list) > 1:
callee_method = line_list[-1]
if caller_method != '':
graph.add_edge(caller_method, callee_method)
nx.draw(graph, node_size=30, with_labels=False)
plt.show()
运行结果: