首页
学习
活动
专区
圈层
工具
发布

级联DWORD
EN

Stack Overflow用户
提问于 2018-10-18 17:05:31
回答 3查看 134关注 0票数 0

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

代码语言:javascript
复制
#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数据类型,以便获得内存地址类型变量。任何帮助,如果非常感谢!

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2018-10-18 18:07:31

如果我正确理解了,您希望将包含例如"DEADBEEF"的字符串中的值转换为整数值0xDEADBEEF?您正在寻找strtol函数家族。

代码语言:javascript
复制
void *ptr = (void *)strtoull("DEADBEEF", NULL, 16);

然后你可以:

代码语言:javascript
复制
ReadProcessMemory(handle, ptr, &ValueOfAddress, sizeof(ValueOfAddress), 0);
printf("Value Of Address %p Is %d", ptr, ValueOfAddress);

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

票数 1
EN

Stack Overflow用户

发布于 2018-10-18 17:58:59

变量MemoryAddress中的数据是一个指针,而不是字符串。在将其与其他字符组合之前,需要将其转换为字符串。C不自动完成此转换。

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

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

代码语言:javascript
复制
printf("Value At Address %p Is %d", (void *)MemoryAddress, ValueOfAddress);

这方面的问题是,C中的指针是抽象的,可能不是一个简单的数字(例如,它们可能是两个部分,如“段:偏移”);指针的显示方式必须是实现定义的,以便代码可以移植,而且因为它的实现定义了它可以或者不使用十六进制,并且可以或者很多不使用0x前缀(取决于编译器的感觉)。

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

若要强制指针为单个数字,并强制printf()以十六进制形式显示该单个数字(没有0x后缀);如果使用的是C99 (或更高版本),则可以#include <inttypes.h>并执行以下操作:

代码语言:javascript
复制
printf("Value At Address " PRIXPTR " Is %d", (uintptr_t)MemoryAddress, ValueOfAddress);

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

代码语言:javascript
复制
printf("Value At Address 0x" PRIXPTR " Is %d", (uintptr_t)MemoryAddress, ValueOfAddress);
票数 0
EN

Stack Overflow用户

发布于 2018-10-18 18:12:00

你不需要做任何连接。

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52879164

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档