|
本帖最后由 adopi 于 2023-3-22 20:23 编辑
原文链接:[系统安全] 四十五.恶意软件分析 (2)静态分析Capa经典工具批量提取特征和ATT&CK技战术
文章目录:
一.恶意软件分析与Capa四.总结
1.静态特征
2.动态特征
3.Capa简介
二.批量提取静态特征
1.数据集描述
2.文件遍历
3.CAPA批量提取静态特征
4.超时判定
三.提取Json文件API特征和ATT&CK技战术
1.读取单个Json文件内容
2.Json格式分析
3.利用jsonsearch提取ATT&CK特征
4.利用jsonsearch提取API特征
5.文件存储
四.总结
作者的github资源:
逆向分析:
https://github.com/eastmountyxz/SystemSecurity-ReverseAnalysis
网络安全:
https://github.com/eastmountyxz/NetworkSecuritySelf-study
声明:作者本人坚决反对利用教学方法进行犯罪的行为,一切犯罪行为必将受到严惩,绿色网络需要我们共同维护,更推荐大家了解它们背后的原理,更好地进行防护。(参考文献见后)
一.恶意软件分析与Capa
恶意软件或恶意代码分析通常包括静态分析和动态分析。特征种类如果按照恶意代码是否在用户环境或仿真环境中运行,可以划分为静态特征和动态特征。
那么,如何提取恶意软件的静态特征或动态特征呢? 因此,第一部分将简要介绍静态特征和动态特征。
1.静态特征
没有真实运行的特征,通常包括:
-字节码:二进制代码转换成了字节码,比较原始的一种特征,没有进行任何处理
-IAT表:PE结构中比较重要的部分,声明了一些函数及所在位置,便于程序执行时导入,表和功能比较相关
-Android权限表:如果你的APP声明了一些功能用不到的权限,可能存在恶意目的,如手机信息
-可打印字符:将二进制代码转换为ASCII码,进行相关统计
-IDA反汇编跳转块:IDA工具调试时的跳转块,对其进行处理作为序列数据或图数据
-常用API函数
-恶意软件图像化
-静态特征提取方式:
CAPA
– https://github.com/mandiant/capa
-IDA Pro
-安全厂商沙箱
2.动态特征
相当于静态特征更耗时,它要真正去执行代码。通常包括:
– API调用关系:比较明显的特征,调用了哪些API,表述对应的功能
– 控制流图:软件工程中比较常用,机器学习将其表示成向量,从而进行分类
– 数据流图:软件工程中比较常用,机器学习将其表示成向量,从而进行分类
动态特征提取方式:
Cuckoo
– https://github.com/cuckoosandbox/cuckoo
CAPE
– https://github.com/kevoreilly/CAPEv2
安全厂商沙箱
3.Capa简介
Capa是FireEye(Mandiant)公司开源的静态分析工具,旨在检测和识别恶意软件的高级静态行为,同时支持IDA插件操作和安装服务及HTTP通信,方便安全人员快速定位恶意代码,且能与ATT&CK框架和MBC映射。
通常能分析的样本格式:
PE文件
ELF文
.NET模块
ShellCode文件
下载地址:
https://github.com/mandiant/capa
https://github.com/fireeye/capa
该工具运行结果如下所示,它能有效反映恶意软件在ATT&CK框架中的技战术特点,比如:DEFENSE EVASION、DISCOVERY、EXECUTION、EXFILTRATION、PERSISTENCE等。
二.批量提取静态特征
在使用Capa提取静态特征过程中,通常会遇到一个问题——如何利用Capa批量提取恶意软件的静态特征。
1.数据集描述
假设存在如下图所示的数据集,利用capa.exe提取的结果将存储在result文件夹中。
dataset:
result:
capa.exe
2.文件遍历
假设数据集“dataset”中存在不同组织的恶意软件,我们首先要解决的是遍历文件并提取一个恶意软件的静态特征,其关键代码如下:
- #coding: utf-8
- #By:Eastmount CSDN 2023-03-14
- import os
- def getAllFiles(targetDir):
- listFiles = os.listdir(targetDir)
- return listFiles
- apt_path = r"D:\capa\dataset"
- apt_name = ['AAAA','BBBB','CCCC','DDDD']
- i = 0
- while i<len(apt_name):
- file_name = apt_path + "\" + str(apt_name[i])
- print(file_name)
- files = getAllFiles(file_name)
- #创建输出文件夹
- write_path = r"D:\capa\result"
- write_name = write_path + "\" + str(apt_name[i])
- print(write_name)
- if not os.path.exists(write_name):
- os.mkdir(write_name)
- #循环提取静态特征
- for name in files:
- peName = file_name + "\" + name
- print(peName)
- name = os.path.splitext(name)[0]
- jsonName = write_name + "\" + name + ".json"
- print(jsonName)
- break
- i += 1
- break
复制代码
输出结果如下所示,成功定位需要静态分析的样本,并创建要生成的目标Json文件。此时尚未分析恶意软件,生成的json文件为空。
-目标文件:D:\cape\dataset\APTXX\02ddd…9ff.bin
-生成文件:D:\cape\dataset\APTXX\02ddd…9ff.json
3.CAPA批量提取静态特征
接着定义函数提取静态特征,关键函数如下:
- def runCAPA(peName,jsonName):
- cmd = "cd D://capa & capa.exe -vv " + str(peName) + " -j > " + jsonName
- print(cmd)
- os.system(cmd)
复制代码
如果需要暂停则构建的CMD命令为:
- cmd = "cd D://capa & capa.exe -vv " + str(peName) + " -j > " + jsonName + " & cmd"
复制代码
尝试提取一个样本的特征,比如HGZ木马。
查看对应的json文件,内容如下:
格式化显示Json文件。
自此,成功利用CAPA提取一个样本的静态特征,下图显示ATT&CK和关键API特征。
此时的代码如下,能批量提取恶意软件的静态特征并生成对应的Json文件。
- #coding: utf-8
- #By:Eastmount CSDN 2023-03-14
- import os
- def getAllFiles(targetDir):
- listFiles = os.listdir(targetDir)
- return listFiles
- def runCAPA(peName,jsonName):
- #cmd = "cd D://capa & capa.exe -vv " + str(peName) + " -j > " + jsonName + " & cmd"
- cmd = "cd D://capa & capa.exe -vv " + str(peName) + " -j > " + jsonName
- print(cmd)
- os.system(cmd)
- apt_path = r"D:\capa\dataset"
- apt_name = ['AAAA','BBBB','CCCC','DDDD']
- i = 0
- while i<len(apt_name):
- file_name = apt_path + "\" + str(apt_name[i])
- print(file_name)
- files = getAllFiles(file_name)
- #创建输出文件夹
- write_path = r"D:\capa\result"
- write_name = write_path + "\" + str(apt_name[i])
- print(write_name)
- if not os.path.exists(write_name):
- os.mkdir(write_name)
- #循环提取静态特征
- for name in files:
- peName = file_name + "\" + name
- print(peName)
- name = os.path.splitext(name)[0]
- jsonName = write_name + "\" + name + ".json"
- print(jsonName)
- runCAPA(peName,jsonName)
- i += 1
复制代码
4.超时判定
然而,某些文件由于过大或格式错误,会导致分析过长或卡主。因此需要构建超时判定。
设置超时判定的方法很多,本文主要利用func_timeout实现。其安装命令如下:
此时的完整代码如下:
- #By:Eastmount CSDN 2023-03-14
- #coding: utf-8
- import os
- import time
- from func_timeout import func_timeout
- from func_timeout import FunctionTimedOut
- from multiprocessing import Process
- def getAllFiles(targetDir):
- listFiles = os.listdir(targetDir)
- return listFiles
- def runCAPA(peName,jsonName):
- #cmd = "cd D://capa & capa.exe -vv " + str(peName) + " -j > " + jsonName + " & cmd"
- cmd = "cd D://capa & capa.exe -vv " + str(peName) + " -j > " + jsonName
- print(cmd)
- os.system(cmd)
- #超时判定
- def mytest(peName,jsonName):
- runCAPA(peName,jsonName)
-
- apt_path = r"D:\capa\dataset"
- apt_name = ['AAAA','BBBB','CCCC','DDDD']
- i = 0
- while i<len(apt_name):
- file_name = apt_path + "\" + str(apt_name[i])
- print(file_name)
- files = getAllFiles(file_name)
- #创建输出文件夹
- write_path = r"D:\capa\result"
- write_name = write_path + "\" + str(apt_name[i])
- print(write_name)
- if not os.path.exists(write_name):
- os.mkdir(write_name)
- #循环提取静态特征
- for name in files:
- peName = file_name + "\" + name
- print(peName)
- name = os.path.splitext(name)[0]
- jsonName = write_name + "\" + name + ".json"
- print(jsonName)
-
- #超时判定
- try:
- func_timeout(10, mytest, args=(peName,jsonName, ))
- except FunctionTimedOut as e:
- print(e)
- print('子程序超时')
- print("-----------------------------\n\n")
- i += 1
- break
复制代码
运行结果如下图所示,样本较多时可以利用该方式提取静态特征。注意,该方法可能存在不足之处,还请读者自己完善和修改。
三.提取Json文件API特征和ATT&CK技战术
接下来,我们需要提取Json文件中的关键特征,常见的特征即:
-API函数特征
-ATT&CK技战术
1.读取单个Json文件内容
关键代码如下所示:
-02d9xxxxxxxe9ff.json
- #coding:utf-8
- #By:Eastmount CSDN 2023-03-14
- import os
- import json
- def getAllFiles(targetDir):
- listFiles = os.listdir(targetDir)
- return listFiles
- apt_path = r"D:\capa\result"
- apt_name = ['AAAA']
- i = 0
- while i<len(apt_name):
- file_name = apt_path + "\" + str(apt_name[i])
- print(file_name)
- files = getAllFiles(file_name)
- for name in files:
- jsonName = file_name + "\" + str(name)
- print(jsonName)
- #打开json文件
- with open(jsonName) as fp:
- data = json.load(fp)
- print(data)
- break
- i += 1
- break
- 输出结果如下图所示:
- 图片
- 2.Json格式分析
- Capa工具生成的Json文件主要由meta和rules两大块内容组织,其中,静态行为及API特征在rules部分。接下来尝试解析Json文件。
- print(data.keys())
- # dict_keys(['meta', 'rules'])
- 图片
- 该部分的关键代码如下:
- #coding:utf-8
- #By:Eastmount CSDN 2023-03-14
- import os
- import json
- def getAllFiles(targetDir):
- listFiles = os.listdir(targetDir)
- return listFiles
- apt_path = r"D:\capa\result"
- apt_name = ['AAAA']
- i = 0
- while i<len(apt_name):
- file_name = apt_path + "\" + str(apt_name[i])
- print(file_name)
- files = getAllFiles(file_name)
- for name in files:
- jsonName = file_name + "\" + str(name)
- print(jsonName)
- #打开json文件
- with open(jsonName) as fp:
- data = json.load(fp)
- #print(data)
- print(data.keys())
- #dict_keys(['meta', 'rules'])
- #包含meta和rules两大块内容 静态行为及API在rules部分
- #提取ATT&CK特征
- behavior = data["rules"]
- print(behavior)
- break
- i += 1
- break
复制代码
输出结果如下图所示:
对应于Json文件内容,共包括34个API特征。如下图所示:
同时该样本存在8个ATT&CK攻击行为,当然也有缺失的情况。
Capa匹配规则及参数解析:
(1) namespace:表示命名空间,即匹配规则文件的位置;
(2) authors:提供规则的作者,读者可以尝试构建适用于研究领域的规则;
(3) attack包括战术(tactic)、技术(technique)、子技术(subtechnique)和序号,与ATT&CK框架对应。
逃逸行为如下图所示:
此时大家会遇到一个问题:
Json是经典的数据格式,但如果想要提取Json数据中的某个键内容,就必须要一层层往递归下去才能拿到,如果层次非常多的话,将会非常的麻烦。比如随意编写的JSON内容,想要提取某个值会非常困难,在获取请求的数据时,数组内容的数据可能会不同,无法准确定位到底是哪个目录,如果后期目录修改,甚至需要重新修改操作目录。那么,如何解决呢?本文利用Jsonsearch来提取制定键值内容。
推荐文献:python中如何对复杂的json数据快速查找key对应的value值(使用JsonSearch包)
3.利用jsonsearch提取ATT&CK特征
首先,安装jsonsearch。
jsonsearch的具体实现过程请读者自行学习,本文仅给出提取ATT&CK和API关键特征的重要代码,如下所示:
- #coding:utf-8
- #By:Eastmount CSDN 2023-03-14
- import os
- import json
- from jsonsearch import JsonSearch
- def getAllFiles(targetDir):
- listFiles = os.listdir(targetDir)
- return listFiles
- apt_path = r"D:\capa\result"
- apt_name = ['AAAA']
- i = 0
- while i<len(apt_name):
- file_name = apt_path + "\" + str(apt_name[i])
- print(file_name)
- files = getAllFiles(file_name)
- for name in files:
- jsonName = file_name + "\" + str(name)
- print(jsonName)
- #打开json文件
- with open(jsonName) as fp:
- data = json.load(fp)
- #print(data)
- print(data.keys())
- #dict_keys(['meta', 'rules'])
- #包含meta和rules两大块内容 静态行为及API在rules部分
- #提取ATT&CK特征
- behavior = data["rules"]
- print(behavior)
- #查找attack对应的所有值
- jsondata = JsonSearch(object=behavior, mode='j')
- attack = jsondata.search_all_value(key='attack')
- print(attack)
- print(len(attack))
- for n in attack:
- if len(n)>0:
- print(n,type(n))
- break
- i += 1
- break
复制代码
输出结果如下所示:
- [
- [{'parts': ['Defense Evasion', 'Obfuscated Files or Information'], 'tactic': 'Defense Evasion', 'technique': 'Obfuscated Files or Information', 'subtechnique': '', 'id': 'T1027'}],
- [],
- [],
- [{'parts': ['Execution', 'Shared Modules'], 'tactic': 'Execution', 'technique': 'Shared Modules', 'subtechnique': '', 'id': 'T1129'}],
- [],
- [],
- [],
- []
- ]
复制代码
接着我们还需要提取ATT&CK对应的四部分内容,包括战术(tactic)、技术(technique)、子技术(subtechnique)和序号。
最后分别提取tactic、technique和id内容,并存储至指定列表中。完整代码如下所示:
- #coding:utf-8
- #By:Eastmount CSDN 2023-03-14
- import os
- import json
- from jsonsearch import JsonSearch
- def getAllFiles(targetDir):
- listFiles = os.listdir(targetDir)
- return listFiles
- apt_path = r"D:\capa\result"
- apt_name = ['AAAA']
- apt_list = [] #组织名称
- pe_md5_list = [] #恶意软件文件名称
- tactic_list = [] #攻击ATT&CK框架Tactic
- technique_list = [] #攻击ATT&CK框架Technique
- id_list = [] #攻击ATT&CK框架类别
- i = 0
- while i<len(apt_name):
- file_name = apt_path + "\" + str(apt_name[i])
- print(file_name)
- apt_list.append("AAAA")
- files = getAllFiles(file_name)
- for name in files:
- jsonName = file_name + "\" + str(name)
- print(jsonName)
- pe_md5_list.append(jsonName)
- #打开json文件
- with open(jsonName) as fp:
- data = json.load(fp)
- #print(data)
- print(data.keys())
- #dict_keys(['meta', 'rules'])
- #包含meta和rules两大块内容 静态行为及API在rules部分
- #提取ATT&CK特征
- behavior = data["rules"]
- print(behavior)
- #查找attack对应的所有值
- jsondata = JsonSearch(object=behavior, mode='j')
- attack = jsondata.search_all_value(key='attack')
- print(attack)
- print(len(attack))
- #提取tactic、technique和id
- tactic_str = ""
- technique_str = ""
- id_str = ""
- for n in attack:
- if len(n)>0:
- #print(n,type(n))
- value = n[0]
- print(value,type(value))
- tactic_str += str(value['tactic']) + ";"
- technique_str += str(value['technique']) + ";"
- id_str += str(value['id']) + ";"
- else:
- print("over!!!")
- print(tactic_str, technique_str, id_str)
- tactic_list.append(tactic_str)
- technique_list.append(technique_str)
- id_list.append(id_str)
- break
- i += 1
- break
复制代码
输出结果如下图所示,8个对应上图查询的ATT&CK数字一致,并且存在空值情况。
- <font face="Tahoma"><font size="3">dict_keys(['meta', 'rules'])
- [[{'parts': ['Defense Evasion', 'Obfuscated Files or Information'], 'tactic': 'Defense Evasion',
- 'technique': 'Obfuscated Files or Information', 'subtechnique': '', 'id': 'T1027'}], [], [],
- [{'parts': ['Execution', 'Shared Modules'], 'tactic': 'Execution', 'technique':
- 'Shared Modules', 'subtechnique': '', 'id': 'T1129'}], [], [], [], []]
- </font></font>
- <font face="Tahoma"><font size="3">8
- {'parts': ['Defense Evasion', 'Obfuscated Files or Information'], 'tactic': 'Defense Evasion',
- 'technique': 'Obfuscated Files or Information', 'subtechnique': '', 'id': 'T1027'} <class 'dict'>
- {'parts': ['Execution', 'Shared Modules'], 'tactic': 'Execution', 'technique': 'Shared Modules',
- 'subtechnique': '', 'id': 'T1129'} <class 'dict'>
- over!!!
- Defense Evasion;Execution; Obfuscated Files or Information;Shared Modules; T1027;T1129;
- </font></font>
复制代码 4.利用jsonsearch提取API特征
同样的方法提取恶意软件的API特征,第一个api也是位于rules位置,即通过CAPA工具的规则匹配提取关键静态特征。
需要注意,api位于子节点下面的内容,直接用下列代码返回空值。
- jsondata = JsonSearch(object=behavior, mode='j')
- api = jsondata.search_all_value(key='api')
- print(api)
- print(len(api))
复制代码
通过“matches”来匹配。
关键代码如下:
- jsondata = JsonSearch(object=behavior, mode='j')
- api = jsondata.search_all_value(key='matches')
复制代码
但返回内容仍然有较多的键值迭代。
因此,作者直接对其进行字符串匹配处理。
- #采用关键词匹配
- #'node': {'feature': {'type': 'api', 'api': 'CreateFile'}, 'type': 'feature'}
- api = str(api)
- print(api)
- start = api.find("'api':")
- api_lin = api[start+8:]
- end = api_lin.find("'},")
- print(api_lin[:end])
复制代码
输出结果如下图所示:
完整代码如下所示:
- #coding:utf-8
- #By:Eastmount CSDN 2023-03-14
- import os
- import json
- from jsonsearch import JsonSearch
- def getAllFiles(targetDir):
- listFiles = os.listdir(targetDir)
- return listFiles
- apt_path = r"D:\capa\result"
- apt_name = ['AAAA']
- apt_list = [] #组织名称
- pe_md5_list = [] #恶意软件文件名称
- tactic_list = [] #攻击ATT&CK框架Tactic
- technique_list = [] #攻击ATT&CK框架Technique
- id_list = [] #攻击ATT&CK框架类别
- api_list = [] #恶意软件关键API行为特征
- i = 0
- while i<len(apt_name):
- file_name = apt_path + "\" + str(apt_name[i])
- print(file_name)
- apt_list.append("AAAA")
- files = getAllFiles(file_name)
- for name in files:
- jsonName = file_name + "\" + str(name)
- print(jsonName)
- pe_md5_list.append(jsonName)
- #打开json文件
- with open(jsonName) as fp:
- data = json.load(fp)
- #print(data)
- print(data.keys())
- #dict_keys(['meta', 'rules'])
- #包含meta和rules两大块内容 静态行为及API在rules部分
- #提取ATT&CK特征
- behavior = data["rules"]
- #print(behavior)
- #查找attack对应的所有值
- jsondata = JsonSearch(object=behavior, mode='j')
- attack = jsondata.search_all_value(key='attack')
- print(attack)
- print(len(attack))
- #------------------提取tactic、technique和id-----------------
- tactic_str = ""
- technique_str = ""
- id_str = ""
- for n in attack:
- if len(n)>0:
- #print(n,type(n))
- value = n[0]
- print(value,type(value))
- tactic_str += str(value['tactic']) + ";"
- technique_str += str(value['technique']) + ";"
- id_str += str(value['id']) + ";"
- else:
- print("over attack!!!\n")
- #--------------------提取API特征 子节点-----------------------
- jsondata = JsonSearch(object=behavior, mode='j')
- api = jsondata.search_all_value(key='matches')
- #print(len(api))
- #采用关键词匹配
- #'node': {'feature': {'type': 'api', 'api': 'CreateFile'}, 'type': 'feature'}
- api = str(api)
- api_str = ""
- print(api)
- count = 0
- while len(api)>0:
- start = api.find("'api':")
- if start<0:
- break
- else:
- api_lin = api[start+8:]
- api = api_lin
- end = api_lin.find("'},")
- api_feature = api_lin[:end]
- api_str += api_feature + ";"
- count += 1
- else:
- print("over api!!!\n")
- print(tactic_str, technique_str, id_str)
- tactic_list.append(tactic_str)
- technique_list.append(technique_str)
- id_list.append(id_str)
-
- print(api_str)
- print("API特征个数:", count)
- api_list.append(api_str)
- print("----------------------------------\n\n")
- break
- i += 1
- break
复制代码
最终输出结果如下所示:
- Defense Evasion;Execution; Obfuscated Files or Information;Shared Modules; T1027;T1129;
- CreateFile;CreateFileEx;IoCreateFile;IoCreateFileEx;ZwOpenFile;
- ZwCreateFile;NtOpenFile;NtCreateFile;fopen;fopen64;fdopen;freopen;
- open;openat;LoadLibrary;strcmp;kernel32.GetTickCount;
- API特征个数: 17
复制代码
5.文件存储
调用CSV实现文件存储,最终代码如下:
- #coding:utf-8
- #By:Eastmount CSDN 2023-03-14
- import os
- import json
- from jsonsearch import JsonSearch
- import csv
- def getAllFiles(targetDir):
- listFiles = os.listdir(targetDir)
- return listFiles
- apt_path = r"D:\capa\result"
- apt_name = ['AAAA']
- apt_list = [] #组织名称
- pe_md5_list = [] #恶意软件文件名称
- tactic_list = [] #攻击ATT&CK框架Tactic
- technique_list = [] #攻击ATT&CK框架Technique
- id_list = [] #攻击ATT&CK框架类别
- api_list = [] #恶意软件关键API行为特征
- i = 0
- while i<len(apt_name):
- file_name = apt_path + "\" + str(apt_name[i])
- print(file_name)
- apt_list.append("AAAA")
- files = getAllFiles(file_name)
- fw = open('aaaa_result.csv', mode='w', newline="")
- writer = csv.writer(fw)
- writer.writerow(['no', 'apt', 'md5', 'tactic', 'technique', 'tid', 'api'])
- no = 1
- for name in files:
- jsonName = file_name + "\" + str(name)
- print(jsonName)
- pe_md5_list.append(jsonName)
-
- #打开json文件
- with open(jsonName) as fp:
- data = json.load(fp)
- #print(data)
- print(data.keys())
- #dict_keys(['meta', 'rules'])
- #包含meta和rules两大块内容 静态行为及API在rules部分
- #提取ATT&CK特征
- behavior = data["rules"]
- #print(behavior)
- #查找attack对应的所有值
- jsondata = JsonSearch(object=behavior, mode='j')
- attack = jsondata.search_all_value(key='attack')
- print(attack)
- print(len(attack))
- #------------------提取tactic、technique和id-----------------
- tactic_str = ""
- technique_str = ""
- id_str = ""
- for n in attack:
- if len(n)>0:
- #print(n,type(n))
- value = n[0]
- print(value,type(value))
- tactic_str += str(value['tactic']) + ";"
- technique_str += str(value['technique']) + ";"
- id_str += str(value['id']) + ";"
- else:
- print("over attack!!!\n")
- #--------------------提取API特征 子节点-----------------------
- jsondata = JsonSearch(object=behavior, mode='j')
- api = jsondata.search_all_value(key='matches')
- #print(len(api))
- #采用关键词匹配
- #'node': {'feature': {'type': 'api', 'api': 'CreateFile'}, 'type': 'feature'}
- api = str(api)
- api_str = ""
- print(api)
- count = 0
- while len(api)>0:
- start = api.find("'api':")
- if start<0:
- break
- else:
- api_lin = api[start+8:]
- api = api_lin
- end = api_lin.find("'},")
- api_feature = api_lin[:end]
- api_str += api_feature + ";"
- count += 1
- else:
- print("over api!!!\n")
- print(tactic_str, technique_str, id_str)
- tactic_list.append(tactic_str)
- technique_list.append(technique_str)
- id_list.append(id_str)
-
- print(api_str)
- print("API特征个数:", count)
- api_list.append(api_str)
- print("----------------------------------\n\n")
- #--------------------------文件存储--------------------------
- writer.writerow([str(no), "AAAA", str(name), tactic_str,
- technique_str, id_str, api_str])
- no += 1
- if no>5:
- break
- i += 1
- break
- #结束
- fw.close()
- <font size="3" face="Tahoma">
- </font>
复制代码 输出结果如下图所示:
四.总结
写到这里这篇文章就结束,希望对您有所帮助。忙碌的三月,真的很忙,项目本子论文毕业,等忙完后好好写几篇安全博客,感谢支持和陪伴,尤其是家人的鼓励和支持, 加油!
2023年3月20日,终于完成初稿,凌晨迫不及待来写一篇博客,纪念下,感恩下!娜璋白首。
(By:Eastmount 2023-03-20 夜于武汉)
参考文献:
[1] https://github.com/mandiant/capa
[2] capa: Automatically Identify Malware Capabilities
[3] 自动化逆向辅助利器 – Capa工具介绍 - systemino
|
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
|