2012-01-02 122 views
3

我正在尝试为应用程序编写一个插件,并且我卡在需要从内存中读取内容并将其存储在类中的内容。我一直在考虑以下几点:在类中存储内存内容 - C++

UserInfo = 0x9F9648 
UserInfoSize = 0x560 

这是内容存储在哪里的位置,我一直在考虑下面的类将其存储在:

class CUserInfo 
{ 
public: 
    __int32 clientNum; //0x0000 
    __int32 Valid; //0x0004 
    char unknown8[4]; //0x0008 
    char Name[16]; //0x000C 
    ... and some other properties 
}; 

的问题是,我不知道如何从地址位置获取内容并将其存储在类实例中。

任何任何想法如何做到这一点?

+0

不是。肯定没有地方存储0x560字节的东西。 – 2012-01-02 18:35:12

+0

将地址存储在指针中并开始读取到最后? @OliCharlesworth,你一定是在开玩笑吧? – atoMerz 2012-01-02 18:37:57

+0

@AtoMerZ:我为什么要开玩笑? – 2012-01-02 18:39:01

回答

5

您可以使用reinterpret_cast<>将整数地址转换为指向任何所需类型的指针,然后取消引用指针。

例如:

CUserInfo user_info; 
user_info.clientNum = *(reinterpret_cast<__int32*>(0x9F9648)); 

当然,这是危险的做法。当您尝试访问任意内存地址时,应该了解访问冲突和对齐错误。

2

如果的UserInfo的CUserInfo是二进制兼容的(都具有字段相同的内存布局),那么你可以做这样的:

CUserInfo* pui = new CUserInfo; 
*pui = *reinterpret_cast<CUserInfo*>(UserInfo); 
+0

如果不知道每个字段,但知道总体布局和大小,可以用char _unk [n]填充这些部分,而n是未知字节数,使此方法工作 – Paranaix 2012-01-02 18:57:22

1

只是你可以这样做:

char* ptr = 0x9F9648; 
CUserInfo obj; 
obj.clientNum = *((__int32*)ptr); 
ptr+=4; // int32 = 4 bytes 
// and so on... 

数组你必须读取一个循环中的每个字节

for(int i=0; i<16; ++i) 
{ 
    obj.Name[i] = *ptr; 
    ++ptr; 
} 
// at this point ptr is updated. No need to increment it 

reinterpret_cast会起作用,除非你在你的课堂中有指针字段。如果你这样做,我认为你必须像上面那样做。

+0

嗨,我也试过你的解决方案但我被卡住了。你能告诉我怎么用char来做到这一点吗?我增加了ptr + = 12; --- obj.Name = *((char *)ptr); ---但是这给了我一个错误:无法从char转换为char [16] ---任何想法如何解决? – w00 2012-01-02 19:13:22

+0

是的,您需要读取循环中字符串的每个字符。现在编辑帖子。 – atoMerz 2012-01-02 19:19:58