Apktool反编译工具 获得smali 构建Call Graph

一、安装

进入网址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

  1. 新建nx.Graph对象
  2. 解析smali文件夹中所有.smali后缀文件 构建节点和边,添加到图形中‘
  3. 遍历处理完成所有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()

运行结果:
在这里插入图片描述

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值