使用基于签名的技术编码防病毒
Coding AntiVirus using signatures-based technique
我想为学习目的编写一个防病毒程序。它将是基于签名的。我已经编写了一个扫描器,它循环遍历所有系统文件并为每个文件创建内存映射。我现在要做的是从每个恶意文件(示例文件)中获得二进制签名(十六进制),这样我就可以将其与我创建的数据库进行比较。现在的问题是什么?我注意到,像卡巴斯基这样的商业反病毒软件,会从二进制文件中的任何位置选择文件签名。现在假设我检测到一个新的恶意文件,并选择偏移量0x8766,其值为0x4F作为该恶意文件的签名。现在,如果我想检查一个文件,它有一个小的大小,其中偏移量0x8766不存在于那个小文件..这将是一个问题?下面的示例代码代表了我要做的事情:
hFile = ::CreateFile(State.Path, GENERIC_READ, FILE_SHARE_READ | FILE_SHARE_WRITE,
0, OPEN_EXISTING,FILE_FLAG_SEQUENTIAL_SCAN, 0);//open the file
if(hFile !=INVALID_HANDLE_VALUE){
hMap= ::CreateFileMapping(hFile, 0, PAGE_READONLY | SEC_COMMIT, 0, 0, 0);//create Mem mapping for the file in virtual memory
if( hMap!=NULL){
base = ::MapViewOfFile(hMap, FILE_MAP_READ, 0, 0, 0);//load the mapped file into the RAM
//start to compare some bytes (values) from mspaint.exe file in Win7
if( *((BYTE *)base + 0x1C3DF0)== 0x05 )
i++;
if( *((BYTE *)base + 0x25250C)== 0x21 )
i++;
if( *((BYTE *)base + 0x25272A)== 0x97 )
i++;
if(i==3){
// the file is malicious
}
另一个问题:在我开始比较之前,我需要在ram中映射整个签名数据库吗?你认为签名需要包含哪些内容?文件大小等等?还有其他建议吗
签名通常不会太大,您可以像这样搜索它们。但是,请记住,如果您有成千上万个签名(或更多),那么重新开始检查每个单独文件上的不同签名是不现实的。你可以说启发式算法使用每个签名的级别来决定是否进行下一级检查以确认或拒绝匹配。
这些签名将非常复杂,即描述受感染文件的类型,可能的偏移位置等,因此采用分层(或过滤)方法来得出明确的结论。
相关文章:
- 如何确定我已使用非编码文件到达 EOF?
- 使用 MATLAB 编码器生成C++代码:编译错误"undefined reference to `rgb2gray_tbb_real64'"
- 在卡萨布兰卡形成编码参数的列表
- 使用C++进行游程编码
- 如何将不同的可执行文件合并到一个窗口框架中进行编码?像浏览器一样
- 在C++中样板"冷/never_inline"错误处理技术的最佳方法是什么?
- 使用已使用 java 编码的 openssl 解码数据
- 在 Windows 8/10 技术中完全实时的屏幕捕获,没有延迟
- C++ 关于指针取消引用的技术问题
- boost 是否有按特殊类型值编码状态"compact optional"?
- 如何在CPP的给定目录中列出UTF编码的文件名?
- 如何使用 C++将 ISO-2022-KR 编码转换为 UTF-8 编码?
- 是否有技术原因阻止 Java 中的 final C++ 像 const 一样严格?
- 绝对编码器十六进制输入
- 防止C++中的硬编码数字
- 用于计算来自不同实例的响应数的编码技术
- 我们可以在不使用 c 程序和一些编码技术的情况下访问 c 中变量的内存位置以及它在程序中的值吗?
- 如何将编码"attach"到嵌入式技术?(例如,将计算器程序附加到计算器。
- 是否有任何库支持具有EMSA-PSS编码技术和证书验证的RSASSA-PSS.
- 使用基于签名的技术编码防病毒