【问题标题】:Concatenate DWORDs连接 DWORD
【发布时间】:2018-10-18 17:05:31
【问题描述】:

我想连接 2 个非字符串类型,以便我可以将它们用作一个。 这是我的代码的主要部分:

#include<stdio.h>
#include<string.h>
#include<windows.h>

int main() {
    HANDLE hwnd = FindWindowA(NULL, "MyProgram");
    DWORD ProcessId; GetWindowThreadProcessId(hwnd, &ProcessId);
    HANDLE handler = OpenProcess(PROCESS_ALL_ACCESS, FALSE, ProcessId);
    ... ??? (type im not sure about) = 0x;          ??? ...
    ... ??? (type im not sure about) MemoryAddress; ??? ...
    int ValueOfAddress;
    ReadProcessMemory(handle, (LPVOID)(concatenated 0x+MemoryAddress), &ValueOfAddress, sizeof(ValueOfAddress), 0);
    printf("Value Of Address %? Is %d", (concatenated 0x+MemoryAddress), ValueOfAddress);
    return 0;
}

我需要将 0x 连接到我通过 ReadProcessMemory 找到的内存地址(例如 0x0023DA44,0x 是 0x,0023DA44 是从内存中读取的值)。感谢您提供的任何帮助:) 抱歉,如果这没有意义,我不太擅长解释。基本上我需要知道如何连接到 DWORD 数据类型以获得内存地址类型变量。任何帮助,如果不胜感激!

【问题讨论】:

  • 您可能应该尝试寻找培训来学习 C,而不是玩弄“我不确定”; C 很难学会不进行猜测工作编程
  • 是的,我明白你们在说什么,但我确实知道我在做什么>.> 我只是觉得很难解释,因为我以前从未使用这些函数遇到过这个问题 :) 谢谢回复虽然

标签: c memory concatenation dword


【解决方案1】:

如果我理解正确,您想从包含例如的字符串转换一个值。 "DEADBEEF" 到整数值 0xDEADBEEF?您正在寻找strtol 系列函数。

void *ptr = (void *)strtoull("DEADBEEF", NULL, 16);

你可以这样做:

ReadProcessMemory(handle, ptr, &ValueOfAddress, sizeof(ValueOfAddress), 0);
printf("Value Of Address %p Is %d", ptr, ValueOfAddress);

请注意,该代码中没有错误检查(特别是,您应该检查值是否适合指针并且字符串是有效的十六进制)。

【讨论】:

  • 谢谢你,这帮助我解决了大问题:)!
【解决方案2】:

变量MemoryAddress中的数据是一个指针,而不是字符串。它需要先转换成一串字符,然后才能与其他字符组合。 C 不会自动进行这种转换。

printf() 函数能够接受指针(以及整数和其他类型的数字)并在打印之前将它们转换为字符。这就是格式说明符的作用(例如,%d 表示“获取下一个参数并将其从有符号 int 转换为字符,然后在此时插入字符”)。

换句话说,您可以这样做:

printf("Value At Address %p Is %d", (void *)MemoryAddress, ValueOfAddress);

问题在于 C 中的指针是抽象的,可能不是一个简单的数字(例如,它们可能是两部分,如“segment:offset”);以及如何显示指针必须由实现定义,以便代码可以移植,并且由于它的实现定义它可能使用或不使用十六进制,并且可能或许多不使用 0x 前缀(取决于编译器的感觉)。

换句话说; %p 的意思是“获取下一个参数并使用对特定 CPU 类型有意义的任何内容将其从 void 指针转换为字符,然后在此处插入字符”。

强制指针为单个数字并强制printf() 以十六进制显示该单个数字(不带0x 后缀);如果您使用的是 C99(或更高版本),您可以 #include &lt;inttypes.h&gt; 并执行以下操作:

printf("Value At Address " PRIXPTR " Is %d", (uintptr_t)MemoryAddress, ValueOfAddress);

现在我们回到最初的问题——如何连接0x 后缀? C 内部并不真正支持运行时连接(例如,您需要使用与字符串相关的库函数 - 例如strcat()),并且仅在内部支持编译时字符串连接;并将MemoryAddress 转换为字符,然后与strcat() 进行连接,然后打印连接的字符串会很麻烦。最简单的解决方案是避免串联,而是将0x 放入格式字符串中,如下所示:

printf("Value At Address 0x" PRIXPTR " Is %d", (uintptr_t)MemoryAddress, ValueOfAddress);

【讨论】:

    【解决方案3】:

    你不需要做任何连接。

    0x 在此上下文中只是应用于数字常量的前缀,以指示给定值是十六进制格式。无论分配给MemoryAddress 的值(我假设它是一个指针类型),都可以作为第二个参数单独传递给ReadProcessMemory

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-12-11
      • 2012-02-27
      • 1970-01-01
      • 1970-01-01
      • 2017-10-08
      • 2011-10-30
      • 2017-09-28
      • 1970-01-01
      相关资源
      最近更新 更多