mrjbom
@mrjbom

Как модифицировать память программы используя WriteProcessMemory() в C++?

Есть простенькое тестовое приложение

#include <iostream>
#include <Windows.h>
#include <conio.h>

using namespace std;

int main(int argc, char* argv[])
{
	system("title Test Program");
	int value = 100;
	int* ptr = &value;
	cout << "value = " << value << "\naddr = " << ptr << "\n\n";
	for (;;)
	{
		_getch();
		cout << "value = " << ++value << "\naddr = " << ptr << "\n\n";
	}
	return 0;
}


На данный момент имеется вот такой код

#include <iostream>
#include <Windows.h>
#include <WtsApi32.h>
#include <tlhelp32.h>
#include <clocale>

#pragma comment(lib, "wtsapi32.lib")

using namespace std;

int AppIsRun(const LPCWSTR ProcessName, DWORD *ProcessId)
{
	WTS_PROCESS_INFOW * pProcessInfo;
	DWORD               NumProcesses;
	if (NULL == WTSEnumerateProcessesW(WTS_CURRENT_SERVER_HANDLE,
		0, // Reserved.
		1, // Version,
		&pProcessInfo,
		&NumProcesses))
	{
		return EXIT_FAILURE;
	}
	bool ProcessFound = false;
	for (DWORD i = 0; i < NumProcesses; ++i)
		if (!lstrcmpW(pProcessInfo[i].pProcessName, ProcessName))
		{
			ProcessFound = true;
			*ProcessId = pProcessInfo[i].ProcessId;
			break;
		}
	WTSFreeMemory(pProcessInfo);
	return ProcessFound;
}

int main(int argc, char* argv[])
{
	setlocale(LC_ALL, "Russian");
	wchar_t Title[256] = L"Test Program";
	wchar_t ExeName[256] = L"test.exe";
	HWND hWnd = NULL;
	HANDLE processHandle = NULL;
	DWORD ProccessId = NULL;
	if (AppIsRun(ExeName, &ProccessId) && FindWindow(NULL, Title))
	{
		cout << "SUCCESS\n";
		hWnd = FindWindow(NULL, Title);
		processHandle = OpenProcess(PROCESS_ALL_ACCESS, FALSE, ProccessId);
	}
	else
	{
		cout << "ERROR\n";
		if (!AppIsRun(ExeName, &ProccessId))
			cout << "Приложение не запущенно\n";
		if (!FindWindow(NULL, Title))
			cout << "Не верно указан заголовок окна\n";
	}
	return 0;
}


Как используя адрес переменной полученный из первый программы изменить значение самой переменной?
  • Вопрос задан
  • 63 просмотра
Решения вопроса 1
jcmvbkbc
@jcmvbkbc
http://dilbert.com/strip/1998-08-24
Как используя адрес переменной полученный из первый программы изменить значение самой переменной?


DWORD ProcessId = ...;
LPVOID Address = ...;
int value = 500;

processHandle = OpenProcess(PROCESS_VM_WRITE, FALSE, ProccessId);
if (WriteProcessMemory(processHandle, Address, &newValue, sizeof(newValue), NULL))
    printf("Success\n");
else
    printf("Error\n");


В первой программе нужно сделать volatile int value = 100;, чтобы она гарантированно извлекала значение переменной из памяти на каждой итерации цикла.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы