特征码定位查杀

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

代码编写。

#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++ 简单特征码匹配的更多相关文章

  1. leetcode 10 Regular Expression Matching(简单正则表达式匹配)

    最近代码写的少了,而leetcode一直想做一个python,c/c++解题报告的专题,c/c++一直是我非常喜欢的,c语言编程练习的重要性体现在linux内核编程以及一些大公司算法上机的要求,pyt ...

  2. hdu-4185.loiol_skimming(简单二分匹配模型)

    /************************************************************************* > File Name: hdu-4185. ...

  3. POJ2446 模板盖格子 简单二分匹配

    题意:       给你一个n*m的格子,有的格子上有坑,然后让你用1*2的东西去覆盖所有没有坑的格子,不能重叠,坑上也不能放东西覆盖,问是否能成功. 思路:        简单题目,每个格子和四周的 ...

  4. POJ2239简单二分匹配

    题意:       一周有7天,每天可以上12节课,现在给你每科课的上课时间,问你一周最多可以上几科课,一科课只要上一节就行了. 思路:       简单题目,直接二分就行了,好久没写二分匹配了,练习 ...

  5. js小例子(简单模糊匹配输入信息)

    该例子实现的是用户输入信息或者字母时可以搜索出来,鼠标点击选择 <!DOCTYPE html> <html> <style> p{ width:200px; hei ...

  6. Dolls - 4160(简单二分图匹配)

    题意:有一些箱子,大箱子可以套小箱子,但是必须h>h,w>w,l>l,求出来最外面能剩下几个箱子无法被嵌套.   分析:思考每个箱子都只会被别的箱子套一次,所以构成一二分匹配模型,只 ...

  7. E - Swap - hdu 2819(简单二分图匹配)

    题意:如果可以交换行列,问主对角线能不能全为1 分析:要想主对角线全为1很明显要有N个行列不想同的点就行了,可以用二分图匹配计算出来多能有几个.如果小与N就不能.输出要是对的就行,不必和答案一样 ** ...

  8. C#中一个简单的匹配16进制颜色的正则测试

    using System; using System.Text.RegularExpressions; namespace Test { class Program { //匹配16进制颜色代码的正则 ...

  9. 20170728xlVba简单的匹配

    Sub MatchData() Dim i As Long, EndRow As Long, Key As String Dim Rng As Range Dim Dic As Object Set ...

  10. OpenCV应用(3) 简单轮廓匹配的小例子

    具体应用 https://blog.csdn.net/kyjl888/article/details/85060883 OpenCV中提供了几个与轮廓相关的函数: findContours():从二值 ...

随机推荐

  1. 手把手教你配置JupyterLab 环境

    Python 代码编辑器怎么选?PyCharm.VS Code.Jupyter Notebook 都各有特色. 对于大型代码库,最好还是用传统的 IDE 比较靠谱,但是数据分析等需要可视化操作的场景下 ...

  2. 【JAVA基础】错误捕获try-catch

    错误捕获try-catch 使用BaseController统一管理 项目结构 UserController package com.cy.store.controller; import com.c ...

  3. VS以及C++开发和学习使用注意事项

    VS以及C++开发使用注意事项 在vs2013版本开始出现安全检查 最好提前禁用错误4996 制表符问题:Visual Studio中设置Tab键对应空格数的方如下:依次选择:工具-〉选项 -〉文本编 ...

  4. Codeforce :466C. Number of Ways (数学)

    https://codeforces.com/problemset/problem/466/C 解题说明:此题是一道数学题,若平分分成若干种情况,应当整体(sum)考虑,对sum/3进行分析.它是区分 ...

  5. 区间DP练习题题解

    算法讲解:Here AcWing 282. 石子合并 (模板) 题目链接:Here const int N = 310; int a[N], s[N]; int dp[N][N]; void solv ...

  6. 判断客户端是PC还是移动端问题的解决方案

    今天在帮 莲的Live 2D 做浏览器适配的时候学会的一段代码 利用 Javascript 进行判断 function isPC() { //是否为PC端 var userAgentInfo = na ...

  7. fetch概述

    1.基本特性 更加简单的数据获取方式,功能更强大.更灵活,可以看做是xhr的升级版 基于promise实现 2.语法结构 3.fetch的基本用法

  8. SD 控制器集成需求和寄存器列表

    AHB Bus SD Bus DFT & Interrupt 控制集成需求 功能列表 控制器框架图 顶层信号 硬件集成环境 寄存器描述

  9. [转帖]探索惊群 ③ - nginx 惊群现象

    https://wenfh2020.com/2021/09/29/nginx-thundering-herd/    nginx  kernel 本文将通过测试,重现 nginx(1.20.1) 的惊 ...

  10. [转帖]oswbb工具分析主机性能

    https://www.cnblogs.com/lkj371/p/15154268.html 在进行数据库故障分析和数据库例行扩容评估时,需要对数据库主机的CPU.内存.磁盘.网络进行负荷分析,常规处 ...