2012-01-02 61 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