c++从内存中读取字符串
C++ reading string from memory
我编写了一个连接到进程的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
,即