【问题标题】:Read array of bytes from a text file (.txt)从文本文件 (.txt) 中读取字节数组
【发布时间】:2021-12-14 01:49:13
【问题描述】:

我正在用 C++ 编写程序,并且我有一个文本文件,其中包含我想在随机进程的内存中扫描的模式/字节数组(我使用的是 Windows)。

File.txt:内的内容

\x55\x8B\xEC\x83\x44\x0C\x7C\xDF

我设法读取了这个字符串并用 printf() 完美地打印它,但是当我将此字符串作为 const char* 传递给我的模式扫描函数时,它不会在我所说的随机过程中返回函数的地址。

我做了一个奇怪的测试:

DWORD function_address = findpattern(module_from_random_process_here, "\x55\x8B\xEC\x83\x44\x0C\x7C\xDF", mask);

-> 请注意,我在其中硬编码了我的模式,而不是使用我在 File.txt 中读到的模式。

它返回了正确的内存地址,但如果我把从File.txt 读取的模式放入,则在我正在扫描的进程的内存中找不到该地址。但问题是,当我打印从文本文件中读取的模式时,它显示正确!

另一件事:我也做了另一个测试,如果我从File.txt 中读取掩码并使用我在 findpattern 调用中读取的掩码,它可以工作(只是模式“不起作用”)。

有些事情让我觉得这与将 File.txt 中的内容读取为十六进制有关,但我无法使其正常工作。

信息:读取 File.txt 中的模式我很简单,使用 std::ifstreamstd::geline(File.txt, strPattern)

【问题讨论】:

  • 请注意,反斜杠在 c++ 文字中具有特殊含义,但在通用文本文件中没有。
  • 您好,感谢您的回复!你建议我如何修复它?从昨天开始,我正在尝试修复它大约 10 个小时 :(
  • "\x55" 这样的文字字符串由编译器转换为由字节值为0x55 的字符组成的字符串。如果您的文件包含此字符串,您必须编写逻辑来对您从中读取的字符串进行相同的转换。

标签: c++ arrays byte


【解决方案1】:

在读取文件时,您应该始终考虑它的编码。文件中的不同字符可以解释为不同的十六进制值。 例如,让我们使用字符串 \x55\x8B。它可以根据不同的编码转换为不同的number个字符。如果您使用 8 位编码,则可能是两个字符;如果您决定使用 16 位编码系统,则可能是 1 个字符。

如果我理解正确,您希望字符串 \x55\x8B 为 8 个字符。如果是这样,我们需要了解您的文件使用的是哪种编码。您写道该文件包含字符串\x55\x8B\xEC\x83\x44\x0C\x7C\xDF。是二进制数据吗?是 utf-8 吗?也许ASCII?每个选项都有不同的二进制表示。

编辑: 根据 cmets,您需要一个将 \x65 的二进制值转换为字符串“\x65”的逻辑。这个可以用:

int a = 0x65;
std::string str = "\\x" + std::to_string((a >> 4) & 0xFF) + std::to_string(a & 0x0F);

在这里也添加铸造的另一面,也许这会很方便。如果您需要将字符串 "\x65" 转换为其值,请使用:

std::string str= "\\x65";
std::stringstream ss;
int x;
ss << std::hex << str.substr(str.find('x')+1);
ss >> x;

【讨论】:

  • 我的 File.txt 是用 utf-8 编码的。 \x55\x8B 需要表示 2x 字节,因为 findpattern 函数会扫描所有进程内存(逐字节)以查看与我的模式匹配的区域,然后返回内存地址。这就是我想做的。
  • 因此,如果您的文件中有“\x55”,并且您将使用记事本(或任何其他简单的查看器)打开文件,您应该会看到以 U 开头的内容?
  • 当我用 notepad++ 打开我的 File.txt 时,它会出现(正是我写的):\x55\x8B\xEC\x83\x44\x0C\x7C\xDF
  • 检查您从文件中读取了多少字符。如果是 32 个字符,那么我认为问题出在其他地方。如果它是 32 个字符,那么使用我的第二个代码片段将其转换为二进制形式并将其作为 char* 发送到您的函数。您还可以检查从文件中读取的值是否等于硬编码值,如果此测试为真,则问题出在其他地方...
猜你喜欢
  • 1970-01-01
  • 2016-05-03
  • 1970-01-01
  • 2015-05-09
  • 2016-05-27
  • 1970-01-01
  • 2015-03-29
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多