C++从TXT读取字节特征码调用findpattern扫描Windows进程内存失效问题
问题根因
你遇到的是C++转义字符编译期处理和运行期字符串读取的差异问题:
- 硬编码写的
"\x55\x8B\xEC\x83\x44\x0C\x7C\xDF"是C++编译器在编译阶段直接把\xXX格式的转义序列转换成对应的单字节值,最终这个字符串实际长度是8字节,每个字节的值就是你写的十六进制对应的数值。 - 用
std::getline从文件读的字符串是把\x55当成4个独立的普通字符(反斜杠、x、字符5、字符5)处理,最终你拿到的字符串长度是32字节,和实际需要的特征码字节完全不一致,自然扫描不到结果。你用printf打印看起来一样,是因为printf输出的时候会把反斜杠也打印出来,视觉上和硬编码的转义写法显示相同,但实际内存存储的字节完全不一样。
解决方案
你需要额外写一个解析函数,把从文件读取的带\x标记的字符串,逐段转换成对应的十六进制字节值,再传给扫描函数。
示例转换代码:
#include <string> #include <vector> #include <cstdint> #include <cctype> std::vector<uint8_t> parse_pattern(const std::string& input) { std::vector<uint8_t> pattern; size_t len = input.size(); for (size_t i = 0; i < len; ++i) { // 匹配\x开头的十六进制序列 if (input[i] == '\\' && i + 3 < len && input[i+1] == 'x') { char high = input[i+2]; char low = input[i+3]; uint8_t byte = 0; // 解析高位十六进制 if (isdigit(high)) byte |= (high - '0') << 4; else if (tolower(high) >= 'a' && tolower(high) <= 'f') byte |= (tolower(high) - 'a' + 10) << 4; // 解析低位十六进制 if (isdigit(low)) byte |= (low - '0'); else if (tolower(low) >= 'a' && tolower(low) <= 'f') byte |= (tolower(low) - 'a' + 10); pattern.push_back(byte); i += 3; // 跳过已处理的x和两个十六进制字符 } } return pattern; }
使用方式
- 用
std::getline读取文件内容得到strPattern - 调用转换函数得到实际字节数组:
auto pattern = parse_pattern(strPattern); - 传给扫描函数的时候把
pattern.data()作为特征码参数传入即可,注意特征码长度传pattern.size()。
小提示:可以先打印转换后的每个字节的十六进制值,和硬编码的特征码字节做对比,确认转换逻辑正确。
内容的提问来源于stack exchange,提问作者Simir
相关产品推荐
相关产品推荐

