[C++] Вытащить значение адресса из процесса

Discussion in 'С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby' started by Solker, 26 Nov 2008.

  1. Solker

    Solker Elder - Старейшина

    Joined:
    4 May 2006
    Messages:
    175
    Likes Received:
    53
    Reputations:
    18
    Все наверное знают программу ArtMoney.
    Допустим мы из какой-нить простенькой игры хотим вытащить значение. Тот же сапер, находим адресс в процессе, которые несет в себе информацию по количеству мин оставшихся на поле. Ну не суть какой, например мы нашли его: 01005194 .
    Теперь собственно вопрос, как написать простейшее приложение на Си, которое будет вытаскивать из этой программы, по данному адрессу его значение.

    т.е запускаем, она находит процесс, выдирает значение у этого адресса и выдает нам:
    Мин осталось: 55

    Си знаю на уровне cout << "Hello, i'm noob";
    Буду рад ссылкам на умные ресурсы.
     
  2. Jes

    Jes Elder - Старейшина

    Joined:
    16 Apr 2007
    Messages:
    370
    Likes Received:
    391
    Reputations:
    34
    WinApi + ReadProcessMemory ?
     
  3. Solker

    Solker Elder - Старейшина

    Joined:
    4 May 2006
    Messages:
    175
    Likes Received:
    53
    Reputations:
    18
    Спасибо, вот что получилось:
    Code:
    #include <iostream.h>
    #include <windows.h>
    
    int main()
    {
        HANDLE hProcess = OpenProcess(PROCESS_VM_READ, FALSE, 3564);
        if(hProcess)
        {
            DWORD dwRead;
            WORD dos_signature;
            if(ReadProcessMemory(hProcess, (LPVOID)0x01005194, &dos_signature, sizeof(dos_signature), &dwRead))
            {
                cout << dos_signature;
            }
        }
    }
    
    И что значит (LPVOID)0x01005194 - (LPVOID). И как представтиь ее в виде отдельнйо переменной, а не пихать прямо в функцию, Пробывал void, const void, int, DWORD и прочее.. всегда ошибки возникают.

    2) Я работаю в консоле, и заношу в цыкл, чтение из памяти программы. И хочу что бы он мне не писал постоянно новое значение, а просто заменял старое. Т.е.
    щяс он мне выводит 2 2 2 2 2 3 3 3 3 3 4 4 4 4 44 5 5 5 5 5 5.
    А хотелось бы, что бы на экране была всегда одна цыфра, которую он бы изменял.. Надеюсь правильно выразился.
     
    #3 Solker, 26 Nov 2008
    Last edited: 26 Nov 2008
  4. 0x0c0de

    0x0c0de Elder - Старейшина

    Joined:
    25 May 2007
    Messages:
    441
    Likes Received:
    395
    Reputations:
    297
    1)LPVOID == void *
    2)
    Code:
    HANDLE hCons = GetStdHandle(STD_OUTPUT_HANDLE);
    int i=0;
    CONSOLE_SCREEN_BUFFER_INFO ConsoleScreenBufferInfo;
    while(true){
    	GetConsoleScreenBufferInfo(hCons,&ConsoleScreenBufferInfo);
    	printf("%X",i);
    	SetConsoleCursorPosition(hCons,ConsoleScreenBufferInfo.dwCursorPosition);
    	i++;
        Sleep(100);
    }