本文正在参加「金石方案 . 分割6万现金大奖」

前语

随着互联网的繁荣和发展,海量的中心数据和网络运用也不断向云端、数据中心关键信息基础设施整合和迁移,主机安全也因而成为网络攻防战的焦点。歹意文件 是指由进犯者专门设计的,在未经所有者答应的情况下用来拜访计算机、损害或损坏系统,对保密性、完整性或可用性进行进犯的文件,是当前互联网安全的主要要挟之一。目前,比较主流的歹意文件包括歹意脚本、漏洞运用、蠕虫、木马和间谍软件以及他们的组合或变体。

为了应对应战,歹意文件静态检测的思想被提了出来。根据机器学习算法的防护技能为完成高准确率、自动化的不知道歹意文件检测供给了行之有效的技能途径,已逐步成为业内研讨的热门。

接下来博主将简略介绍其间一种歹意文件静态检测模型的部分内容;

番外:关于想了解梯度下降算法的小伙伴,也可以看看博主的往期博文:

  • 【AI】浅谈梯度下降算法(理论篇)
  • 【AI】浅谈梯度下降算法(实战篇)
  • 【AI】浅谈梯度下降算法(拓展篇)

分析

这儿的歹意文件静态检测是将歹意文件的二进制转成灰度图,作为 CNN 模型的输入,经过一系列的过程得到输出,然后进行比照、评估等;

考虑到每个样本的巨细是不固定的,原本是以 1M 巨细作为区别界限的,这儿的话,运用 PadSequence 来保证数据长度的一致性;

class PadSequence(object):
    ...
    def pltexe(self, arr):
        arr_n = len(arr) // (1024*1024)
        arr_end_len = len(arr) % (1024*1024)
        re_arr = []
        siz = 1024
        # 矩阵转化:行列变化,总数不变
        for ite in range(arr_n):
            st = ite * 1024 * 1024
            pggg0 = np.array(arr[st : st+1024*1024])
            re_arr.append(pggg0.reshape(siz,siz) / 255)
        # 用 0 补足
        if arr_end_len!= 0 :
            arr_ = (1024*1024-arr_end_len) * [0]
            pggg0 = np.array(arr[1024*1024*arr_n:] + arr_)
            re_arr.append(pggg0.reshape(siz,siz) / 255)
        return re_arr
    def doooo_(self, filelist):
        ...
        # 设定列表长度不超越20
        if len(featurelist) > 20:
            re_feature_lab = random.sample(list(zip(featurelist,labellist)), 20)
            featurelist = [x[0] for x in re_feature_lab]
            labellist = [x[1] for x in re_feature_lab]
        ...
        return featurelist_batch, labellist_batch
    def __call__(self, batch):
        return self.doooo_(batch)

然后进行数据加载:

with open(path, 'rb') as f:
        train_data = pickle.load(f)
train_loader = DataLoader(train_data, batch_size=10, shuffle=True, num_workers = 20, collate_fn=PadSequence(maxlen = 0))
pad = PadSequence()
pad.__call__(train_data[:4])[0]

【AI】浅析恶意文件静态检测及部分问题解决思路

最后进入模型进行练习以及验证;

【AI】浅析恶意文件静态检测及部分问题解决思路

TIP

在模型练习中,可以运用 try...excpet 模块,即使由于意外中断练习,之前的练习成果也都保存下来了,下次练习就不用重头开端了:

try:
    ...
except:
    model = model.eval()
    torch.save(model.state_dict(), 'error.pth')

问题解决

OOM

在启动项目时,或许会呈现以下报错:

(sid10t) bash-4.2# python model_run.py
Traceback (most recent call last):
  ...
RuntimeError: Caught RuntimeError in replica 0 on device 0.
Original Traceback (most recent call last):
  ...
RuntimeError: CUDA out of memory. Tried to allocate 24.00 MiB (GPU 0; 7.80 GiB total capacity; 6.31 GiB already allocated; 6.56 MiB free; 6.46 GiB reserved in total by PyTorch)

这是由于咱们将 DataLoader 里的 batch_size 参数设置的过大了,从而导致了显存溢出;

那么无非便是两个解决方案:

  • 多选定几个 CUDA;
  • batch_size 参数调小;

关于第一种方案,可以一股脑的将机子上的所有 CUDA 悉数选上:

device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
model = model.to(device)
model= nn.DataParallel(model)

关于第二种方案,将 batch_size 参数调小,也是有讲究的,咱们要尽或许的提高资源的运用率,因而需要做一些操作:

  1. 首先是检查模型占用了多少 GPU,watch -n 1 nvidia-smi

    【AI】浅析恶意文件静态检测及部分问题解决思路

  2. 然后折半减少 batch_size,检查显存占用率,调节至适宜巨细:

    【AI】浅析恶意文件静态检测及部分问题解决思路

Socket exception

由于模型跑在闲暇的机子上,而样本却在另一台机子上,因而,需要经过 SFTP 进行读取,不出意外的话,要出意外了;

首先是在 pad 函数里构建 SFTP 衔接:

class PadSequence(object):
    def __init__(self, maxlen = 8000):
        self.maxlen = maxlen
        ...
        self.client = paramiko.SSHClient()
        self.client.set_missing_host_key_policy(paramiko.AutoAddPolicy())
        self.client.connect(self.hostname, self.port ,self.username, self.password, compress=True)
        self.sftp_client = self.client.open_sftp()
    def getfile_ftp(self, file_path):
        remote_file = self.sftp_client.open(file_path, 'rb')
        try:
            str_object_with_pe_file_data = remote_file.read()
        finally:
            remote_file.close()
        return str_object_with_pe_file_data
    def __call__(self, batch):
        return self.doooo_(batch)

然后在 DataLoader 中运用到它的回显函数:

train_loader = DataLoader(train_data, batch_size=4, shuffle=True, num_workers = 20, collate_fn=PadSequence(maxlen = 0))

好的,做完上面的之后,坑爹的来了,报错了:Socket exception: Connection reset by peer (104)

【AI】浅析恶意文件静态检测及部分问题解决思路

不知道是由于 DataLoader 底层逻辑问题,仍是这台服务器的问题,症结便是在于不能运用多进程进行 SFTP 读取,因而这儿的解决方案便是将参数 num_workers 置为 0;

后记

以上便是 浅析歹意文件静态检测及部分问题解决思路 的悉数内容了,大致叙述了歹意文件静态检测的其间一种思路,以及图文结合的分析了部分问题的解决思路,希望我们有所收获!

上篇精讲:【AI】浅谈梯度下降算法(实战篇)

我是,等待你的关注;

创造不易,请多多支撑;

系列专栏:AI 项目实战