2014-01-13 2 views
0

Просто вставил то, что было необходимо, адреса памяти не записываются, хотя мой журнал показывает, что WriteProcessMemory() был успешным. Кроме того, я дважды проверил, что у меня есть правильные адреса памяти. Спасибо за помощь.WriteProcessMemory C++

char* offsets[][3] = { 
    { "0x3E264", "0", "char[1]" }, 
    { "0x45848", "Auto-Mine", "char[10]" }, 
    { "0x458C0", "Auto-Build", "char[10]" }, 
    //to be continued... 
}; 

HANDLE scHandle = OpenProcess(PROCESS_VM_WRITE | PROCESS_VM_OPERATION, FALSE, ID); 
if (scHandle == NULL) { 
    log << "ERROR: OpenProcess() returned " << GetLastError() << endl; 
    return false; 
} 
DWORD bytesOut; 
for (int a = 0; a < 9; a++) { 
    if (WriteProcessMemory(scHandle, (LPVOID)(wDetectorBaseAddress + (int)strtol(offsets[a][0], NULL, 0)), offsets[a][1], strlen(offsets[a][1]) + 1, &bytesOut)) 
    { 
     log << "WriteProcessMemory() to address " << wDetectorBaseAddress << " + " << (int)strtol(offsets[a][0], NULL, 0) << " = " << wDetectorBaseAddress + (int)strtol(offsets[a][0], NULL, 0) << " with '" << offsets[a][1] << "'; " << bytesOut << " bytes were written" << endl; 
    } 
    else 
    { 
     log << "ERROR: WriteProcessMemory() returned " << GetLastError() << endl; 
     return false; 
    } 
} 
CloseHandle(scHandle); 
+1

Почему это маркировано C? –

+0

удален сейчас .... – mca64

+0

Откуда вы знаете, что это не работает? – Gabe

ответ

1

Вам нужно позвонить VirtualProtect с PAGE_EXECUTE_READWRITE, прежде чем можно написать в память процесса. После написания вам необходимо восстановить оригинальную защиту.

Другое дело, как именно вы знаете, что эти адреса всегда одинаковы? Можете ли вы подтвердить, что он никогда не меняется?

Примечание: вам также необходимо позвонить FlushInstructionCache после записи.

+0

У меня есть другой вопрос. Я использую код similair в Delphi (WriteProcessMemory в цикле, байты прокручиваются на каждом шаге) без VirtualProtect, и он работает там. Зачем? – mca64

+0

Я не уверен, почему это будет работать в delphi, а не C++, но я знаю, что если вы пытаетесь записать в память процесса, вы ДОЛЖНЫ называть виртуальную защиту, если память недоступна, поэтому код Delphi может иметь странное поведение когда дело доходит до написания других процессов. Это работало для вас? – Brandon

+0

Я расскажу вам позже. Этот вопрос для моего друга. В delphi я использую это для другого процесса. Он использует это для одного и того же процесса (сначала вводит dll, а затем использует WriteProcessMemory), так что, возможно, здесь проблема – mca64

Смежные вопросы