我想同時使用兩者VirtualAlloc并將VirtualProtectshellcode 注入本地行程,但我不知道最后一個引數 ( lpflOldProtect) 是什么以及如何宣告它。
void fun()
{
size_t dwSize = 511; // size of shellcode
LPVOID base_add = VirtualAlloc(NULL , dwSize , MEM_RESERVE, PAGE_NOACCESS);
if (base_add == NULL )
{
cout << "Failed to allocate space " << endl;
return ;
}
LPVOID end_add = base_add dwSize;
// change mem protection option
PDWORD lpflOldProtect = 0;
bool change_protection = VirtualProtect(base_add,dwSize,PAGE_EXECUTE_READWRITE, lpflOldProtect );
if (change_protection)
{
cout << "Successfully changed protection" << endl;
}
else
{
cout << " Failed" << endl;
}
}
根據微軟檔案,最后一個引數VirtualProtect是:
指向變數的指標,該變數接收指定頁面區域中第一頁的先前訪問保護值。如果此引數為 NULL 或未指向有效變數,則函式失敗。
他們這是什么意思?指定區域的第一頁的值是多少?不是基地址嗎?
uj5u.com熱心網友回復:
該VirtualProtect函式的第四個(最后一個)引數應該是一個DWORD變數的地址,在該地址中接收記憶體塊(或者準確地說,該塊的第一頁)的先前保護標志的值。如果您愿意,您可以在完成需要更改保護的任何操作后使用它來“重置”該保護級別。
在您的代碼中,您在該PDWORD lpflOldProtect = 0;行中宣告一個指標并為該指標分配一個NULL(零)值 - 因此,根據您鏈接的檔案,您的呼叫VirtualProtect將失敗。
相反,您應該宣告一個實際 DWORD變數并將該變數的地址作為最后一個引數傳遞。在您的情況下,修改后的代碼將如下所示:
DWORD flOldProtect = 0;
BOOL change_protection = VirtualProtect(base_add, dwSize, PAGE_EXECUTE_READWRITE, &flOldProtect);
// Pass address of the DWORD variable ^
if (change_protection)
{
//...
請注意,在鏈接的檔案中,最后一個引數被標記為[out]- 這意味著它在呼叫之前的值未被函式使用,因此您實際上不需要初始化它;但是,一些編譯器和/或代碼分析器可能會抱怨使用未初始化的值,這就是我將其設定為零的原因。
另請注意,函式的回傳值是型別BOOL(在 Windows 系統頭檔案中宣告為typedef int BOOL;),而不是bool; 在大多數情況下,您的代碼進行的隱式轉換不會導致任何問題,但同樣,某些編譯器可能會發出有關該轉換的警告。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/418330.html
標籤:
上一篇:如何檢測行程何時不再存在?
