2013-09-23 3 views
2

Итак, я пытаюсь написать программу на C++, чтобы изменить значение в другой программе. В моем случае - калькулятор Windows. Вот код:Memory Hacking/Modifying in C++

#include <iostream> 
#include <windows.h> 

using namespace std; 

int main(void) { 

    int nVal = 2000; 

    HWND hWnd = FindWindowA(0, "Calculator"); 
    if(hWnd == 0){ 
     cerr << "Could not find window." << endl; 
    } else { 
     DWORD PID; 
     GetWindowThreadProcessId(hWnd, &PID); 
     HANDLE hProc = OpenProcess(PROCESS_ALL_ACCESS, false, PID); 

     if(!hProc) { 
      cerr << "Cannot open process." << endl; 
     } else { 
      int stat = WriteProcessMemory(hProc, (LPVOID)0xC6A0EB922C, &nVal, (DWORD)sizeof(nVal), NULL); 

      if(stat > 0){ 
       clog << "Memory written to process." << endl; 
      } else { 
       cerr << "Memory couldn't be written to process." << endl; 
      } 

      CloseHandle(hProc); 

      cin.get(); 

     } 

    } 

    return 0; 
} 

Программа пытается перезаписать одно значение, сохраненное с помощью кнопки «MS» в калькуляторе. Проблема в том, что программа не может этого сделать. Я пытался запустить исполняемый файл как администратор, но ничего не изменилось. Я нашел этот код на видео YouTube, парень использовал XP, я использую Windows 8.

Я нашел 0xC6A0EB922C адрес, используя Чит Engine, а также попытался изменить значение внутри и она работала отлично!

Если кто-нибудь может мне помочь, пожалуйста. Благодаря!

+1

Предполагая, что 'WriteProcessMemory' не удается, вы использовали GetLastError попробовать узнать больше о том, почему он не работает? –

+0

FWIW, документы для 'WriteProcessMemory' указывают, что он возвращает ненулевое значение при успешном завершении и ноль при ошибке, но не более, чем при успешном завершении. – Dan

ответ

5

Исходя из вашего жестко заданного адреса, ваш калькулятор работает как 64-разрядное приложение.

Если ваша программа скомпилирована как 32-разрядная, то жестко закодированный адрес (LPVOID)0xC6A0EB922C будет усечен до 32-битного и, следовательно, будет неправильным.

Чтобы решить эту проблему, вы должны либо скомпилировать свою программу как 64-разрядную, либо использовать 32-разрядный калькулятор в качестве тестовой цели. Он расположен в C:\Windows\SysWOW64\calc.exe.

Функции WinAPI могут выйти из строя, и они делают больше, чем может потребоваться. Всегда проверяйте возвращаемые значения и вызывайте GetLastError(), если произошла ошибка, поэтому вы знаете, почему это не удалось.

Не забудьте запустить вашу программу в качестве администратора или выключить UAC при открытии других процессов.

+0

Да! Большое спасибо, программа работает правильно сейчас и записывает номер в Калькулятор! – jndok

1

В дополнение к тому, что typ1232 говорит, ALSR также может быть на вашем пути. В основном, чтобы скрыть злоумышленников от перезаписи жестко запрограммированных адресов памяти в программах, ALSR будет рандомизировать абсолютное местоположение в адресном пространстве. Я не 100% уверен, что calc.exe использует ASLR, поскольку он должен быть включен во время компиляции (если вы не используете такие инструменты, как EMET)