2015-01-26 2 views
0

거기에 쓴 (^), 나는 C++과 WriteProcessMemory()에 문제가있다. Windows-Calc.exe를 열고 CheatEngine을 열고 저장된 번호를 저장했습니다. : 나는 (그것을 등을 변경)이 프로그램에 넣어 숫자를 발견 (참고 : 나는 독일어 해요; "Rechner"는 "계산기"같음)WriteProcessMemory()가 487을 반환합니까? CheatEngine을 사용하여 발견 된 가치

#include <iostream> 
#include <Windows.h> 
using namespace std; 

int main(){ 
    int Value = 500; 
    HWND hWnd = FindWindow(0, L"Rechner"); 

    if (!hWnd) { 
     cerr << "Can't find window" << endl; 
     return 0; 
     } 

    DWORD PID; 
    GetWindowThreadProcessId(hWnd, &PID); 
    HANDLE hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, PID); 

    if (!hProcess) { 
     cerr << "Process handle error" << endl; 
     return 0; 
     } 
    int iSuccess = WriteProcessMemory(hProcess, (LPVOID)0x899FC6F60C , &Value, (DWORD)sizeof(Value), NULL); 
    int i = 0; 
    while (iSuccess == 0){ 
     i = i+1; 
     cerr << "Failed " << i << " Error: " << GetLastError() << endl; 
     iSuccess = WriteProcessMemory(hProcess, (LPVOID)0x899FC6F60C , &Value, (DWORD)sizeof(Value), NULL); //Here all begins 
     } 
    clog << "Done" << endl; 
    CloseHandle(hProcess); 
    return 0; 
} 

창은 프로세스가 발견되었다 발견되었다 (오류는 없습니다 ..)하지만 "// Here all begins"라인은 0을 반환하고 GetLastError()를 487로 설정합니다. 아시다시피, 내가 잘못한 것, 멍청한 친구라고 묘사 해주세요, 어제 C++을 시작했습니다.

+0

'487'은 (는) 잘못된 주소에 액세스하려고 시도하는 'ERROR_INVALID_ADDRESS'입니다. '0x899FC6F60C'는 계산기 프로세스에서 매핑되지 않은 것 같습니다. 그 주소는 어디에서 왔습니까? –

+0

오류 487은 'ERROR_INVALID_ADDRESS'와 같습니다. 당신이 쓰려고하는 마법의 주소는 무엇입니까? (또는 당신은 그것이 무엇이라고 생각합니까?) – slugonamission

+1

주소를 하드 코딩하는 것은 상당히 의심스러운 접근 방식입니다. 하나 들어, 주소 공간 레이아웃 무작위 화 기능은 그것을 무력화하도록 설계되었습니다. 그러나 가장 일반적인 실패 모드는 32 비트 프로그램에서 64 비트 주소를 사용한다는 것입니다. 따라서 실제로 0x99FC6F60C를 쓰려고합니다. 프로젝트의 플랫폼 대상을 x64로 변경하고 다시 시도하십시오. –

답변

1

GetLastError 코드의 의미에 대한 설명은 link을 참조하십시오.

이 경우 ERROR_INVALID_ADDRESS, 잘못된 주소에 액세스하려고 시도합니다.

이것은 '임의의'메모리 주소에 쓰고 있기 때문입니다. 번호를 가지고이 주소에있는 다른 프로세스에 메모리가 있기를 바랍니다.

+0

특히 각 프로세스에는 자체 가상 주소 공간이 있기 때문에. – dandan78

+0

CheatEngine을 사용하여 주소를 찾았지만 CE에서 나에게 899FC6F60C를주었습니다. 그래서 0x 앞에 붙였습니다. 그게 효과가 있을까요? – ProgrammingDonkey

+1

CheatEngine의 역할에 대해서는 잘 모릅니다. 그리고 현대 운영 체제는 사용자 프로세스를 위해 가상 주소 공간을 무작위로 추출하기 때문에 주소가 맞는지 확실하지 않습니다. 그리고 그것은 응용 프로그램이 시작될 때마다 다를 수 있습니다. – Christopher