简单的病毒查杀引擎编写

特征码定位查杀

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

代码编写。

#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 校验

猜你喜欢

转载自www.cnblogs.com/LyShark/p/11787229.html