2014-01-13 1 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

어떻게 작동하지 않는 것을 알고 있습니까? cheatengine에서 – Gabe

답변

1

당신은 당신이 프로세스의 메모리에 기록 할 수 있습니다 전에 PAGE_EXECUTE_READWRITEVirtualProtect를 호출해야합니다. 서면 작성 후 원래 보호를 복원해야합니다.

또 다른 점은 그 주소가 항상 정확히 같은지 어떻게 알 수 있습니까? 결코 바뀌지 않는다는 것을 확인할 수 있습니까?

참고 : 서면 작성 후 FlushInstructionCache으로 전화해야 할 수도 있습니다.

+0

다른 질문이 있습니다. 필자는 VirtualProtect없이 Delphi에서 Similair 코드 (WriteProcessMemory 루프, 바이트가 모든 단계에서 실행 됨)를 사용합니다. 왜? – mca64

+0

델파이가 아닌 C++이 아닌 이유는 모르겠지만 프로세스의 메모리에 쓰려고한다면 메모리가 접근 가능하지 않으면 가상 보호를 호출해야합니다. 따라서 델파이 코드가 이상한 동작을 할 수 있습니다 다른 프로세스에 글쓰기에 관해서. 그래도이게 효과가 있었 니? – Brandon

+0

나중에 알려 드리겠습니다. 이 질문은 내 친구를위한 것입니다. 델파이에서 나는 이것을 다른 프로세스에 사용한다. 그는 동일한 프로세스 (첫 번째 dll을 누른 다음 WriteProcessMemory를 사용)에 이것을 사용하여 아마 여기에 문제가있다. – mca64

관련 문제