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

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

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

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

    • 1、相关原理、技术分析
        • 1.1文件完整性破坏原理
        • 1.2 文件完整性破坏检测技术
    • 2、设计思路、算法描述
    • 3、代码的详细实现
    • 4、程序测试、结果分析
    • 5、总结

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 hashlibdef 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 contentdef 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 = txt1line2 = txt2# 计算两个文件中的类容len1 = len(line1)len2 = len(line2)if len1 < len2:length = len1else: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,这个模块可以直接生成对象,该对象有相应的函数可以直接使用

谷姚养殖网