Перейти к содержанию

Управление памятью процесса - изнутри (.dll)


RockHammer

Рекомендуемые сообщения

Добрый день.

 

Худо-бедно разобрался с directx hook'ом. Нарисовал менюшку (пока не совсем совершенную)

Теперь вопросик: как управлять памятью и мыслями людей? ну или процесса?

Я знаю как это делается "извне", тоесть из отдельной проги - Write/Read ProcessMemory, однако где-то слышал, что изнутри такой метод не работает (или не актуален)

Мол, когда ты заинжектил своего штирлица в стан врага - тебе открывается доступ ко всему внутреннему адресном пространству.

 

Сама задача: Собственно, адреса есть. Нужно в эти адреса писать байты (или делать aobscan)

 

Ссылка на комментарий
Поделиться на другие сайты

Почему ? работает как WriteProcessMemory так и ReadProcessMemory

 

Бред. Эти функции используются для доступа к процессу извне. А если ты внутри процесса, то можешь читать/писать любой адрес (писать, разумеется, если стоит флаг записи на регион памяти).

Ссылка на комментарий
Поделиться на другие сайты

Привет! Как уже правильно подметил Xipho, тебе нужны права к нужной странице памяти. Это делается через VirtualProtect. А для записи можно использовать хоть [memcpy], хоть побайтное копирование ручками. Суть в том, что dll и игра имеют общее адресное пространство, так что не нужен хэндл и доступ к самому процессу - ты уже в нем находишься. Нужны права на запись\чтение и все.

Ссылка на комментарий
Поделиться на другие сайты

Привет! Как уже правильно подметил Xipho, тебе нужны права к нужной странице памяти. Это делается через VirtualProtect. А для записи можно использовать хоть [memcpy], хоть побайтное копирование ручками. Суть в том, что dll и игра имеют общее адресное пространство, так что не нужен хэндл и доступ к самому процессу - ты уже в нем находишься. Нужны права на запись\чтение и все.

А можно какой-нибудь пример реализации?

Ссылка на комментарий
Поделиться на другие сайты

Так я ж уже все написал. DLL ты сделал? Сделал. В память игры ее подгрузить можешь? Можешь. Дальше тебе нужно знать куда писать (а нужные адреса памяти ты уже нашел), удостовериться, что можешь писать - через VirtualProtect, указав что по адресу, куда ты будешь писать, N байт, которые ты будешь писать, надо сделать не read-only (только для чтения, как обычно и есть), а read-write (чтобы можно было и читать и писать). После этого ты вызываешь memcpy, скормив ей адрес *куда* копировать (адрес кода в игре), *откуда* копировать (место в твоей DLL, куда записаны байты новой инструкции, скажем, nop, и сколько байт - это N, то есть длина инъекции. Потом только остается через еще один вызов VirtualProtect установить на место оригинальные настройки защиты памяти - при первом вызове эта функция попросит переменную, куда сохранять.

 

Вот и все, в общем-то.

Ссылка на комментарий
Поделиться на другие сайты

Так я ж уже все написал. DLL ты сделал? Сделал. В память игры ее подгрузить можешь? Можешь. Дальше тебе нужно знать куда писать (а нужные адреса памяти ты уже нашел), удостовериться, что можешь писать - через VirtualProtect, указав что по адресу, куда ты будешь писать, N байт, которые ты будешь писать, надо сделать не read-only (только для чтения, как обычно и есть), а read-write (чтобы можно было и читать и писать). После этого ты вызываешь memcpy, скормив ей адрес *куда* копировать (адрес кода в игре), *откуда* копировать (место в твоей DLL, куда записаны байты новой инструкции, скажем, nop, и сколько байт - это N, то есть длина инъекции. Потом только остается через еще один вызов VirtualProtect установить на место оригинальные настройки защиты памяти - при первом вызове эта функция попросит переменную, куда сохранять.

 

Вот и все, в общем-то.

Эм... Я имел ввиду пример кода)

Ссылка на комментарий
Поделиться на другие сайты

Так ведь я тебя прекрасно понял. Алгоритм я тебе описал, все необходимое у тебя есть, описания функций, если не очень понятны, можно легко посмотреть в интернете. Берешь и пробуешь написать, а если что-то не получается - спрашиваешь.

Ссылка на комментарий
Поделиться на другие сайты

Так ведь я тебя прекрасно понял. Алгоритм я тебе описал, все необходимое у тебя есть, описания функций, если не очень понятны, можно легко посмотреть в интернете. Берешь и пробуешь написать, а если что-то не получается - спрашиваешь.

BOOL WINAPI VirtualProtect(_In_   LPVOID lpAddress,_In_   SIZE_T dwSize,_In_   DWORD flNewProtect,_Out_  PDWORD lpflOldProtect);

первый аргумент - адрес. Врятли, это мой адрес для записи байтов. Что тут указывать?

второй - размер. Размер... памяти, в которой меняется защита?

третий - новая защита. скорее всего, создаем переменную oldProtectMemory = 0; (или что-то в этом роде)

четвертый - старая защита. Что ему передавать? ReadOnly? 

/*======================================== */

memcpy, так и не разобрался, что ей передавать.

Изменено пользователем RockHamer
Ссылка на комментарий
Поделиться на другие сайты

Первый - это адрес начала страницы памяти, защиту которой поменять надо. Так что да, это адрес для записи байт.

Второй - размер региона в байтах, защита которого будет изменена.

Третий - какую защиту ставить. Нас тут интересует PAGE_EXECUTE_READWRITE.

Четвертый - указатель на 4 байта (DWORD) переменную, куда запишется старая защита.

 

Про memcpy вот [отсюда] что не ясно?

Ссылка на комментарий
Поделиться на другие сайты

Первый - это адрес начала страницы памяти, защиту которой поменять надо. Так что да, это адрес для записи байт.

Второй - размер региона в байтах, защита которого будет изменена.

Третий - какую защиту ставить. Нас тут интересует PAGE_EXECUTE_READWRITE.

Четвертый - указатель на 4 байта (DWORD) переменную, куда запишется старая защита.

 

Про memcpy вот [отсюда] что не ясно?

 

Таак, посмотрел уроки кодера. Там хоть и смутно, но понятно.

DWORD WINAPI ProtectHacker(LPVOID){	DWORD oldProtect = 0;	int Size = 5;	int address1 = 0xFD9101;	VirtualProtect((void*)address1, Size, PAGE_EXECUTE_READWRITE, &oldProtect);	memcpy((void*)address1, (PBYTE) "\xEB\xD4\x90\x90\x90", 5);	VirtualProtect((void*)address1, Size, oldProtect, &oldProtect);}

Вот мой код, уже переделаный. Собственно, все круто. Но студия говорит, что:

 

IbCo22uYq7c.jpg

 

на видео у кодера она ничего не возвращает, и у него все работает.

У кодера волшебная студия?

Изменено пользователем RockHamer
Ссылка на комментарий
Поделиться на другие сайты

Раз должна возвращать - значит где-то есть return. И списывать из видео код без понимания того, как он работает и что делает - незачем, толку от этого не будет. Пиши лучше сам.

Ссылка на комментарий
Поделиться на другие сайты

Раз должна возвращать - значит где-то есть return. И списывать из видео код без понимания того, как он работает и что делает - незачем, толку от этого не будет. Пиши лучше сам.

написал)

изменил DWORD на void

void WINAPI ProtectHacker(LPVOID){	DWORD oldProtect = 0;	char ByteForProtect[] =  "\xEB\xD4\x90\x90\x90";	char ByteForHDD[] = "\x84\xC0\x90\x90";	int SizeProtect = 5;	int SizeHDD = 4;	int protectDisabler1 = 0xFD9101;	int protectDisabler2 = 0x11786AC;	int protectDisabler3 = 0xA13D98;	int hardHacker1 = 0x95E0C8;	int hardhacker2 = 0x95E0CA;	/* Выключение систем защиты #1 */	VirtualProtect((void*)protectDisabler1, SizeProtect, PAGE_EXECUTE_READWRITE, &oldProtect);	memcpy((void*)protectDisabler1, (PBYTE) ByteForProtect, 5);	VirtualProtect((void*)protectDisabler1, SizeProtect, oldProtect, &oldProtect);	/* Выключение систем защиты #2 */	VirtualProtect((void*)protectDisabler2, SizeProtect, PAGE_EXECUTE_READWRITE, &oldProtect);	memcpy((void*)protectDisabler2, (PBYTE) ByteForProtect, 5);	VirtualProtect((void*)protectDisabler2, SizeProtect, oldProtect, &oldProtect);	/* Выключение систем защиты #3 */	VirtualProtect((void*)protectDisabler3, SizeProtect, PAGE_EXECUTE_READWRITE, &oldProtect);	memcpy((void*)protectDisabler3, (PBYTE)ByteForProtect, 5);	VirtualProtect((void*)protectDisabler3, SizeProtect, oldProtect, &oldProtect);	/* Выключение бана по жесткому диску #1 */	VirtualProtect((void*)hardHacker1, SizeHDD, PAGE_EXECUTE_READWRITE, &oldProtect);	memcpy((void*)hardHacker1, (PBYTE)ByteForHDD, 4);	VirtualProtect((void*)hardHacker1, SizeHDD, oldProtect, &oldProtect);	/* Выключение бана по жесткому диску #2 */	VirtualProtect((void*)hardhacker2, SizeHDD, PAGE_EXECUTE_READWRITE, &oldProtect);	memcpy((void*)hardhacker2, (PBYTE)ByteForHDD, 4);	VirtualProtect((void*)hardhacker2, SizeHDD, oldProtect, &oldProtect);}

все норм, ошибок при написании самой функции не возникло. Однако... Не знаю как воткнуть это в поток.

 

BOOL WINAPI DllMain(HMODULE hDll, DWORD dwReason, LPVOID lpReserved){if (dwReason == DLL_PROCESS_ATTACH) { new_My_Thread(D3d9_Hook); ProtectHacker(LPVOID);}if (d_fun_1 == true) {  }return TRUE;}

студия говорит что использование имени типа не допускается (lpvoid). Плюс, говорит что идентификатор не найден.

что ей нужно?

Изменено пользователем RockHamer
Ссылка на комментарий
Поделиться на другие сайты

Что у тебя делает функция new_My_Thread() и почему нельзя было ProtectHacker декларировать как "void ProtectHacker()"?

new_My_Thread() инициализирует d3d менюшку (ее отрисовку)

всмысле 

почему нельзя было ProtectHacker декларировать как "void ProtectHacker()"?

сама функция Protecthacker уже расписана как тип void. 

Изменено пользователем RockHamer
Ссылка на комментарий
Поделиться на другие сайты

И что ты там вообще взламываешь, что аж проверка по жесткому диску есть?

Он уже честно ответил в соседней теме ;) :

 

будет одна единственная кнопочка "взломать пентагон" (ну или еще что, в зависимости от цели использования).

Изменено пользователем garik66
  • Плюс 1
Ссылка на комментарий
Поделиться на другие сайты

Так, э, почему тогда нельзя в самом начале инициализации эту функцию вызвать?

там не в порядке вызова дело, дело в том, что он отказывается вызывать функцию впринципе.

fTNxjeG1V5s.jpg

вот в чем ошибка. (там если не видно, на верху где LPVOID подчеркнуто компилятором)

 

И что ты там вообще взламываешь, что аж проверка по жесткому диску есть?

 

Он уже честно ответил в соседней теме ;) :

Верно))))) ;)

Изменено пользователем RockHamer
Ссылка на комментарий
Поделиться на другие сайты

Ты в вызов функции ProtectHacker передаешь не переменную типа void*, а сам тип, естественно эта конструкция недопустима.

Ты хоть ошибки читай. что тебе IDE пишет, причем еще и на русском же написано...

Ссылка на комментарий
Поделиться на другие сайты

В общем, ответ жду в личку, тему до выяснения закрываю.

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

Ссылка на комментарий
Поделиться на другие сайты

В общем, ответ жду в личку, тему до выяснения закрываю.

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

 

Понял.

Да онлайн игра это очевидно, а подменяются сигнатуры локального античита ИМХО.

No. Ломаю античит от Ubisoft (AS:Unity). Он действительно локальный, но никакого вреда мультиплееру нанести не может (по крайней мере как задумывалось).

Вопрос актуален. Что передавать функции в потоке?

Изменено пользователем RockHamer
Ссылка на комментарий
Поделиться на другие сайты

LPVOID - это такой тип. Расшифровывается как Long Pointer to VOID. То есть, указатель неопределенного типа. Следовательно, в функцию нужно передать указатель на что-то. Но на что именно - смотри в реализации своей функции.

Ссылка на комментарий
Поделиться на другие сайты

×
×
  • Создать...

Важная информация

Находясь на нашем сайте, Вы автоматически соглашаетесь соблюдать наши Условия использования.