c++从内存中读取字符串

C++ reading string from memory

本文关键字:读取 字符串 内存 c++      更新时间:2023-10-16

我编写了一个连接到进程的dll应用程序。它可以工作,但它只显示第一个字母。
我想要整根弦。字符串长度从2个字母到32个字母。

//READING MEMORY
HANDLE ExeBaseAddress = GetModuleHandleA(0);
char uNameAddr = *(char*)((char*)ExeBaseAddress + 0x34F01C);
printf("%c n", uNameAddr);

我也想理解这些部分:

 *(char*)((char*) //<-- what this is for.

如果可以使用多级指针的话:

char multipoint = *(char*)((char*)ExeBaseAddress + 0x34F01C + 0x123 + 0x321 + 0x20);

我猜这里有问题:

if(uNameAddr == "omnicient")
    cout << "YOU ARE OMNI" << endl;

我使用了用户名omnicient,但它不包含YOU ARE OMNI。我想我的比较是错误的。

%c显示char s(单个字符),%s显示以null结尾的char* s(字符串):

HANDLE ExeBaseAddress = GetModuleHandleA(0);
char *uNameAddr = (char*) ExeBaseAddress + 0x34F01C;
printf("%s n", uNameAddr);

注意,我还整理了指针强制转换,但重要的是我去掉了最后的解引用(前面的*),并将其赋值给char*(指针),而不是char

如果你的字符串不是null结束(不太可能),你将需要使用%.*s并传递你的字符串的长度。

关于你问题的第二部分:

*(char*)((char*) ExeBaseAddress + 0x34F01C)

让我们来分析一下。在括号内(因此要计算的第一件事)是:

(char *) ExeBaseAddress + 0x34F01C

这是一个C类型转换(将HANDLE转换为char*),然后是一个加法。换句话说,它说"将这个东西视为指向某些内存的指针,然后向前看0x34F01C字节的内存"(char始终是1字节)。它现在是一个指向内存中新位置的指针。

然后我们跳出括号,再次转换为char*…不必要的。可以是:

*((char*) ExeBaseAddress + 0x34F01C)

,最后我们解引用(前面的*),它说"现在告诉我你指向的内存位是什么"。但在本例中,您不需要这样做,因为您需要整个字符串,而不仅仅是第一个字母(在printf中,它沿着您发送的内存循环打印每个字符,直到找到0,即NULL)。

char uNameAddr是一个字符,您需要一个字符列表(或char*)

试试这个:

char* name= (char*)((char*)ExeBaseAddress + 0x34F01C);
printf("%s n", name);

*(char*)((char*)是什么意思?

(char*)ExeBaseAddress将ExeBaseAddress作为指向char类型数据的指针

((char*)ExeBaseAddress + 0x34F01C)意味着在上面的指针上添加0x34F01C,以使其偏移0x34F01C字符

(char*)((char*)ExeBaseAddress + 0x34F01C)表示将此新地址视为指向某些字符的指针

*(char*)((char*)ExeBaseAddress + 0x34F01C)取该位置的第一个字符的内容

char uNameAddr = *(char*)((char*)ExeBaseAddress + 0x34F01C);表示将该字符放入名为uNameAddr的char大小的变量中。

基本上你有一个指针,你偏移它,然后取第一个字符并打印它

在这个例子中,我注意到我不使用第一个字符,我把它放在一个指针变量。

然后我在printf中使用%s使其打印出按名称指定的所有字符