2010-01-15 2 views
1

나는 교육 목적으로 Icy Tower 1.4를위한 트레이너를 만들려고합니다.나는 (교육 목적으로) 만들려고하는 트레이너와의 문제

void WPM(HWND hWnd,int address,byte data[]) 
{ 
    DWORD proc_id; 
    GetWindowThreadProcessId(hWnd, &proc_id); 
    HANDLE hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, proc_id); 

    if(!hProcess) 
     return; 

    DWORD dataSize = sizeof(data); 
    WriteProcessMemory(hProcess,(LPVOID)address,&data,dataSize,NULL); 
    CloseHandle(hProcess); 
} 

하고는 얼음 타워 시계 중지해야 함수의 : 다음 orginal 한 AOB있다 else 문에

void ClockHack(int status) 
{ 
    if(status==1)//enable 
    { 
     //crashes the game 
     byte data[]={0xc7,0x05,0x04,0x11,0x45,0x00,0x00,0x00,0x00,0x00}; 
     WPM(FindIcyTower(),0x00415E19,data); 
    } 
    else if(status==0)//disable 
    { 
      byte data[]={0xA3,0x04,0x11,0x45,0x00}; 
    } 
} 

은 그 같은 WriteProcessMemory의 기능을 단축하는 기능을 썼다 Opcode의 상태 매개 변수를 1로 설정하여 ClockHack 함수를 호출하면 게임이 충돌합니다.

치트 엔진에서 나는 코드 케이브를 작성했기 때문에 똑같은 주소에 정확히 쓰지 않습니다.

누군가가 그 이유를 알고 있습니까? 고맙습니다.

덧붙여서 : 교육 목적으로 만 사용됩니다.

답변

2

그런 함수에 배열을 전달할 수 없습니다. byte[] 매개 변수가 byte * 매개 변수와 동일하면 sizeof(data)은 포인터 크기 만 제공합니다. 또한 이미 포인터이므로 &data을 사용하면 안됩니다.

그래서 함수가 보일 것 같은 :

void WPM(HWND hWnd,int address, byte *data, int dataSize) 
{ 
    //.... 
    WriteProcessMemory(hProcess,(LPVOID)address,data,dataSize,NULL); 
    //... 
} 
+0

대신 dataSize 매개 변수 대신 sizeof (데이터)를 사용할 수 있습니까? –

+0

배열이 원래 정의 된 ClockHack 함수에서는 sizeof (data)를 사용할 수 있지만 WPM 함수에서는 사용할 수 없습니다. – interjay

2

배열 바이트 *과 동일 [] 바이트 그래서 항상 참조에 의해 전달되는 함수로 전달되고, 당신은 단지를 작성할 때 먼저 sizeof(byte*) 바이트의 코드. 또는 X86 플랫폼에서 4 바이트.

또한이 코드는 객체 코드라고 생각합니다. 그렇지 않으면이 답변의 나머지 부분을 무시하십시오.

글쎄, 당신이 올바른 위치에 쓰고 있다고 가정하고, 당신이 쓰고있는 것이 정확하다면, 여전히 문제가 있습니다. WriteProcessMemory은 타겟 프로세스에서 실행중인 스레드와 관련해서 원자적일 수 있다고 보장하지 않습니다.

대상 스레드가 일시 중단되었으며 해당 코드 부분에서 실행되지 않아야합니다. 그리고 파이프 라인 및/또는 L1 캐시 디코딩 명령을 플러시하기 위해 수행해야 할 작업이 무엇인지 전혀 알지 못합니다.

편집 : 이제 좀 더 생각했습니다. 나는 뮤텍스를 사용하여 코드가 실행되는 동안이 코드를 덮어 쓰지 않도록 보호하는 것이 스레드를 일시 중단하는 것보다 낫다고 생각한다.