特征码定位查杀

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

代码编写。

#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. 【Flask】cbv源码分析 flask模板使用 flask请求与响应 session及源码分析 闪现flash 请求扩展

    目录 上节回顾 今日内容 1 cbv分析 1.1 源码分析 2 模板 2.1 app.py 2.2 index.html 3 请求与响应 4 session及源码分析 4.1 session的使用 4 ...

  2. Go--变量的声明

    Go语言是静态类型语言,因此变量(variable)是有明确类型的,编译器也会检查变量类型的正确性. 变量是一段或多段用来存储数据的内存,在go中,变量一旦被定义,一定要使用,不然会报错 内建变量类型 ...

  3. Spring EL 表达式

    本篇讲述了Spring Expression Language -- 即Spring3中功能丰富强大的表达式语言,简称SpEL. SpEL是类似于OGNL和JSF EL的表达式语言,能够在运行时构建复 ...

  4. 技术文档 | 将OpenSCA接入GitHub Action,从软件供应链入口控制风险面

    继Jenkins和Gitlab CI之后,GitHub Action的集成也安排上啦~ 若您解锁了其他OpenSCA的用法,也欢迎向项目组来稿,将经验分享给社区的小伙伴们~ 参数说明 参数 是否必须 ...

  5. 从输入URL后浏览器的渲染逻辑

    从输入URL到浏览器渲染页面需要经过很多过程,本文简单说明下各个环节的内容 主要渲染节点如下: 一.浏览器进程说明 出于安全考虑,打开一个浏览器的Tab页签,会生成1个浏览器主进程.1个网络进程.1个 ...

  6. P5719 水题

    https://www.luogu.com.cn/problem/P5719 唠唠:别看这题很水,且只要求保留小数点后一位,倘若用float而不是double的话就无法AC,洛谷评测则只有40分.所以 ...

  7. poj 2533 LIS(最长上升序列)

    ***一道裸题, 思路:在g数组内往里加元素,一直扩大这个数组,每次查询的时候,用二分查找,时间复杂度O(nlog(n)) *** #include<iostream> #include& ...

  8. MoeCTF 2023(西电CTF新生赛)WP

    个人排名 签到 hello CTFer 1.题目描述: [非西电] 同学注意: 欢迎你来到MoeCTF 2023,祝你玩的开心! 请收下我们送给你的第一份礼物: https://cyberchef.o ...

  9. 使用JavaStream将List转为Map

    有的时候博客内容会有变动,首发博客是最新的,其他博客地址可能会未同步,认准https://blog.zysicyj.top 首发博客地址 系列文章地址 使用Java Stream将List转换为Map ...

  10. [粘贴]关于preparedStatement

    作者:wuxinliulei链接:https://www.zhihu.com/question/37043270/answer/83914933来源:知乎著作权归作者所有.商业转载请联系作者获得授权, ...