Чтение памяти процесса - Форум администраторов игровых серверов
Форум администраторов игровых серверов StormWall - Защита от DDos атак
Регистрация Мнения Справка Пользователи Календарь Все разделы прочитаны
Вернуться   Форум администраторов игровых серверов > Полезное / Common > Программирование / Programming

Программирование / Programming
Ищете помощи в написании программы, есть сложность в выполнении задания (в институте и т.д.), пожалуйста, спросите у нас в данном форуме и мы обязательно вам поможем.

Ответ
Опции темы
Непрочитано 13.03.2017, 21:34   #1
Герой

Автор темы (Топик Стартер) Чтение памяти процесса

Собственно через ольгу посмотрел адрес и прочитал сколько нужно, тут вроде всё понятно.
ReadProcessMemory(int hProcess, int lpBaseAddress, byte[] lpBuffer, int dwSize, ref int lpNumberOfBytesRead);
Code: C++
Но после перезапуска приложения адрес меняется, чекать каждый раз руками не вариант, как быть?
__________________
Aka Stels
Shayne вне форума Отправить сообщение для Shayne с помощью Skype™ Ответить с цитированием
Непрочитано 13.03.2017, 22:56   #2
Аватар для n3k0nation
Antihero

По умолчанию Re: Чтение памяти процесса

Никак. Память читается по виртуальным адресам, а не физическим. В каждом новом процессе месторасположение нужных данных - будет меняться.
Можно сканировать память процесса на наличие нужных бинарных паттернов и таким образом определять требуемый адрес.

Как пример, но для посикса (когда-то давно писал, тащемта, в винде даже удобнее должно быть, без всяких ptrace):
Код:
void processScanMemory(pid_t pid, address_t ** addresses, int count) {
	if (ptrace(PTRACE_ATTACH, pid, NULL, NULL)) {
		perror("Failed attach to process");
		return;
	}

	uint8_t bPattern[] = {
			0x48, 0x89, 0x97, 0x00, 0x00, 0x00, 0x00, //mov [rdi+offset], rdx
			0x0f, 0x84, 0x00, 0x00, 0x00, 0x00, //je adr
			0xf3, 0xc3, 0x00, 0x00 //repz ret
	};

	uint8_t bMask[] = {
			0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00,
			0xff, 0xff, 0x00, 0x00, 0x00, 0x00,
			0xff, 0xff, 0x00, 0x00
	};
#define patternSize 4*sizeof(uint32_t)
#define dataSize patternSize+sizeof(uint32_t)
	for (int i = 0; i < count; i++) {
		address_t * adr = addresses[i];
		long int start = adr->start;
		long int end = adr->end;

#ifdef DUMP_X
		char filename[128];
		sprintf(filename, "./%ld_%lx-%lx.dump", (long int)pid, start, end);
		FILE * dumpFd = fopen(filename, "w");
#endif

		fprintf(stdout, "Scanning 0x%lx ... 0%lx\n", adr->start, adr->end);

		uint8_t data[dataSize] = {0};
		for (long int current = start; current < end; current += sizeof(int)) {
			uint32_t word = ptrace(PTRACE_PEEKDATA, pid, (void *) current, NULL);
			memmove(data, data + sizeof(uint32_t), dataSize - sizeof(uint32_t));
			*((uint32_t *)&(data[dataSize - sizeof(uint32_t)])) = word;
			int finded = -1;
			for(int j = 0; j < sizeof(uint32_t); j++) {
				int sub = 1;
				for(int k = 0; k < patternSize; k++) {
					if ((data[k + j] & bMask[k]) != bPattern[k]) {
						sub = 0;
						break;
					}
				}

				if(sub) {
					finded = j;
					break;
				}
			}

			if (finded != -1) {
				for (int a = 0; a < dataSize; a++) {
					fprintf(stdout, "%02x ", data[a] & 0xff);
				}
				fprintf(stdout, "\n");
				fprintf(stdout, "Finded pattern on: 0x%lx (phy offset: 0x%lx)", current, current - start - dataSize - finded);
			}

#ifdef DUMP_X
			fwrite(&word, sizeof(uint32_t), 1, dumpFd);
#endif
		}

#ifdef DUMP_X
		fclose(dumpFd);
#endif
	}

	if(ptrace(PTRACE_DETACH, pid, NULL, NULL)) {
		perror("Failed deattach from process\n");
	}
}
__________________
m0nster.art - clear client patches, linkz to utils & code.
Гадаю по капче.
n3k0nation вне форума Ответить с цитированием
Сказали спасибо:
Непрочитано 17.05.2017, 21:35   #3
Аватар для VOLKyiv
Пользователь

По умолчанию Re: Чтение памяти процесса

Смотря какое значение, если это к примеру деньги в игре, они находятся в какой-то структуре, эта структура создается кем-то. Можно найти статический адресс и от него отталкиватся, чтобы менять значение денег. К примеру:
PHP код:
LPDWORD gameAddr = (LPDWORD)0x12345678;
LPDWORD playerAddr = (LPDWORD)((LPDWORD)*(gameAddr 3));
LPDWORD moneyAddr = (LPDWORD)((LPDWORD)(*playerAddr) + 8);
*
moneyAddr 5000
Но лучше всё это делать с помощью структур. Чтобы не запутаться.
VOLKyiv вне форума Ответить с цитированием
Ответ


Здесь присутствуют: 1 (пользователей: 0 , гостей: 1)
 
Опции темы

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Чтение из сокета Zubastic Программирование / Programming 7 04.03.2016 08:19
[Куплю] [php] чтение текста с изображения Mooni Рынок / Marketplace 8 14.03.2014 03:59
Чтение файла UTF8 [STIGMATED] Java 4 23.11.2012 22:04
Вывод процесса portotiv Курилка / Yak floor 4 27.09.2012 12:46


© 2007–2024 «Форум администраторов игровых серверов»
Защита сайта от DDoS атак — StormWall
Работает на Булке неизвестной версии с переводом от zCarot
Текущее время: 11:59. Часовой пояс GMT +3.

Вверх