Sunday算法实现内存快速搜索特征码(支持带问号)

2024-02-07 15:30

本文主要是介绍Sunday算法实现内存快速搜索特征码(支持带问号),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

效果图:

在这里插入图片描述

代码:

#include<Windows.h>
#include<iostream>
#include<vector>
#include<time.h>using namespace std;#define BLOCKMAXSIZE 409600//每次读取内存的最大大小
BYTE* MemoryData;//每次将读取的内存读入这里
short Next[260];//特征码转字节集
WORD GetTzmArray(char* Tzm, WORD* TzmArray)
{int len = 0;WORD TzmLength = strlen(Tzm) / 3 + 1;for (int i = 0; i < strlen(Tzm); )//将十六进制特征码转为十进制{char num[2];num[0] = Tzm[i++];num[1] = Tzm[i++];i++;if (num[0] != '?' && num[1] != '?'){int sum = 0;WORD a[2];for (int i = 0; i < 2; i++){if (num[i] >= '0' && num[i] <= '9'){a[i] = num[i] - '0';}else if (num[i] >= 'a' && num[i] <= 'z'){a[i] = num[i] - 87;}else if (num[i] >= 'A' && num[i] <= 'Z'){a[i] = num[i] - 55;}}sum = a[0] * 16 + a[1];TzmArray[len++] = sum;}else{TzmArray[len++] = 256;}}return TzmLength;
}//获取Next数组
void GetNext(short* next, WORD* Tzm, WORD TzmLength)
{//特征码(字节集)的每个字节的范围在0-255(0-FF)之间,256用来表示问号,到260是为了防止越界for (int i = 0; i < 260; i++)next[i] = -1;for (int i = 0; i < TzmLength; i++)next[Tzm[i]] = i;
}//搜索一块内存
void SearchMemoryBlock(HANDLE hProcess, WORD* Tzm, WORD TzmLength, unsigned __int64 StartAddress, unsigned long size, vector<unsigned __int64>& ResultArray)
{if (!ReadProcessMemory(hProcess, (LPCVOID)StartAddress, MemoryData, size, NULL)){return;}for (int i = 0, j, k; i < size;){j = i; k = 0;for (; k < TzmLength && j < size && (Tzm[k] == MemoryData[j] || Tzm[k] == 256); k++, j++);if (k == TzmLength){ResultArray.push_back(StartAddress + i);}if ((i + TzmLength) >= size){return;}int num = Next[MemoryData[i + TzmLength]];if (num == -1)i += (TzmLength - Next[256]);//如果特征码有问号,就从问号处开始匹配,如果没有就i+=-1elsei += (TzmLength - num);}
}//搜索整个程序
int SearchMemory(HANDLE hProcess, char* Tzm, unsigned __int64 StartAddress, unsigned __int64 EndAddress, int InitSize, vector<unsigned __int64>& ResultArray)
{int i = 0;unsigned long BlockSize;MEMORY_BASIC_INFORMATION mbi;WORD TzmLength = strlen(Tzm) / 3 + 1;WORD* TzmArray = new WORD[TzmLength];GetTzmArray(Tzm, TzmArray);GetNext(Next, TzmArray, TzmLength);//初始化结果数组ResultArray.clear();ResultArray.reserve(InitSize);while (VirtualQueryEx(hProcess, (LPCVOID)StartAddress, &mbi, sizeof(mbi)) != 0){//获取可读可写和可读可写可执行的内存块if (mbi.Protect == PAGE_READWRITE || mbi.Protect == PAGE_EXECUTE_READWRITE){i = 0;BlockSize = mbi.RegionSize;//搜索这块内存while (BlockSize >= BLOCKMAXSIZE){SearchMemoryBlock(hProcess, TzmArray, TzmLength, StartAddress + (BLOCKMAXSIZE * i), BLOCKMAXSIZE, ResultArray);BlockSize -= BLOCKMAXSIZE; i++;}SearchMemoryBlock(hProcess, TzmArray, TzmLength, StartAddress + (BLOCKMAXSIZE * i), BlockSize, ResultArray);}StartAddress += mbi.RegionSize;if (EndAddress != 0 && StartAddress > EndAddress){return ResultArray.size();}}free(TzmArray);return ResultArray.size();
}int main()
{//初始化MemoryData大小MemoryData = new BYTE[BLOCKMAXSIZE];DWORD pid=0;vector<unsigned __int64> ResultArray;cout << "请输入进程ID:" << endl;cin >> pid;//通过进程ID获取进程句柄HANDLE hProcess = OpenProcess(PROCESS_ALL_ACCESS, false, pid);int start = clock();SearchMemory(hProcess, (char*)"FF 3F FF ?? FF F2", 0x410000, 0xFFFFFFFF, 30, ResultArray);int end = clock();cout << "用时:" << end-start << "毫秒"<<endl;cout << "搜索到" << ResultArray.size() << "个结果" << endl;for (vector<unsigned __int64>::iterator it = ResultArray.begin(); it != ResultArray.end(); it++){printf("%x\n", *it);}return 0;
}

这篇关于Sunday算法实现内存快速搜索特征码(支持带问号)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/688142

相关文章

一文详解如何在idea中快速搭建一个Spring Boot项目

《一文详解如何在idea中快速搭建一个SpringBoot项目》IntelliJIDEA作为Java开发者的‌首选IDE‌,深度集成SpringBoot支持,可一键生成项目骨架、智能配置依赖,这篇文... 目录前言1、创建项目名称2、勾选需要的依赖3、在setting中检查maven4、编写数据源5、开启热

C++中零拷贝的多种实现方式

《C++中零拷贝的多种实现方式》本文主要介绍了C++中零拷贝的实现示例,旨在在减少数据在内存中的不必要复制,从而提高程序性能、降低内存使用并减少CPU消耗,零拷贝技术通过多种方式实现,下面就来了解一下... 目录一、C++中零拷贝技术的核心概念二、std::string_view 简介三、std::stri

C++高效内存池实现减少动态分配开销的解决方案

《C++高效内存池实现减少动态分配开销的解决方案》C++动态内存分配存在系统调用开销、碎片化和锁竞争等性能问题,内存池通过预分配、分块管理和缓存复用解决这些问题,下面就来了解一下... 目录一、C++内存分配的性能挑战二、内存池技术的核心原理三、主流内存池实现:TCMalloc与Jemalloc1. TCM

OpenCV实现实时颜色检测的示例

《OpenCV实现实时颜色检测的示例》本文主要介绍了OpenCV实现实时颜色检测的示例,通过HSV色彩空间转换和色调范围判断实现红黄绿蓝颜色检测,包含视频捕捉、区域标记、颜色分析等功能,具有一定的参考... 目录一、引言二、系统概述三、代码解析1. 导入库2. 颜色识别函数3. 主程序循环四、HSV色彩空间

HTML5 搜索框Search Box详解

《HTML5搜索框SearchBox详解》HTML5的搜索框是一个强大的工具,能够有效提升用户体验,通过结合自动补全功能和适当的样式,可以创建出既美观又实用的搜索界面,这篇文章给大家介绍HTML5... html5 搜索框(Search Box)详解搜索框是一个用于输入查询内容的控件,通常用于网站或应用程

Python实现精准提取 PDF中的文本,表格与图片

《Python实现精准提取PDF中的文本,表格与图片》在实际的系统开发中,处理PDF文件不仅限于读取整页文本,还有提取文档中的表格数据,图片或特定区域的内容,下面我们来看看如何使用Python实... 目录安装 python 库提取 PDF 文本内容:获取整页文本与指定区域内容获取页面上的所有文本内容获取

基于Python实现一个Windows Tree命令工具

《基于Python实现一个WindowsTree命令工具》今天想要在Windows平台的CMD命令终端窗口中使用像Linux下的tree命令,打印一下目录结构层级树,然而还真有tree命令,但是发现... 目录引言实现代码使用说明可用选项示例用法功能特点添加到环境变量方法一:创建批处理文件并添加到PATH1

Java使用HttpClient实现图片下载与本地保存功能

《Java使用HttpClient实现图片下载与本地保存功能》在当今数字化时代,网络资源的获取与处理已成为软件开发中的常见需求,其中,图片作为网络上最常见的资源之一,其下载与保存功能在许多应用场景中都... 目录引言一、Apache HttpClient简介二、技术栈与环境准备三、实现图片下载与保存功能1.

canal实现mysql数据同步的详细过程

《canal实现mysql数据同步的详细过程》:本文主要介绍canal实现mysql数据同步的详细过程,本文通过实例图文相结合给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的... 目录1、canal下载2、mysql同步用户创建和授权3、canal admin安装和启动4、canal

Nexus安装和启动的实现教程

《Nexus安装和启动的实现教程》:本文主要介绍Nexus安装和启动的实现教程,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、Nexus下载二、Nexus安装和启动三、关闭Nexus总结一、Nexus下载官方下载链接:DownloadWindows系统根