安全矩阵

 找回密码
 立即注册
搜索
查看: 719|回复: 0

恶意软件分析 -静态分析Capa经典工具批量提取特征和ATT&CK...

[复制链接]

179

主题

179

帖子

630

积分

高级会员

Rank: 4

积分
630
发表于 2023-3-22 20:23:09 | 显示全部楼层 |阅读模式
本帖最后由 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”中存在不同组织的恶意软件,我们首先要解决的是遍历文件并提取一个恶意软件的静态特征,其关键代码如下:

  1. #coding: utf-8
  2. #By:Eastmount CSDN 2023-03-14
  3. import os

  4. def getAllFiles(targetDir):
  5.     listFiles = os.listdir(targetDir)
  6.     return listFiles

  7. apt_path = r"D:\capa\dataset"
  8. apt_name = ['AAAA','BBBB','CCCC','DDDD']
  9. i = 0
  10. while i<len(apt_name):
  11.     file_name = apt_path + "\" + str(apt_name[i])
  12.     print(file_name)
  13.     files = getAllFiles(file_name)

  14.     #创建输出文件夹
  15.     write_path = r"D:\capa\result"
  16.     write_name = write_path + "\" + str(apt_name[i])
  17.     print(write_name)
  18.     if not os.path.exists(write_name):
  19.         os.mkdir(write_name)

  20.     #循环提取静态特征
  21.     for name in files:
  22.         peName = file_name + "\" + name
  23.         print(peName)
  24.         name = os.path.splitext(name)[0]
  25.         jsonName = write_name + "\" + name + ".json"
  26.         print(jsonName)
  27.         break
  28.     i += 1
  29.     break
复制代码


输出结果如下所示,成功定位需要静态分析的样本,并创建要生成的目标Json文件。此时尚未分析恶意软件,生成的json文件为空。

-目标文件:D:\cape\dataset\APTXX\02ddd…9ff.bin
-生成文件:D:\cape\dataset\APTXX\02ddd…9ff.json



3.CAPA批量提取静态特征
接着定义函数提取静态特征,关键函数如下:

  1. def runCAPA(peName,jsonName):
  2.     cmd = "cd D://capa & capa.exe -vv " + str(peName) + " -j > " + jsonName
  3.     print(cmd)
  4.     os.system(cmd)
复制代码


如果需要暂停则构建的CMD命令为:

  1. cmd = "cd D://capa & capa.exe -vv " + str(peName) + " -j > " + jsonName + " & cmd"
复制代码


尝试提取一个样本的特征,比如HGZ木马。





查看对应的json文件,内容如下:



格式化显示Json文件。



自此,成功利用CAPA提取一个样本的静态特征,下图显示ATT&CK和关键API特征。





此时的代码如下,能批量提取恶意软件的静态特征并生成对应的Json文件。

  1. #coding: utf-8
  2. #By:Eastmount CSDN 2023-03-14
  3. import os

  4. def getAllFiles(targetDir):
  5.     listFiles = os.listdir(targetDir)
  6.     return listFiles

  7. def runCAPA(peName,jsonName):
  8.     #cmd = "cd D://capa & capa.exe -vv " + str(peName) + " -j > " + jsonName + " & cmd"
  9.     cmd = "cd D://capa & capa.exe -vv " + str(peName) + " -j > " + jsonName
  10.     print(cmd)
  11.     os.system(cmd)

  12. apt_path = r"D:\capa\dataset"
  13. apt_name = ['AAAA','BBBB','CCCC','DDDD']
  14. i = 0
  15. while i<len(apt_name):
  16.     file_name = apt_path + "\" + str(apt_name[i])
  17.     print(file_name)
  18.     files = getAllFiles(file_name)

  19.     #创建输出文件夹
  20.     write_path = r"D:\capa\result"
  21.     write_name = write_path + "\" + str(apt_name[i])
  22.     print(write_name)
  23.     if not os.path.exists(write_name):
  24.         os.mkdir(write_name)

  25.     #循环提取静态特征
  26.     for name in files:
  27.         peName = file_name + "\" + name
  28.         print(peName)
  29.         name = os.path.splitext(name)[0]
  30.         jsonName = write_name + "\" + name + ".json"
  31.         print(jsonName)
  32.         runCAPA(peName,jsonName)
  33.     i += 1
复制代码


4.超时判定
然而,某些文件由于过大或格式错误,会导致分析过长或卡主。因此需要构建超时判定。





设置超时判定的方法很多,本文主要利用func_timeout实现。其安装命令如下:

  1. pip install func_timeout
复制代码




此时的完整代码如下:

  1. #By:Eastmount CSDN 2023-03-14
  2. #coding: utf-8
  3. import os
  4. import time
  5. from func_timeout import func_timeout
  6. from func_timeout import FunctionTimedOut
  7. from multiprocessing import Process

  8. def getAllFiles(targetDir):
  9.     listFiles = os.listdir(targetDir)
  10.     return listFiles

  11. def runCAPA(peName,jsonName):
  12.     #cmd = "cd D://capa & capa.exe -vv " + str(peName) + " -j > " + jsonName + " & cmd"
  13.     cmd = "cd D://capa & capa.exe -vv " + str(peName) + " -j > " + jsonName
  14.     print(cmd)
  15.     os.system(cmd)

  16. #超时判定
  17. def mytest(peName,jsonName):
  18.     runCAPA(peName,jsonName)
  19.    
  20. apt_path = r"D:\capa\dataset"
  21. apt_name = ['AAAA','BBBB','CCCC','DDDD']
  22. i = 0
  23. while i<len(apt_name):
  24.     file_name = apt_path + "\" + str(apt_name[i])
  25.     print(file_name)
  26.     files = getAllFiles(file_name)

  27.     #创建输出文件夹
  28.     write_path = r"D:\capa\result"
  29.     write_name = write_path + "\" + str(apt_name[i])
  30.     print(write_name)
  31.     if not os.path.exists(write_name):
  32.         os.mkdir(write_name)

  33.     #循环提取静态特征
  34.     for name in files:
  35.         peName = file_name + "\" + name
  36.         print(peName)
  37.         name = os.path.splitext(name)[0]
  38.         jsonName = write_name + "\" + name + ".json"
  39.         print(jsonName)
  40.         
  41.         #超时判定
  42.         try:
  43.             func_timeout(10, mytest, args=(peName,jsonName, ))
  44.         except FunctionTimedOut as e:
  45.             print(e)
  46.             print('子程序超时')
  47.         print("-----------------------------\n\n")
  48.     i += 1
  49.     break
复制代码


运行结果如下图所示,样本较多时可以利用该方式提取静态特征。注意,该方法可能存在不足之处,还请读者自己完善和修改。



三.提取Json文件API特征和ATT&CK技战术
接下来,我们需要提取Json文件中的关键特征,常见的特征即:

-API函数特征
-ATT&CK技战术
1.读取单个Json文件内容
关键代码如下所示:

-02d9xxxxxxxe9ff.json
  1. #coding:utf-8
  2. #By:Eastmount CSDN 2023-03-14
  3. import os
  4. import json

  5. def getAllFiles(targetDir):
  6.     listFiles = os.listdir(targetDir)
  7.     return listFiles

  8. apt_path = r"D:\capa\result"
  9. apt_name = ['AAAA']

  10. i = 0
  11. while i<len(apt_name):
  12.     file_name = apt_path + "\" + str(apt_name[i])
  13.     print(file_name)

  14.     files = getAllFiles(file_name)
  15.     for name in files:
  16.         jsonName = file_name + "\" +  str(name)
  17.         print(jsonName)

  18.         #打开json文件
  19.         with open(jsonName) as fp:
  20.             data = json.load(fp)
  21.             print(data)

  22.         break
  23.     i += 1
  24.     break
  25. 输出结果如下图所示:

  26. 图片

  27. 2.Json格式分析
  28. Capa工具生成的Json文件主要由meta和rules两大块内容组织,其中,静态行为及API特征在rules部分。接下来尝试解析Json文件。

  29. print(data.keys())
  30. # dict_keys(['meta', 'rules'])
  31. 图片

  32. 该部分的关键代码如下:

  33. #coding:utf-8
  34. #By:Eastmount CSDN 2023-03-14
  35. import os
  36. import json

  37. def getAllFiles(targetDir):
  38.     listFiles = os.listdir(targetDir)
  39.     return listFiles

  40. apt_path = r"D:\capa\result"
  41. apt_name = ['AAAA']

  42. i = 0
  43. while i<len(apt_name):
  44.     file_name = apt_path + "\" + str(apt_name[i])
  45.     print(file_name)

  46.     files = getAllFiles(file_name)
  47.     for name in files:
  48.         jsonName = file_name + "\" +  str(name)
  49.         print(jsonName)

  50.         #打开json文件
  51.         with open(jsonName) as fp:
  52.             data = json.load(fp)
  53.             #print(data)
  54.             print(data.keys())
  55.             #dict_keys(['meta', 'rules'])
  56.             #包含meta和rules两大块内容 静态行为及API在rules部分

  57.             #提取ATT&CK特征
  58.             behavior = data["rules"]
  59.             print(behavior)

  60.         break
  61.     i += 1
  62.     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。

  1. pip install jsonsearch
复制代码




jsonsearch的具体实现过程请读者自行学习,本文仅给出提取ATT&CK和API关键特征的重要代码,如下所示:

  1. #coding:utf-8
  2. #By:Eastmount CSDN 2023-03-14
  3. import os
  4. import json
  5. from jsonsearch import JsonSearch

  6. def getAllFiles(targetDir):
  7.     listFiles = os.listdir(targetDir)
  8.     return listFiles

  9. apt_path = r"D:\capa\result"
  10. apt_name = ['AAAA']

  11. i = 0
  12. while i<len(apt_name):
  13.     file_name = apt_path + "\" + str(apt_name[i])
  14.     print(file_name)

  15.     files = getAllFiles(file_name)
  16.     for name in files:
  17.         jsonName = file_name + "\" +  str(name)
  18.         print(jsonName)

  19.         #打开json文件
  20.         with open(jsonName) as fp:
  21.             data = json.load(fp)
  22.             #print(data)
  23.             print(data.keys())
  24.             #dict_keys(['meta', 'rules'])
  25.             #包含meta和rules两大块内容 静态行为及API在rules部分

  26.             #提取ATT&CK特征
  27.             behavior = data["rules"]
  28.             print(behavior)

  29.             #查找attack对应的所有值
  30.             jsondata = JsonSearch(object=behavior, mode='j')
  31.             attack = jsondata.search_all_value(key='attack')
  32.             print(attack)
  33.             print(len(attack))

  34.             for n in attack:
  35.                 if len(n)>0:
  36.                     print(n,type(n))

  37.         break
  38.     i += 1
  39.     break
复制代码


输出结果如下所示:



  1. [
  2. [{'parts': ['Defense Evasion', 'Obfuscated Files or Information'], 'tactic': 'Defense Evasion', 'technique': 'Obfuscated Files or Information', 'subtechnique': '', 'id': 'T1027'}],
  3.   [],
  4.   [],
  5.   [{'parts': ['Execution', 'Shared Modules'], 'tactic': 'Execution', 'technique': 'Shared Modules', 'subtechnique': '', 'id': 'T1129'}],
  6.   [],
  7.   [],
  8.   [],
  9.   []
  10. ]
复制代码


接着我们还需要提取ATT&CK对应的四部分内容,包括战术(tactic)、技术(technique)、子技术(subtechnique)和序号。



最后分别提取tactic、technique和id内容,并存储至指定列表中。完整代码如下所示:

  1. #coding:utf-8
  2. #By:Eastmount CSDN 2023-03-14
  3. import os
  4. import json
  5. from jsonsearch import JsonSearch

  6. def getAllFiles(targetDir):
  7.     listFiles = os.listdir(targetDir)
  8.     return listFiles

  9. apt_path = r"D:\capa\result"
  10. apt_name = ['AAAA']

  11. apt_list = []          #组织名称
  12. pe_md5_list = []       #恶意软件文件名称
  13. tactic_list = []       #攻击ATT&CK框架Tactic
  14. technique_list = []    #攻击ATT&CK框架Technique
  15. id_list = []           #攻击ATT&CK框架类别

  16. i = 0
  17. while i<len(apt_name):
  18.     file_name = apt_path + "\" + str(apt_name[i])
  19.     print(file_name)

  20.     apt_list.append("AAAA")
  21.     files = getAllFiles(file_name)
  22.     for name in files:
  23.         jsonName = file_name + "\" +  str(name)
  24.         print(jsonName)
  25.         pe_md5_list.append(jsonName)

  26.         #打开json文件
  27.         with open(jsonName) as fp:
  28.             data = json.load(fp)
  29.             #print(data)
  30.             print(data.keys())
  31.             #dict_keys(['meta', 'rules'])
  32.             #包含meta和rules两大块内容 静态行为及API在rules部分

  33.             #提取ATT&CK特征
  34.             behavior = data["rules"]
  35.             print(behavior)

  36.             #查找attack对应的所有值
  37.             jsondata = JsonSearch(object=behavior, mode='j')
  38.             attack = jsondata.search_all_value(key='attack')
  39.             print(attack)
  40.             print(len(attack))

  41.             #提取tactic、technique和id
  42.             tactic_str = ""
  43.             technique_str = ""
  44.             id_str = ""
  45.             for n in attack:
  46.                 if len(n)>0:
  47.                     #print(n,type(n))
  48.                     value = n[0]
  49.                     print(value,type(value))
  50.                     tactic_str += str(value['tactic']) + ";"
  51.                     technique_str += str(value['technique']) + ";"
  52.                     id_str += str(value['id']) + ";"
  53.             else:
  54.                 print("over!!!")
  55.         print(tactic_str, technique_str, id_str)
  56.         tactic_list.append(tactic_str)
  57.         technique_list.append(technique_str)
  58.         id_list.append(id_str)
  59.         break
  60.     i += 1
  61.     break
复制代码


输出结果如下图所示,8个对应上图查询的ATT&CK数字一致,并且存在空值情况。
  1. <font face="Tahoma"><font size="3">dict_keys(['meta', 'rules'])
  2. [[{'parts': ['Defense Evasion', 'Obfuscated Files or Information'], 'tactic': 'Defense Evasion',
  3. 'technique': 'Obfuscated Files or Information', 'subtechnique': '', 'id': 'T1027'}], [], [],
  4. [{'parts': ['Execution', 'Shared Modules'], 'tactic': 'Execution', 'technique':
  5. 'Shared Modules', 'subtechnique': '', 'id': 'T1129'}], [], [], [], []]
  6. </font></font>
  7. <font face="Tahoma"><font size="3">8
  8. {'parts': ['Defense Evasion', 'Obfuscated Files or Information'], 'tactic': 'Defense Evasion',
  9. 'technique': 'Obfuscated Files or Information', 'subtechnique': '', 'id': 'T1027'} <class 'dict'>
  10. {'parts': ['Execution', 'Shared Modules'], 'tactic': 'Execution', 'technique': 'Shared Modules',
  11. 'subtechnique': '', 'id': 'T1129'} <class 'dict'>
  12. over!!!
  13. Defense Evasion;Execution; Obfuscated Files or Information;Shared Modules; T1027;T1129;
  14. </font></font>
复制代码
4.利用jsonsearch提取API特征
同样的方法提取恶意软件的API特征,第一个api也是位于rules位置,即通过CAPA工具的规则匹配提取关键静态特征。



需要注意,api位于子节点下面的内容,直接用下列代码返回空值。

  1. jsondata = JsonSearch(object=behavior, mode='j')
  2. api = jsondata.search_all_value(key='api')
  3. print(api)
  4. print(len(api))
复制代码


通过“matches”来匹配。



关键代码如下:

  1. jsondata = JsonSearch(object=behavior, mode='j')
  2. api = jsondata.search_all_value(key='matches')
复制代码


但返回内容仍然有较多的键值迭代。



因此,作者直接对其进行字符串匹配处理。

  1. #采用关键词匹配
  2. #'node': {'feature': {'type': 'api', 'api': 'CreateFile'}, 'type': 'feature'}
  3. api = str(api)
  4. print(api)
  5. start = api.find("'api':")
  6. api_lin = api[start+8:]
  7. end = api_lin.find("'},")
  8. print(api_lin[:end])
复制代码



输出结果如下图所示:



完整代码如下所示:

  1. #coding:utf-8
  2. #By:Eastmount CSDN 2023-03-14
  3. import os
  4. import json
  5. from jsonsearch import JsonSearch

  6. def getAllFiles(targetDir):
  7.     listFiles = os.listdir(targetDir)
  8.     return listFiles

  9. apt_path = r"D:\capa\result"
  10. apt_name = ['AAAA']

  11. apt_list = []          #组织名称
  12. pe_md5_list = []       #恶意软件文件名称
  13. tactic_list = []       #攻击ATT&CK框架Tactic
  14. technique_list = []    #攻击ATT&CK框架Technique
  15. id_list = []           #攻击ATT&CK框架类别
  16. api_list = []          #恶意软件关键API行为特征

  17. i = 0
  18. while i<len(apt_name):
  19.     file_name = apt_path + "\" + str(apt_name[i])
  20.     print(file_name)

  21.     apt_list.append("AAAA")
  22.     files = getAllFiles(file_name)
  23.     for name in files:
  24.         jsonName = file_name + "\" +  str(name)
  25.         print(jsonName)
  26.         pe_md5_list.append(jsonName)

  27.         #打开json文件
  28.         with open(jsonName) as fp:
  29.             data = json.load(fp)
  30.             #print(data)
  31.             print(data.keys())
  32.             #dict_keys(['meta', 'rules'])
  33.             #包含meta和rules两大块内容 静态行为及API在rules部分

  34.             #提取ATT&CK特征
  35.             behavior = data["rules"]
  36.             #print(behavior)

  37.             #查找attack对应的所有值
  38.             jsondata = JsonSearch(object=behavior, mode='j')
  39.             attack = jsondata.search_all_value(key='attack')
  40.             print(attack)
  41.             print(len(attack))

  42.             #------------------提取tactic、technique和id-----------------
  43.             tactic_str = ""
  44.             technique_str = ""
  45.             id_str = ""
  46.             for n in attack:
  47.                 if len(n)>0:
  48.                     #print(n,type(n))
  49.                     value = n[0]
  50.                     print(value,type(value))
  51.                     tactic_str += str(value['tactic']) + ";"
  52.                     technique_str += str(value['technique']) + ";"
  53.                     id_str += str(value['id']) + ";"
  54.             else:
  55.                 print("over attack!!!\n")

  56.             #--------------------提取API特征 子节点-----------------------
  57.             jsondata = JsonSearch(object=behavior, mode='j')
  58.             api = jsondata.search_all_value(key='matches')
  59.             #print(len(api))

  60.             #采用关键词匹配
  61.             #'node': {'feature': {'type': 'api', 'api': 'CreateFile'}, 'type': 'feature'}
  62.             api = str(api)
  63.             api_str = ""
  64.             print(api)
  65.             count = 0
  66.             while len(api)>0:
  67.                 start = api.find("'api':")
  68.                 if start<0:
  69.                     break
  70.                 else:
  71.                     api_lin = api[start+8:]
  72.                     api = api_lin
  73.                     end = api_lin.find("'},")
  74.                     api_feature = api_lin[:end]
  75.                     api_str += api_feature + ";"
  76.                     count += 1
  77.             else:
  78.                 print("over api!!!\n")

  79.         print(tactic_str, technique_str, id_str)
  80.         tactic_list.append(tactic_str)
  81.         technique_list.append(technique_str)
  82.         id_list.append(id_str)
  83.         
  84.         print(api_str)
  85.         print("API特征个数:", count)
  86.         api_list.append(api_str)
  87.         print("----------------------------------\n\n")
  88.         break
  89.     i += 1
  90.     break
复制代码



最终输出结果如下所示:

  1. Defense Evasion;Execution; Obfuscated Files or Information;Shared Modules; T1027;T1129;

  2. CreateFile;CreateFileEx;IoCreateFile;IoCreateFileEx;ZwOpenFile;
  3. ZwCreateFile;NtOpenFile;NtCreateFile;fopen;fopen64;fdopen;freopen;
  4. open;openat;LoadLibrary;strcmp;kernel32.GetTickCount;
  5. API特征个数: 17
复制代码


5.文件存储
调用CSV实现文件存储,最终代码如下:

  1. #coding:utf-8
  2. #By:Eastmount CSDN 2023-03-14
  3. import os
  4. import json
  5. from jsonsearch import JsonSearch
  6. import csv

  7. def getAllFiles(targetDir):
  8.     listFiles = os.listdir(targetDir)
  9.     return listFiles

  10. apt_path = r"D:\capa\result"
  11. apt_name = ['AAAA']

  12. apt_list = []          #组织名称
  13. pe_md5_list = []       #恶意软件文件名称
  14. tactic_list = []       #攻击ATT&CK框架Tactic
  15. technique_list = []    #攻击ATT&CK框架Technique
  16. id_list = []           #攻击ATT&CK框架类别
  17. api_list = []          #恶意软件关键API行为特征

  18. i = 0
  19. while i<len(apt_name):
  20.     file_name = apt_path + "\" + str(apt_name[i])
  21.     print(file_name)

  22.     apt_list.append("AAAA")
  23.     files = getAllFiles(file_name)

  24.     fw = open('aaaa_result.csv', mode='w', newline="")
  25.     writer = csv.writer(fw)
  26.     writer.writerow(['no', 'apt', 'md5', 'tactic', 'technique', 'tid', 'api'])
  27.     no = 1
  28.     for name in files:
  29.         jsonName = file_name + "\" +  str(name)
  30.         print(jsonName)
  31.         pe_md5_list.append(jsonName)
  32.         
  33.         #打开json文件
  34.         with open(jsonName) as fp:
  35.             data = json.load(fp)
  36.             #print(data)
  37.             print(data.keys())
  38.             #dict_keys(['meta', 'rules'])
  39.             #包含meta和rules两大块内容 静态行为及API在rules部分

  40.             #提取ATT&CK特征
  41.             behavior = data["rules"]
  42.             #print(behavior)

  43.             #查找attack对应的所有值
  44.             jsondata = JsonSearch(object=behavior, mode='j')
  45.             attack = jsondata.search_all_value(key='attack')
  46.             print(attack)
  47.             print(len(attack))

  48.             #------------------提取tactic、technique和id-----------------
  49.             tactic_str = ""
  50.             technique_str = ""
  51.             id_str = ""
  52.             for n in attack:
  53.                 if len(n)>0:
  54.                     #print(n,type(n))
  55.                     value = n[0]
  56.                     print(value,type(value))
  57.                     tactic_str += str(value['tactic']) + ";"
  58.                     technique_str += str(value['technique']) + ";"
  59.                     id_str += str(value['id']) + ";"
  60.             else:
  61.                 print("over attack!!!\n")

  62.             #--------------------提取API特征 子节点-----------------------
  63.             jsondata = JsonSearch(object=behavior, mode='j')
  64.             api = jsondata.search_all_value(key='matches')
  65.             #print(len(api))

  66.             #采用关键词匹配
  67.             #'node': {'feature': {'type': 'api', 'api': 'CreateFile'}, 'type': 'feature'}
  68.             api = str(api)
  69.             api_str = ""
  70.             print(api)
  71.             count = 0
  72.             while len(api)>0:
  73.                 start = api.find("'api':")
  74.                 if start<0:
  75.                     break
  76.                 else:
  77.                     api_lin = api[start+8:]
  78.                     api = api_lin
  79.                     end = api_lin.find("'},")
  80.                     api_feature = api_lin[:end]
  81.                     api_str += api_feature + ";"
  82.                     count += 1
  83.             else:
  84.                 print("over api!!!\n")

  85.         print(tactic_str, technique_str, id_str)
  86.         tactic_list.append(tactic_str)
  87.         technique_list.append(technique_str)
  88.         id_list.append(id_str)
  89.         
  90.         print(api_str)
  91.         print("API特征个数:", count)
  92.         api_list.append(api_str)
  93.         print("----------------------------------\n\n")

  94.         #--------------------------文件存储--------------------------
  95.         writer.writerow([str(no), "AAAA", str(name), tactic_str,
  96.                          technique_str, id_str, api_str])
  97.         no += 1
  98.         if no>5:
  99.             break
  100.     i += 1
  101.     break
  102. #结束
  103. fw.close()
  104. <font size="3" face="Tahoma">
  105. </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
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|安全矩阵

GMT+8, 2024-11-28 20:54 , Processed in 0.032212 second(s), 19 queries .

Powered by Discuz! X4.0

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表