前言
上篇说到对安卓APK反编译,本篇实现批量反编译和批量特征提取及计算,主要就是通过python代码与cmd进行批量化交互,我在写文章之前,尝试批量下载了安卓apk(大约10来个),发现现在这个应用软件不是一般的大啊,无奈电脑内存不太够,现仅将已下载10个apk作为示例展示。
1. 批量反编译
思路是这样:
第一步:调用cmd,读取指定路径下的文件,path+benign+k(k=1,2…n),进行反编译
第二步:结果就自动放到该文件夹目录下
出现的问题是os.system调用了cmd后立马又关闭,无法持续执行命令,看到文章windows系统如何使用python执行多条命令行命令
代码如下(我的cmd命令在pycharm中设定的就是malware_identification下):
def oper_cmd(apk):cmd_str = "cd ../restore & "+"apktool.bat d -f " + apkprint(cmd_str)return subprocess.Popen(cmd_str, shell=True, stdout=None, stderr=None).wait()
for i in range(1,11):apk = "benign" + str(i) + ".apk"oper_cmd(apk)
执行如下图,开始批量反编译:
批量反编译成功!
2. 单文件特征提取
看到xml标签项和属性值,假设我们需要提取的特征就是属性值的最后一个字符串。
直接上提取代码,这里用到了xml.dom和正则表达式:
# 获取xml文件当中某个标签的属性值
import re
from xml.dom.minidom import parsefrom character_handle.frequency_order import config_filexmldom = parse(config_file) # 加载XMLfor element in xmldom.getElementsByTagName("uses-permission"):a = element.getAttribute("android:name")b = re.findall(r'\w{1,}', a)[-1]print(b)
成功取出,同理,更改TagName也可以获取其他标签的属性值。
多做一步,计算特征属性值出现的频次:
# 获取xml文件当中某个标签的属性值
import re
from collections import Counter
from xml.dom.minidom import parsefrom character_handle.frequency_order import sample_get
def counter(arr):return Counter(arr)
xmldom = parse(sample_get.get_file("benign1")) # 加载XML
# 多做一步,将每个特征存储为一个list,然后count
list_uses_permission = []
for element in xmldom.getElementsByTagName("uses-permission"):a = element.getAttribute("android:name")b = re.findall(r'\w{1,}', a)[-1]list_uses_permission.append(b)
c = counter(list_uses_permission)
print(c)
3. 批量文件特征提取
# 批量获取多个文件夹中xml当中某个标签的属性值
import re
from collections import Counter
from xml.dom.minidom import parsefrom character_handle.frequency_order import sample_get
def counter(arr):return Counter(arr)
list_uses_permission = []
# 批量加载XML,并提取属性值
for i in range(1,11):xmldom = parse(sample_get.get_file("benign%d"%i))for element in xmldom.getElementsByTagName("uses-permission"):a = element.getAttribute("android:name")b = re.findall(r'\w{1,}', a)[-1]list_uses_permission.append(b)
c = counter(list_uses_permission)
print(c)
可以看到count函数已经帮助我们将频次顺序也归纳好了,这时候我们可以根据自己的需求去使用这些属性,end!
下一篇学习一下如何将这些属性值转化为特征值和特征向量进行处理。