簡體   English   中英

寫入和讀取結構到文件

[英]Write and read struct to file

我在嘗試將結構保存到新的PE部分然后閱讀時遇到問題。 該結構看起來像:

    #pragma pack(push, 1)
typedef struct _SCRIPT_STRUCT
{
     DWORD dwKeySize;
     unsigned char *lpKeyBuffer;
     DWORD dwScriptSize;
     unsigned char *lpScriptBuffer;
} SCRIPT, *PSCRIPT;
#pragma pack(pop)

lpKeyBuffer是一個隨機的十六進制值(0-255)數組,而lpScriptBuffer包含一個加密的(RC4)腳本(如果重要的話,請使用Lua)。

我認為該結構已成功寫入創建的新部分中,但我無法讀取緩沖區。

(寫作):

SCRIPT tScript;

tScript.dwKeySize = KEY_SIZE;
tScript.lpKeyBuffer = new unsigned char[tScript.dwKeySize];
GenerateKey(tScript.lpKeyBuffer, KEY_SIZE);

tScript.dwScriptSize = szScript.size();
tScript.lpScriptBuffer = new unsigned char[tScript.dwScriptSize];
memcpy(tScript.lpScriptBuffer, szScript.c_str(), tScript.dwScriptSize);
tScript.lpScriptBuffer = (unsigned char*)szScript.c_str();

rc4_encryption(tScript.lpScriptBuffer, tScript.dwScriptSize, tScript.lpKeyBuffer, tScript.dwKeySize);

DWORD dwScriptStructSize = sizeof(DWORD) + tScript.dwKeySize + sizeof(DWORD) + tScript.dwScriptSize;
char lpStructBuffer[dwScriptStructSize];
ZeroMemory(lpStructBuffer, dwScriptStructSize);
memcpy(lpStructBuffer, &tScript, dwScriptStructSize);

//CreateFile, create new section, etc
SetFilePointer(hCurrent, LastHeader->PointerToRawData, NULL, FILE_BEGIN);
WriteFile(hCurrent, lpStructBuffer, dwScriptStructSize, &dwRead, 0);

(讀):

SCRIPT tScript;
memcpy(&tScript, lpScriptBuffer, dwSectionSize);

tScript.lpKeyBuffer = new unsigned char[tScript.dwKeySize];
tScript.lpKeyBuffer[tScript.dwKeySize] = 0x00;

tScript.lpScriptBuffer = new unsigned char[tScript.dwScriptSize];
tScript.lpScriptBuffer[tScript.dwScriptSize] = 0x00;

printf("dwScriptSize = %lu\n", tScript.dwScriptSize);
printf("dwKeySize = %lu\n", tScript.dwKeySize);
rc4_encryption(tScript.lpScriptBuffer, tScript.dwScriptSize, tScript.lpKeyBuffer, tScript.dwKeySize);

printf("script: %s\n", tScript.lpScriptBuffer);

DWORD輸出正確,但最后一個printf顯示奇怪的符號。

您不能從一個進程中保存指向文件的指針,而不能從另一進程中讀取它們並期望它能工作。 指針通常在每個進程中都是唯一的,尤其是對於動態分配的數據而言。 當您從另一個進程(即使是同一程序)的文件中讀取指針時,該指針將不再指向分配的數據,它將只是一個“隨機”雜散指針,並對其取消引用(就像您在打印時所做的那樣)它作為字符串)將導致未定義的行為

您需要將字符串與結構分開保存。 讀取時很容易,因為您具有可變長度數據的大小,並且知道數據的存儲位置(相對於結構)。


shrike的評論使我思考並仔細研究了您提供的代碼。 它還不完整,所以這都是猜測工作,但是實際問題實際上可能與我上面描述的有所不同。

讓我們看一下您的“閱讀”代碼中的幾行內容(實際上並沒有顯示任何閱讀內容):

SCRIPT tScript;
memcpy(&tScript, lpScriptBuffer, dwSectionSize);

tScript.lpKeyBuffer = new unsigned char[tScript.dwKeySize];
tScript.lpKeyBuffer[tScript.dwKeySize] = 0x00;

tScript.lpScriptBuffer = new unsigned char[tScript.dwScriptSize];
tScript.lpScriptBuffer[tScript.dwScriptSize] = 0x00;

現在假設您將結構讀入一個字符緩沖區lpScriptBuffer (類似於在編寫時使用它的方式,盡管實際上並不需要),那么您在上述指針上仍然遇到相同的問題,但是還有另一個問題:您重新分配指向一些新分配的內存的指針。 這一切都很好,但是這里的問題是您實際上並沒有嘗試初始化該內存。 並不是說您真的不能使用顯示的代碼,但這是不重要的。 您不初始化內存的問題恰恰在於,它尚未初始化,因此將具有不確定的內容,看似隨機,並且很可能是無效的文本。 與取消引用雜散指針一樣,使用未初始化的內存也是未定義的行為


還有另一個問題:您超出了分配的內存范圍。 如您所希望的那樣,數組中的索引從零開始。 因此,如果分配size字節,則有效索引從0 (到包括)到size - 1

由於您分配了例如tScript.dwKeySize字節的內存,因此頂部索引是tScript.dwKeySize - 1但隨后您使用tScript.dwKeySize作為索引,這超出了范圍,並再次導致未定義的行為。

如果大小尚未包含字符串終止符,則需要分配tScript.dwKeySize + 1個字節。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM