特征码定位查杀
简单提取一段特征码字段。
代码编写。
#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; }