sample_cleaning_demo/Sample_cleaning/de_PE.py

71 lines
2.4 KiB
Python
Raw Normal View History

2023-05-12 11:20:02 +08:00
import pefile
import os
import shutil
from tqdm import tqdm
def is_ELF_file(file_path):
"""
判断样本是否是ELF文件
:param file_path:样本文件路径
:return:是ELF文件返回True否则返回False
"""
# 定义ELF文件的魔数
ELF_MAGIC_NUMBER = b'\x7fELF'
# 读取文件前几个字节
with open(file_path, 'rb') as f:
header = f.read(4)
# 判断文件是否为ELF文件
if header == ELF_MAGIC_NUMBER:
return True
else:
return False
def is_pe_file(file_path):
"""
判断样本是否是PE文件
:param file_path:样本文件路径
:return:是PE文件返回True否则返回False
"""
try:
with open(file_path, 'rb') as f:
header = f.read(4)
pe = pefile.PE(file_path)
return True
except pefile.PEFormatError:
return False
class deleteNotPE(object):
def __init__(self, sampleFile_dir, save_dir):
"""
在大规模复杂软件样本中对非可执行程序进行清除
:param sampleFile_dir:清洗样本的目录
"""
self.sampleFile_dir = sampleFile_dir
self.save_dir = save_dir
def notPEfile_Filter(self):
for root, dirs, files in os.walk(self.sampleFile_dir):
# root:表示正在遍历的文件夹的名字(根 / 子)
# dirs:记录正在遍历的文件夹下的子文件夹集合
# files:记录正在遍历的文件夹中的文件集合
notexe_filelist = []
for file in tqdm(files):
Samplefile_path = os.path.join(self.sampleFile_dir, file)
save_file=os.path.join(root, file)
PEflag = is_pe_file(file_path=Samplefile_path)
ELFflag = is_ELF_file(file_path=Samplefile_path)
if PEflag is True:
print(file + '为PE文件无需清洗')
elif ELFflag is True:
print(file + '为ELF文件无需清洗')
else:
shutil.copy(save_file, self.save_dir)
os.remove(Samplefile_path)
print(file + '为无效样本文件,已将无效样本文件剔除,并讲其保存在'+self.save_dir+'文件中,请查看')
if not os.listdir(root):
print("文件夹" + root + "为空,删除")
os.rmdir(root)