我試圖從我的 dll 呼叫 NtProtectVirtualMemory,它使用以下代碼附加到應用程式:
typedef NTSTATUS(__stdcall* tNtProtectVirtualMemory) (HANDLE, IN OUT PVOID*, IN OUT PULONG, IN ULONG, OUT PULONG);
...
HMODULE Ntdll = GetModuleHandle("ntdll.dll");
if (!Ntdll) {
char outtxt[64];
sprintf(outtxt, "GetModuleHandle error %d", GetLastError());
MessageBox(NULL, outtxt, "error", MB_OK);
}
tNtProtectVirtualMemory OrigNtProtectVirtualMemory = (tNtProtectVirtualMemory)GetProcAddress(Ntdll, "NtProtectVirtualMemory");
if (!OrigNtProtectVirtualMemory) {
char outtxt[64];
sprintf(outtxt, "tNtProtectVirtualMemory is null (%d)", GetLastError());
MessageBox(NULL, outtxt, "error", MB_OK);
}
NTSTATUS sts = OrigNtProtectVirtualMemory(-1, sectionData->address, sectionData->size, protect, &oldProtect);
GetModuleHandle 回傳正確的句柄并且 GetProcAddress 作業正常。NtProtectVirtualMemory 回傳 0xC0000005 (STATUS_ACCESS_VIOLATION)。
現在最有趣的是:VirtualProtect 可以正常作業:
VirtualProtect(sectionData->address, sectionData->size, protect, &oldProtect);
但我必須完全使用 NtProtectVirtualMemory。有任何想法嗎?
uj5u.com熱心網友回復:
與 不同VirtualProtectEx的是,該NtProtectVirtualMemory函式接受一個指標,該指標指向要更改保護的區域的地址,以及一個指向大小的指標:
ULONG oldProtect;
ULONG size = sectionData->size;
PVOID address = sectionData->address;
NTSTATUS sts = OrigNtProtectVirtualMemory((HANDLE)-1, &address, &size, protect, &oldProtect);
添加更多資訊,(HANDLE)-1行程句柄意味著獲取當前行程句柄 - 無需打開當前行程,我通過反轉 ntdll.dll 找到了這一點,但找不到任何有關它的檔案。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/528654.html
標籤:C 温纳皮ntdll
下一篇:獲取特定驅動器的最大檔案大小
