// ConsoleApplication8.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
// 很多头文件不需要,你自己看着用吧 我是复制我之前的
#include "pch.h"
#include <Windows.h>
#include <windowsx.h>
#include <process.h>
#include <direct.h>
#include <tchar.h>
#include <stdio.h>
#include <algorithm>
#include <math.h>
#include <Psapi.h>
#include <Tlhelp32.h>
#include <iostream>
#include <vector>
#include <string>
#include <map>
#include <ctime>
#include <thread>
/// 字符转字节
int ctoh(char hex)
{
if (hex >= '0' && hex <= '9') return hex - '0';
if (hex >= 'A' && hex <= 'F') return hex - 'A' + 10;
if (hex >= 'a' && hex <= 'f') return hex - 'a' + 10;
return 0;
}
/// 十六进制字符串转字节数组
std::vector<BYTE> HexStringToBytes(std::string str)
{
std::vector<BYTE> Bytes;
for (SIZE_T i = 0; i < str.size(); i++)
{
if (str[i] == ' ')
{
continue;
}
if (str[i] == '?')
{
Bytes.insert(Bytes.end(), '?');
// 兼容OD模式的特征码
if (str[i+1] == '?')
i++;
}
else if (str[i] == '*') {
Bytes.insert(Bytes.end(), '*');
}
else {
Bytes.insert(Bytes.end(), 0x10 * ctoh(str[i]) + ctoh(str[i + 1]));
i++;
}
}
return Bytes;
}
// 获取进程模块句柄
HMODULE GetProcessModuleHandle(DWORD ProcessId, CONST TCHAR* ModuleName)
{
HMODULE hMods[1024];
DWORD cbNeeded;
TCHAR szModName[MAX_PATH];
HANDLE ProcessHandle = ::OpenProcess(PROCESS_ALL_ACCESS, FALSE, ProcessId);
if (EnumProcessModulesEx(ProcessHandle, hMods, sizeof(hMods), &cbNeeded, 0x1))
{
for (size_t i = 0; i < (cbNeeded / sizeof(HMODULE)); i++)
{
GetModuleFileNameEx(ProcessHandle, hMods[i], szModName, sizeof(szModName) / sizeof(TCHAR));
if (_tcscmp(szModName, ModuleName)) {
return hMods[i];
}
}
}
CloseHandle(ProcessHandle);
return NULL;
}
// 读字节数组
std::vector<BYTE> ReadBytes(HANDLE ProcessHandle, DWORD_PTR Address, SIZE_T Size)
{
std::vector<BYTE> Bytes = {};
Bytes.resize(Size);
BYTE* Buffer = new BYTE[Size];
// HANDLE ProcessHandle = ::OpenProcess(PROCESS_ALL_ACCESS, FALSE, ProcessId);
ReadProcessMemory(ProcessHandle, (LPCVOID)Address, Buffer, Size, NULL);
for (size_t i = 0; i < Size; i++)
{
Bytes[i] = Buffer[i];
}
delete[]Buffer;
// CloseHandle(ProcessHandle);
return Bytes;
}
// 用来保存模块内存数据
static std::map<CONST TCHAR*, std::map<DWORD_PTR, std::vector<BYTE>>> g_ModuleMemorys;
//256 表示 0x00~0xff 特征码长度不要超过 256
static int maxByteSize = 256;
static int shift[256] = { 0 };
long Sunday(std::vector<byte> T, std::vector<byte> P)
{
int n = T.size();
int m = P.size();
// 默认值,移动m+1位 256 表示 0x00~0xff
for (int i = 0; i < maxByteSize; i++) {
shift[i] = m + 1;
}
// 模式串P中每个字母出现的最后的下标
// 所对应的主串参与匹配的最末位字符的下一位字符移动到该位,所需要的移动位数
for (int i = 0; i < m; i++) {
shift[P[i]] = m - i;
}
// 模式串开始位置在主串的哪里
int s = 0;
// 模式串已经匹配到的位置
int j;
while (s <= n - m) {
j = 0;
[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!
最后于 2020-5-8 10:58
被aas102400编辑
,原因: