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;
}
文章出处:https://www.cnblogs.com/LyShark/p/11787229.html
本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?