深度学习中的恶意文件检测与数据处理方法

释放双眼,带上耳机,听听看~!
本文讨论了在深度学习中应用梯度下降算法进行恶意文件静态检测的方法,以及对数据进行处理的PadSequence类的实现。通过灰度图转换、PadSequence处理等方法,实现了对恶意文件的静态检测与评估。

本文正在参加【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]
    

    深度学习中的恶意文件检测与数据处理方法

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

    深度学习中的恶意文件检测与数据处理方法

    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
      深度学习中的恶意文件检测与数据处理方法

    2. 然后折半减少 batch_size,查看显存占用率,调节至合适大小:
      深度学习中的恶意文件检测与数据处理方法

    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)

    深度学习中的恶意文件检测与数据处理方法

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

    后记

    以上就是 浅析恶意文件静态检测及部分问题解决思路 的全部内容了,大致讲述了恶意文件静态检测的其中一种思路,以及图文结合的分析了部分问题的解决思路,希望大家有所收获!

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

    💖 我是 𝓼𝓲𝓭𝓲𝓸𝓽,期待你的关注;

    👍 创作不易,请多多支持;

    🔥 系列专栏:AI 项目实战

    本网站的内容主要来自互联网上的各种资源,仅供参考和信息分享之用,不代表本网站拥有相关版权或知识产权。如您认为内容侵犯您的权益,请联系我们,我们将尽快采取行动,包括删除或更正。
    AI教程

    YOLOv7:Trainable bag-of-freebies sets new state-of-the-art for real-time object detectors

    2023-12-19 13:19:14

    AI教程

    用ChatGPT三步生成思维导图

    2023-12-19 13:32:14

    个人中心
    购物车
    优惠劵
    今日签到
    有新私信 私信列表
    搜索