前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >C/C++ 简单特征码匹配

C/C++ 简单特征码匹配

作者头像
微软技术分享
发布2023-02-10 11:25:14
4950
发布2023-02-10 11:25:14

特征码定位查杀

简单提取一段特征码字段。

代码编写。

代码语言:javascript
复制
#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 校验

代码语言:javascript
复制
#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;
}
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2019-11-03,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 特征码定位查杀
  • CRC32 校验
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档