基于文件完整性校验的恶意代码检测器设计
基于文件完整性校验的恶意代码检测器设计
- 1、相关原理、技术分析
- 1.1文件完整性破坏原理
- 1.2 文件完整性破坏检测技术
- 2、设计思路、算法描述
- 3、代码的详细实现
- 4、程序测试、结果分析
- 5、总结
1、相关原理、技术分析
1.1文件完整性破坏原理
文件完整性是指文件没有被篡改,破坏文件完整性的方式具体有如下几点:
-
感染病毒
比方说你的系统中了病毒,病毒感染了某个软件安装包或者某个可执行程序。那么该文件的完整性就被破坏了。
-
植入木马/后门/人为篡改
还有一种文件不完整的情况,是被别有用心的人植入木马或后门。比方说某些国内的软件下载站点,它们提供的 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,这个模块可以直接生成对象,该对象有相应的函数可以直接使用