串联DWORD

时间:2018-10-18 17:05:32

标签: c memory concatenation dword

我想连接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数据类型以获得内存地址类型变量。任何帮助,如果不胜感激!

3 个答案:

答案 0 :(得分: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);

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

答案 1 :(得分:0)

变量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 <inttypes.h>并执行以下操作:

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);

答案 2 :(得分:0)

您不需要进行任何串联。

在此上下文中,

public void cadastrarTAG(ModeloTAG tag) throws JSONException { ... /* read bytes */ try { final byte[] fileBytes = getFileBytes(new File(tag.getPath)); json.put("image", Base64.encodeToString(fileBytes, Base64.DEFAULT)); } catch (FileNotFoundException e) { // Handle the exception } catch (IOException e) { // Handle the exception } ... } private byte[] getFileBytes(final String path) throw IOException, FileNotFoundException { final FileInputStream fis = new FileInputStream(new File(path)); final ByteArrayOutputStream bos = new ByteArrayOutputStream(); final byte[] buffer = new byte[2048]; int read = 0; while ((read = fis.read(buffer, 0, buffer.length)) > 0) { bos.write(buffer, 0, read); } fis.close(); return bos.toByteArray(); } 只是应用于数字常量的前缀,以指示给定值采用十六进制格式。不论分配给0x的任何值(我假设是指针类型),都可以单独作为第二个参数传递给MemoryAddress