我有一个功能:
uintptr_t FindPattern(HANDLE hProcess, uintptr_t start, uintptr_t end, char *pattern, char *mask);
当我这样称呼时,就可以了:
uintptr_t found = FindPattern(hProcess, START, END, "\x89\x41\x24\xE9\x00\x00\x00\x00\x8B\x46\x00\x6A\x00\x6A\x00\x50\x8B\xCE\xE8", "xxxx????xx?xxxxxxxx");
现在,我将模式和遮罩存储在文本文件中,将它们读取为字符串,然后将它们转换回char,但是不再起作用:
char* tmp1 = new char[pattern.length() + 1];
strncpy(tmp1, pattern.c_str(), pattern.length());
tmp1[pattern.length()] = '\0';
char* tmp2 = new char[mask.length() + 1];
strncpy(tmp2, mask.c_str(), mask.length());
tmp2[mask.length()] = '\0';
uintptr_t found = FindPattern(hProcess, START, END, tmp1, tmp2);
delete[] tmp1;
delete[] tmp2;
对于我所看到的,遮罩还可以,但是图案有问题。
我认为我必须压制“ \”或将其加倍(“ \\”)。
答案 0 :(得分:0)
问题在于"\x89\x41\x24\xE9\x00\x00\x00\..."
是C ++源代码中的字符串文字表示法。当该符号是源代码的一部分时,才具有特殊含义。编译器将其解释为具有值0x89
,0x41
等的字节序列。
如果将其原样复制到文本文件,则文件中真正具有的字节序列为:\
,x
,8
,9
,\
,x
,4
等
如果所需的字节序列不是有效的文本,则不能将其存储在文本文件中。您将必须使用例如十六进制编辑器制作一个二进制文件,或者您应该选择一种文本表示形式,并在阅读时进行转换。
例如,您可以将其表示为以空格分隔的整数:
137 65 36 233
然后阅读:
std::string result;
std::fstream myfile("D:\\data.txt", std::ios_base::in);
int a;
while (myfile >> a)
{
result += static_cast<char>(a);
}
std::cout << result << std::endl;