一、WriteProcessMemory崩潰
WriteProcessMemory函數通常與其他函數一起使用,以在進程中寫入數據。但是,當使用該函數時,有時會遇到崩潰問題,導致程序無法正常運行。在這種情況下,需要注意以下幾點:
1、確保傳遞給WriteProcessMemory函數的參數正確,包括進程句柄,內存地址和數據長度等。
2、確保程序具有足夠的權限來修改目標進程中的內存。如果程序以用戶權限運行,那麼可能無法修改系統級進程的內存。
3、嘗試使用VirtualProtectEx函數修改目標進程內存的保護屬性。在某些情況下,數據寫入進程內存時可能會被阻止。
HANDLE hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, targetProcessId);
if (hProcess != NULL) {
// write data to target process memory
if (WriteProcessMemory(hProcess, (LPVOID)address, buffer, bufferSize, NULL)) {
// data write successfully
} else {
// something went wrong
}
} else {
// unable to open target process
}
二、WriteProcessMemory不能寫入
在某些情況下,WriteProcessMemory函數無法將數據寫入目標進程內存中。這可能是由於以下幾個原因導致:
1、試圖向只讀內存寫入數據。
2、試圖向受保護內存區域寫入數據。
3、試圖向沒有足夠可用空間的進程寫入數據。
4、試圖向未正確初始化的內存寫入數據。
為了解決這些問題,開發人員可以嘗試使用VirtualProtectEx函數來修改內存區域的保護屬性。此外,可以使用VirtualAllocEx函數在目標進程中分配新的內存區域,並將數據寫入該區域。
HANDLE hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, targetProcessId);
if (hProcess != NULL) {
// allocate memory in target process
LPVOID remoteBuffer = VirtualAllocEx(hProcess, NULL, bufferSize, MEM_COMMIT, PAGE_EXECUTE_READWRITE);
// write data to target process memory
if (WriteProcessMemory(hProcess, remoteBuffer, buffer, bufferSize, NULL)) {
// data write successfully
} else {
// something went wrong
}
// free allocated memory
VirtualFreeEx(hProcess, remoteBuffer, bufferSize, MEM_RELEASE);
} else {
// unable to open target process
}
三、WriteProcessMemory CPUID
CPUID是一個x86架構上的指令,用於查詢CPU的信息。然而,在某些情況下,CPUID指令可能會被保護,無法在某些應用程序中執行,這可能會影響到使用WriteProcessMemory函數來從目標進程中讀取CPU信息。
為了解決這個問題,可以使用以下代碼來在可執行代碼中執行CPUID指令:
__declspec(naked) void FakeCpuid() {
__asm {
// insert CPUID instructions here
xor eax, eax
cpuid
ret
}
}
// execute CPUID instruction in target process
HANDLE hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, targetProcessId);
if (hProcess != NULL) {
// allocate memory in target process
LPVOID remoteCode = VirtualAllocEx(hProcess, NULL, sizeof(FakeCpuid), MEM_COMMIT, PAGE_EXECUTE_READWRITE);
// copy code to target process memory
if (WriteProcessMemory(hProcess, remoteCode, &FakeCpuid, sizeof(FakeCpuid), NULL)) {
// execute code in target process
HANDLE hThread = CreateRemoteThread(hProcess, NULL, 0, (LPTHREAD_START_ROUTINE)remoteCode, NULL, 0, NULL);
if (hThread != NULL) {
WaitForSingleObject(hThread, INFINITE);
// clean up
CloseHandle(hThread);
}
}
// free allocated memory
VirtualFreeEx(hProcess, remoteCode, sizeof(FakeCpuid), MEM_RELEASE);
} else {
// unable to open target process
}
四、WriteProcessMemory和memcpy
memcpy函數用於從一個內存區域複製數據到另一個內存區域。而WriteProcessMemory函數則用於從當前進程向另一個進程中的內存區域寫入數據。它們的區別在於memcpy僅能在本進程內部使用,而WriteProcessMemory則可以將數據寫入其他進程的內存中。
當需要在當前進程內部複製大量數據時,使用memcpy函數會更快一些。但是,如果需要將數據傳輸到其他進程中,就必須使用WriteProcessMemory函數。
五、WriteProcessMemory基址加偏移
在使用WriteProcessMemory函數寫入目標進程中的內存時,需要指定內存地址。通常情況下,這個地址是由目標進程中的基地址和偏移量組成的。 開發人員可以通過通過使用VirtualQueryEx函數來查詢內存區域的信息,從而獲取基地址和偏移量。
// get memory information MEMORY_BASIC_INFORMATION memInfo; VirtualQueryEx(hProcess, (LPCVOID)address, &memInfo, sizeof(memInfo)); // calculate base address and offset uintptr_t base = (uintptr_t)memInfo.AllocationBase; ptrdiff_t offset = (ptrdiff_t)((uintptr_t)address - base);
六、WriteProcessMemory函數
WriteProcessMemory函數用於將數據寫入目標進程的內存中。
參數:
1、hProcess:指向目標進程的句柄。
2、lpBaseAddress:指向要寫入數據的內存地址。
3、lpBuffer:指向用於存儲寫入數據的緩衝區。
4、nSize:指定要寫入的數據的大小。
5、lpNumberOfBytesWritten:指向存儲已寫入的數據大小的變量的指針。
返回值:
如果函數成功則返回非零值,否則返回零。
HANDLE hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, targetProcessId);
if (hProcess != NULL) {
// write data to target process memory
if (WriteProcessMemory(hProcess, (LPVOID)address, buffer, bufferSize, NULL)) {
// data write successfully
} else {
// something went wrong
}
} else {
// unable to open target process
}
七、WriteProcessMemory用法
在使用WriteProcessMemory函數時,需要注意以下幾個方面:
1、確保傳遞給WriteProcessMemory函數的參數正確,包括進程句柄,內存地址和數據長度等。
2、確保程序具有足夠的權限來修改目標進程中的內存。如果程序以用戶權限運行,那麼可能無法修改系統級進程的內存。
3、嘗試使用VirtualProtectEx函數修改目標進程內存的保護屬性。在某些情況下,數據寫入進程內存時可能會被阻止。
4、如果無法將數據寫入目標進程內存,則可以嘗試使用VirtualAllocEx函數在目標進程中分配新的內存區域,並將數據寫入該區域。
5、在使用WriteProcessMemory函數寫入目標進程中的內存時,需要注意指定正確的內存地址,通常情況下,這個地址是由目標進程中的基地址和偏移量組成的。
HANDLE hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, targetProcessId);
if (hProcess != NULL) {
// allocate memory in target process
LPVOID remoteBuffer = VirtualAllocEx(hProcess, NULL, bufferSize, MEM_COMMIT, PAGE_EXECUTE_READWRITE);
// write data to target process memory
if (WriteProcessMemory(hProcess, remoteBuffer, buffer, bufferSize, NULL)) {
// data write successfully
} else {
// something went wrong
}
// free allocated memory
VirtualFreeEx(hProcess, remoteBuffer, bufferSize, MEM_RELEASE);
} else {
// unable to open target process
}
原創文章,作者:RGXK,如若轉載,請註明出處:https://www.506064.com/zh-hant/n/147588.html
微信掃一掃
支付寶掃一掃