基于文件完整性校验的恶意代码检测器设计


1、相关原理、技术分析

1.1文件完整性破坏原理

文件完整性是指文件没有被篡改,破坏文件完整性的方式具体有如下几点:

  1. 感染病毒

    比方说你的系统中了病毒,病毒感染了某个软件安装包或者某个可执行程序。那么该文件的完整性就被破坏了。

  2. 植入木马/后门/人为篡改

    还有一种文件不完整的情况,是被别有用心的人植入木马或后门。比方说某些国内的软件下载站点,它们提供的 Windows 安装光盘镜像已经被安置了后门。

只要文件被篡改后,文件完整性就会改变,就是说文件内容被改变了,文件内容改变一般也是插入了恶意代码

1.2 文件完整性破坏检测技术

最容易想到的检测技术就是比较两个文件,如果两个文件不相同,说明文件被改变了,或者说文件被植入恶意代码,就可以说文件完整性改变,但是这种方法行不通,有些文件非常大,如果一个一个字符的比较会非常慢,这样就想到了另外一种方法,如果一个文件在被创造之前就对他进行了hash认定,那么当我们想要验证文件是否被篡改的时候,只需要计算该文件的hash值,再比较先前的hash值,就可以实现文件完整性校验

再说得具体一点如下所示:

软件开发者在发布软件(比如一个exe文件)前,使用某个校验算法计算出该exe文件的“特征值”,然后将这个特征值和exe文件一同发布到网络上。用户使用相同的校验算法计算下载到exe文件的特征值,并与软件开发者发布的特征值比较。如果两个特征值相同,则认为下载到的exe文件是正确的。如果两个特征值不同,则认为下载到exe文件是被篡改过的,这样也实现了恶意代码检测

2、设计思路、算法描述

我自己是这么想的,在每一个文件创建之前先通过hash函数给文件设置唯一一个hsah值,如果hash值对比一样,那么文件一定是没有被更改,不同的文件得出相同的hash值基本上不可能,这样的可能性太小了,在该实验中可以判断为0,如果两文件的hash值不同,再一个字符一个字符的进行比较,找出恶意代码

3、代码的详细实现

import hashlib


def get_md5(s):
   """
   把文件类容进行MD5加密,加密后为32位密文
   :param s:
   :return: 返回唯一标识符,及文件的加密值
   """
   md = hashlib.md5()  # 设置hash对象
   md.update(s.encode('utf-8'))  # 把内容进行编码后(搞成bytes类型),加进对象中
   return md.hexdigest()  # 生成唯一标识符


def fp_read(fpath):
   """
   打开文件,获取文件中的类容
   :param fpath:
   :return: 返回文件类容
   """
   f = open(fpath, "r")
   content = f.read()
   f.close()
   return content


def discern(path1, path2):
   content = []
   # 以读取方式打开两个txt文件
   f1 = open(path1, "r")
   f2 = open(path2, "r")

   # 读取两个txt文件
   txt1 = f1.read()
   txt2 = f2.read()
   # 按行的方式读取txt文件
   # txt1 = f1.readline()
   # txt2 = f2.readline()

   # 释放两个文件进程
   f1.close()
   f2.close()

   # 将两个文件中内容按空格分隔开
   line1 = txt1
   line2 = txt2
   # 计算两个文件中的类容
   len1 = len(line1)
   len2 = len(line2)

   if len1 < len2:
       length = len1
   else:
       length = len2

   # 比较文件不同的地方,一个一个对比
   for item in range(1, length):
       if line1[item] != line2[item]:
           print(line2[item], line1[item])
           content.append(line2[item])
   if length < len2:
       content.append(''.join(line2[length:]))

   print(f"恶意代码:{
      
      ''.join(content)}")


if __name__ == '__main__':
   path1 = str(input('输入第一个文件路径:'))
   path2 = str(input('输入第一个文件路径:'))
   content1 = fp_read(path1)
   md51 = get_md5(content1)
   content2 = fp_read(path2)
   md52 = get_md5(content2)
   if md52 == md51:
       print("文件内容没有被篡改,没有恶意代码的插入")
   else:
       discern(path1, path2)

4、程序测试、结果分析

我创建了两个文件,分别为1.txt和2.txt,首先,我不改变2.txt中的类容,结果如下所示

在这里插入图片描述

如上所示,两个文件相同,所以会检测文件没有被更改

在这里插入图片描述

结果测试正确

在这里插入图片描述

如上图所示,插入了恶意代码,会被检测出来,结果图如下所示:
在这里插入图片描述

结果全部正确

5、总结

总体来说python实现文件代码检测需要弄懂模块hashlib,这个模块可以直接生成对象,该对象有相应的函数可以直接使用

猜你喜欢

转载自blog.csdn.net/qq_53568983/article/details/129871422