C/C++ 简单特征码匹配
特征码定位查杀
简单提取一段特征码字段。

代码编写。
#include <stdio.h>
#include <Windows.h>
#define FileLEN 20 // 文件长度定义
#define SIGNLEN 8 // 特征码长度定义
typedef struct SING
{
char FileName[FileLEN]; // 病毒名称
LONG FileOffset; // 文件相对偏移
BYTE VirusSign[SIGNLEN + 1]; // +1个结束符
}_SIGN,*PSIGN;
SING sign[2] =
{
{
"setup.exe", // 病毒的具体名称
0x1a20, // 病毒在文件中的偏移位置
"\x05\x00\x00\x00\x90\x00\x00\x80" // 病毒特征码
},
{
"lyshark.exe", // 病毒的具体名称
0x3a10, // 病毒在文件中的偏移位置
"\x02\x00\x00\x00\x30\x00\x00\x90" // 病毒特征码
}
};
BOOL CheckSig(char *FilePath)
{
DWORD dwNum = 0;
BYTE buffer[SIGNLEN + 1];
HANDLE hFile = NULL;
// 获取到FilePath路径下文件的句柄信息
hFile = CreateFile(FilePath, GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ,
NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
for (int x = 0; x <= 2; x++) // 我们有两个待检测程序,这里循环两次从零开始
{
// 将待检测程序的文件指针指向特征码的偏移位置
SetFilePointer(hFile, sign[x].FileOffset, NULL, FILE_BEGIN);
// 读取目标程序指定位置的特征码到内存中
ReadFile(hFile, buffer, sizeof(buffer), &dwNum, NULL);
// 对比内存中两个特征码是否相等
if (memcmp(sign[x].VirusSign, buffer, SIGNLEN) == 0)
{
printf("发现病毒: %s\n", FilePath);
CloseHandle(hFile);
return TRUE;
}
}
return FALSE;
}
int main()
{
WIN32_FIND_DATA stFindFile;
HANDLE hFindFile;
char *szFilter = "*.exe"; // 筛选所有的.exe结尾的文件
char szFindFile[MAX_PATH]; // 保存欲检测程序的路径
char szSearch[MAX_PATH]; // 保存完整的筛选路径
int ret = 0; // 搜索状态返回值
lstrcpy(szFindFile, "D:\\"); // 搜索D盘目录下的所有exe结尾的文件
lstrcpy(szSearch, "D:\\");
lstrcat(szSearch, szFilter);
hFindFile = FindFirstFile(szSearch, &stFindFile);
if (hFindFile != INVALID_HANDLE_VALUE)
{
do
{
// 组合成完整的待检测文件的具体路径
lstrcat(szFindFile, stFindFile.cFileName);
if (!CheckSig(szFindFile))
{
printf("%s 不是病毒! \n", szFindFile);
}
// 删除程序名称只保留"C:\"
szFindFile[3] = '\0';
ret = FindNextFile(hFindFile, &stFindFile);
} while (ret != 0);
}
FindClose(hFindFile);
getchar();
return 0;
}

CRC32 校验
#include <stdio.h>
#include <Windows.h>
DWORD CRC32(BYTE* ptr, DWORD Size)
{
DWORD crcTable[256],crcTemp1;
// 动态生成CRC32表
for (int i = 0; i<256; i++)
{
crcTemp1 = i;
for (int j=8; j>0; j--)
{
if (crcTemp1&1) crcTemp1 = (crcTemp1 >> 1) ^ 0xEDB88320L;
else crcTemp1 >>= 1;
}
}
// 计算CRC32
DWORD crcTemp2 = 0xFFFFFFFF;
while (Size--)
{
crcTemp2 = ((crcTemp2>>8) & 0x00FFFFFF) ^ crcTable[(crcTemp2^(*ptr)) & 0xFF];
ptr++;
}
return(crcTemp2 ^ 0xFFFFFFFF);
}
DWORD CalcCRC32(char *FilePath)
{
HANDLE hFile = CreateFile(FilePath, GENERIC_READ, FILE_SHARE_READ,NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
if (hFile == INVALID_HANDLE_VALUE){ printf("打开文件出错\n"); return FALSE; }
DWORD dwSize = GetFileSize(hFile, NULL);
if (dwSize == 0xFFFFFFFF){ printf("获取文件大小出错\n"); return FALSE; }
BYTE *pFile = (BYTE*)malloc(dwSize);
if (pFile == NULL){ printf("分配内存失败\n"); return 0; }
DWORD dwNum = 0;
ReadFile(hFile, pFile, dwSize, &dwNum, NULL);
DWORD dwCRC32 = CRC32(pFile, dwSize);
if (pFile != NULL){free(pFile);pFile = NULL;}
CloseHandle(hFile);
return dwCRC32;
}
int main()
{
WIN32_FIND_DATA stFindFile;
HANDLE hFindFile;
char *szFilter = "*.exe"; // 筛选所有的.exe结尾的文件
char szFindFile[MAX_PATH]; // 保存欲检测程序的路径
char szSearch[MAX_PATH]; // 保存完整的筛选路径
int ret = 0; // 搜索状态返回值
lstrcpy(szFindFile, "D:\\"); // 搜索D盘目录下的所有exe结尾的文件
lstrcpy(szSearch, "D:\\");
lstrcat(szSearch, szFilter);
DWORD dwTmpCRC32;
hFindFile = FindFirstFile(szSearch, &stFindFile);
if (hFindFile != INVALID_HANDLE_VALUE)
{
do
{
lstrcat(szFindFile, stFindFile.cFileName);
dwTmpCRC32 = CalcCRC32(szFindFile);
if (dwTmpCRC32 == 0x1F15CC29)
{
printf("发现病毒文件 %s \n", szFindFile);
}
else
{
printf("%s 不是病毒程序!\n", szFindFile);
}
// 删除程序名称只保留"C:\"
szFindFile[3] = '\0';
ret = FindNextFile(hFindFile, &stFindFile);
} while (ret != 0);
}
FindClose(hFindFile);
getchar();
return 0;
}
C/C++ 简单特征码匹配的更多相关文章
- leetcode 10 Regular Expression Matching(简单正则表达式匹配)
最近代码写的少了,而leetcode一直想做一个python,c/c++解题报告的专题,c/c++一直是我非常喜欢的,c语言编程练习的重要性体现在linux内核编程以及一些大公司算法上机的要求,pyt ...
- hdu-4185.loiol_skimming(简单二分匹配模型)
/************************************************************************* > File Name: hdu-4185. ...
- POJ2446 模板盖格子 简单二分匹配
题意: 给你一个n*m的格子,有的格子上有坑,然后让你用1*2的东西去覆盖所有没有坑的格子,不能重叠,坑上也不能放东西覆盖,问是否能成功. 思路: 简单题目,每个格子和四周的 ...
- POJ2239简单二分匹配
题意: 一周有7天,每天可以上12节课,现在给你每科课的上课时间,问你一周最多可以上几科课,一科课只要上一节就行了. 思路: 简单题目,直接二分就行了,好久没写二分匹配了,练习 ...
- js小例子(简单模糊匹配输入信息)
该例子实现的是用户输入信息或者字母时可以搜索出来,鼠标点击选择 <!DOCTYPE html> <html> <style> p{ width:200px; hei ...
- Dolls - 4160(简单二分图匹配)
题意:有一些箱子,大箱子可以套小箱子,但是必须h>h,w>w,l>l,求出来最外面能剩下几个箱子无法被嵌套. 分析:思考每个箱子都只会被别的箱子套一次,所以构成一二分匹配模型,只 ...
- E - Swap - hdu 2819(简单二分图匹配)
题意:如果可以交换行列,问主对角线能不能全为1 分析:要想主对角线全为1很明显要有N个行列不想同的点就行了,可以用二分图匹配计算出来多能有几个.如果小与N就不能.输出要是对的就行,不必和答案一样 ** ...
- C#中一个简单的匹配16进制颜色的正则测试
using System; using System.Text.RegularExpressions; namespace Test { class Program { //匹配16进制颜色代码的正则 ...
- 20170728xlVba简单的匹配
Sub MatchData() Dim i As Long, EndRow As Long, Key As String Dim Rng As Range Dim Dic As Object Set ...
- OpenCV应用(3) 简单轮廓匹配的小例子
具体应用 https://blog.csdn.net/kyjl888/article/details/85060883 OpenCV中提供了几个与轮廓相关的函数: findContours():从二值 ...
随机推荐
- 手把手教你配置JupyterLab 环境
Python 代码编辑器怎么选?PyCharm.VS Code.Jupyter Notebook 都各有特色. 对于大型代码库,最好还是用传统的 IDE 比较靠谱,但是数据分析等需要可视化操作的场景下 ...
- 【JAVA基础】错误捕获try-catch
错误捕获try-catch 使用BaseController统一管理 项目结构 UserController package com.cy.store.controller; import com.c ...
- VS以及C++开发和学习使用注意事项
VS以及C++开发使用注意事项 在vs2013版本开始出现安全检查 最好提前禁用错误4996 制表符问题:Visual Studio中设置Tab键对应空格数的方如下:依次选择:工具-〉选项 -〉文本编 ...
- Codeforce :466C. Number of Ways (数学)
https://codeforces.com/problemset/problem/466/C 解题说明:此题是一道数学题,若平分分成若干种情况,应当整体(sum)考虑,对sum/3进行分析.它是区分 ...
- 区间DP练习题题解
算法讲解:Here AcWing 282. 石子合并 (模板) 题目链接:Here const int N = 310; int a[N], s[N]; int dp[N][N]; void solv ...
- 判断客户端是PC还是移动端问题的解决方案
今天在帮 莲的Live 2D 做浏览器适配的时候学会的一段代码 利用 Javascript 进行判断 function isPC() { //是否为PC端 var userAgentInfo = na ...
- fetch概述
1.基本特性 更加简单的数据获取方式,功能更强大.更灵活,可以看做是xhr的升级版 基于promise实现 2.语法结构 3.fetch的基本用法
- SD 控制器集成需求和寄存器列表
AHB Bus SD Bus DFT & Interrupt 控制集成需求 功能列表 控制器框架图 顶层信号 硬件集成环境 寄存器描述
- [转帖]探索惊群 ③ - nginx 惊群现象
https://wenfh2020.com/2021/09/29/nginx-thundering-herd/ nginx kernel 本文将通过测试,重现 nginx(1.20.1) 的惊 ...
- [转帖]oswbb工具分析主机性能
https://www.cnblogs.com/lkj371/p/15154268.html 在进行数据库故障分析和数据库例行扩容评估时,需要对数据库主机的CPU.内存.磁盘.网络进行负荷分析,常规处 ...