RockHammer Опубликовано 21 января, 2015 Поделиться Опубликовано 21 января, 2015 Добрый день. Худо-бедно разобрался с directx hook'ом. Нарисовал менюшку (пока не совсем совершенную)Теперь вопросик: как управлять памятью и мыслями людей? ну или процесса?Я знаю как это делается "извне", тоесть из отдельной проги - Write/Read ProcessMemory, однако где-то слышал, что изнутри такой метод не работает (или не актуален)Мол, когда ты заинжектил своего штирлица в стан врага - тебе открывается доступ ко всему внутреннему адресном пространству. Сама задача: Собственно, адреса есть. Нужно в эти адреса писать байты (или делать aobscan) Ссылка на комментарий Поделиться на другие сайты Поделиться
DenkA003 Опубликовано 21 января, 2015 Поделиться Опубликовано 21 января, 2015 Почему ? работает как WriteProcessMemory так и ReadProcessMemory Ссылка на комментарий Поделиться на другие сайты Поделиться
Xipho Опубликовано 21 января, 2015 Поделиться Опубликовано 21 января, 2015 В 21.01.2015 в 13:14, DenkA003 сказал: Почему ? работает как WriteProcessMemory так и ReadProcessMemory Бред. Эти функции используются для доступа к процессу извне. А если ты внутри процесса, то можешь читать/писать любой адрес (писать, разумеется, если стоит флаг записи на регион памяти). Ссылка на комментарий Поделиться на другие сайты Поделиться
keng Опубликовано 21 января, 2015 Поделиться Опубликовано 21 января, 2015 Привет! Как уже правильно подметил Xipho, тебе нужны права к нужной странице памяти. Это делается через VirtualProtect. А для записи можно использовать хоть [memcpy], хоть побайтное копирование ручками. Суть в том, что dll и игра имеют общее адресное пространство, так что не нужен хэндл и доступ к самому процессу - ты уже в нем находишься. Нужны права на запись\чтение и все. Ссылка на комментарий Поделиться на другие сайты Поделиться
RockHammer Опубликовано 21 января, 2015 Автор Поделиться Опубликовано 21 января, 2015 В 21.01.2015 в 15:03, keng сказал: Привет! Как уже правильно подметил Xipho, тебе нужны права к нужной странице памяти. Это делается через VirtualProtect. А для записи можно использовать хоть [memcpy], хоть побайтное копирование ручками. Суть в том, что dll и игра имеют общее адресное пространство, так что не нужен хэндл и доступ к самому процессу - ты уже в нем находишься. Нужны права на запись\чтение и все.А можно какой-нибудь пример реализации? Ссылка на комментарий Поделиться на другие сайты Поделиться
keng Опубликовано 21 января, 2015 Поделиться Опубликовано 21 января, 2015 Так я ж уже все написал. DLL ты сделал? Сделал. В память игры ее подгрузить можешь? Можешь. Дальше тебе нужно знать куда писать (а нужные адреса памяти ты уже нашел), удостовериться, что можешь писать - через VirtualProtect, указав что по адресу, куда ты будешь писать, N байт, которые ты будешь писать, надо сделать не read-only (только для чтения, как обычно и есть), а read-write (чтобы можно было и читать и писать). После этого ты вызываешь memcpy, скормив ей адрес *куда* копировать (адрес кода в игре), *откуда* копировать (место в твоей DLL, куда записаны байты новой инструкции, скажем, nop, и сколько байт - это N, то есть длина инъекции. Потом только остается через еще один вызов VirtualProtect установить на место оригинальные настройки защиты памяти - при первом вызове эта функция попросит переменную, куда сохранять. Вот и все, в общем-то. Ссылка на комментарий Поделиться на другие сайты Поделиться
RockHammer Опубликовано 21 января, 2015 Автор Поделиться Опубликовано 21 января, 2015 В 21.01.2015 в 16:17, keng сказал: Так я ж уже все написал. DLL ты сделал? Сделал. В память игры ее подгрузить можешь? Можешь. Дальше тебе нужно знать куда писать (а нужные адреса памяти ты уже нашел), удостовериться, что можешь писать - через VirtualProtect, указав что по адресу, куда ты будешь писать, N байт, которые ты будешь писать, надо сделать не read-only (только для чтения, как обычно и есть), а read-write (чтобы можно было и читать и писать). После этого ты вызываешь memcpy, скормив ей адрес *куда* копировать (адрес кода в игре), *откуда* копировать (место в твоей DLL, куда записаны байты новой инструкции, скажем, nop, и сколько байт - это N, то есть длина инъекции. Потом только остается через еще один вызов VirtualProtect установить на место оригинальные настройки защиты памяти - при первом вызове эта функция попросит переменную, куда сохранять. Вот и все, в общем-то.Эм... Я имел ввиду пример кода) Ссылка на комментарий Поделиться на другие сайты Поделиться
keng Опубликовано 21 января, 2015 Поделиться Опубликовано 21 января, 2015 Так ведь я тебя прекрасно понял. Алгоритм я тебе описал, все необходимое у тебя есть, описания функций, если не очень понятны, можно легко посмотреть в интернете. Берешь и пробуешь написать, а если что-то не получается - спрашиваешь. Ссылка на комментарий Поделиться на другие сайты Поделиться
RockHammer Опубликовано 21 января, 2015 Автор Поделиться Опубликовано 21 января, 2015 (изменено) В 21.01.2015 в 16:40, keng сказал: Так ведь я тебя прекрасно понял. Алгоритм я тебе описал, все необходимое у тебя есть, описания функций, если не очень понятны, можно легко посмотреть в интернете. Берешь и пробуешь написать, а если что-то не получается - спрашиваешь.BOOL WINAPI VirtualProtect(_In_ LPVOID lpAddress,_In_ SIZE_T dwSize,_In_ DWORD flNewProtect,_Out_ PDWORD lpflOldProtect);первый аргумент - адрес. Врятли, это мой адрес для записи байтов. Что тут указывать?второй - размер. Размер... памяти, в которой меняется защита?третий - новая защита. скорее всего, создаем переменную oldProtectMemory = 0; (или что-то в этом роде)четвертый - старая защита. Что ему передавать? ReadOnly? /*======================================== */memcpy, так и не разобрался, что ей передавать. Изменено 21 января, 2015 пользователем RockHamer Ссылка на комментарий Поделиться на другие сайты Поделиться
keng Опубликовано 21 января, 2015 Поделиться Опубликовано 21 января, 2015 Первый - это адрес начала страницы памяти, защиту которой поменять надо. Так что да, это адрес для записи байт.Второй - размер региона в байтах, защита которого будет изменена.Третий - какую защиту ставить. Нас тут интересует PAGE_EXECUTE_READWRITE.Четвертый - указатель на 4 байта (DWORD) переменную, куда запишется старая защита. Про memcpy вот [отсюда] что не ясно? Ссылка на комментарий Поделиться на другие сайты Поделиться
RockHammer Опубликовано 21 января, 2015 Автор Поделиться Опубликовано 21 января, 2015 (изменено) В 21.01.2015 в 18:40, keng сказал: Первый - это адрес начала страницы памяти, защиту которой поменять надо. Так что да, это адрес для записи байт.Второй - размер региона в байтах, защита которого будет изменена.Третий - какую защиту ставить. Нас тут интересует 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);}Вот мой код, уже переделаный. Собственно, все круто. Но студия говорит, что: на видео у кодера она ничего не возвращает, и у него все работает.У кодера волшебная студия? Изменено 21 января, 2015 пользователем RockHamer Ссылка на комментарий Поделиться на другие сайты Поделиться
keng Опубликовано 21 января, 2015 Поделиться Опубликовано 21 января, 2015 Раз должна возвращать - значит где-то есть return. И списывать из видео код без понимания того, как он работает и что делает - незачем, толку от этого не будет. Пиши лучше сам. Ссылка на комментарий Поделиться на другие сайты Поделиться
RockHammer Опубликовано 21 января, 2015 Автор Поделиться Опубликовано 21 января, 2015 (изменено) В 21.01.2015 в 20:22, keng сказал: Раз должна возвращать - значит где-то есть return. И списывать из видео код без понимания того, как он работает и что делает - незачем, толку от этого не будет. Пиши лучше сам.написал)изменил DWORD на voidvoid 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). Плюс, говорит что идентификатор не найден.что ей нужно? Изменено 21 января, 2015 пользователем RockHamer Ссылка на комментарий Поделиться на другие сайты Поделиться
keng Опубликовано 21 января, 2015 Поделиться Опубликовано 21 января, 2015 Что у тебя делает функция new_My_Thread() и почему нельзя было ProtectHacker декларировать как "void ProtectHacker()"? Ссылка на комментарий Поделиться на другие сайты Поделиться
RockHammer Опубликовано 21 января, 2015 Автор Поделиться Опубликовано 21 января, 2015 (изменено) В 21.01.2015 в 20:55, keng сказал: Что у тебя делает функция new_My_Thread() и почему нельзя было ProtectHacker декларировать как "void ProtectHacker()"?new_My_Thread() инициализирует d3d менюшку (ее отрисовку)всмысле Цитата почему нельзя было ProtectHacker декларировать как "void ProtectHacker()"?сама функция Protecthacker уже расписана как тип void. Изменено 21 января, 2015 пользователем RockHamer Ссылка на комментарий Поделиться на другие сайты Поделиться
keng Опубликовано 21 января, 2015 Поделиться Опубликовано 21 января, 2015 Так, э, почему тогда нельзя в самом начале инициализации эту функцию вызвать? Ссылка на комментарий Поделиться на другие сайты Поделиться
Xipho Опубликовано 22 января, 2015 Поделиться Опубликовано 22 января, 2015 И что ты там вообще взламываешь, что аж проверка по жесткому диску есть? Ссылка на комментарий Поделиться на другие сайты Поделиться
Garik66 Опубликовано 22 января, 2015 Поделиться Опубликовано 22 января, 2015 (изменено) В 22.01.2015 в 00:35, Xipho сказал: И что ты там вообще взламываешь, что аж проверка по жесткому диску есть?Он уже честно ответил в соседней теме : В 20.01.2015 в 20:56, RockHamer сказал: будет одна единственная кнопочка "взломать пентагон" (ну или еще что, в зависимости от цели использования). Изменено 22 января, 2015 пользователем garik66 1 Ссылка на комментарий Поделиться на другие сайты Поделиться
RockHammer Опубликовано 22 января, 2015 Автор Поделиться Опубликовано 22 января, 2015 (изменено) В 21.01.2015 в 21:28, keng сказал: Так, э, почему тогда нельзя в самом начале инициализации эту функцию вызвать?там не в порядке вызова дело, дело в том, что он отказывается вызывать функцию впринципе.вот в чем ошибка. (там если не видно, на верху где LPVOID подчеркнуто компилятором) В 22.01.2015 в 00:35, Xipho сказал: И что ты там вообще взламываешь, что аж проверка по жесткому диску есть? В 22.01.2015 в 03:17, garik66 сказал: Он уже честно ответил в соседней теме :Верно))))) Изменено 22 января, 2015 пользователем RockHamer Ссылка на комментарий Поделиться на другие сайты Поделиться
Coder Опубликовано 22 января, 2015 Поделиться Опубликовано 22 января, 2015 Ты в вызов функции ProtectHacker передаешь не переменную типа void*, а сам тип, естественно эта конструкция недопустима.Ты хоть ошибки читай. что тебе IDE пишет, причем еще и на русском же написано... Ссылка на комментарий Поделиться на другие сайты Поделиться
Xipho Опубликовано 22 января, 2015 Поделиться Опубликовано 22 января, 2015 В 22.01.2015 в 03:17, garik66 сказал: Он уже честно ответил в соседней теме :Не видел. Вопрос актуален. Ссылка на комментарий Поделиться на другие сайты Поделиться
Coder Опубликовано 22 января, 2015 Поделиться Опубликовано 22 января, 2015 В 22.01.2015 в 07:18, Xipho сказал: Не видел. Вопрос актуален.Да онлайн игра это очевидно, а подменяются сигнатуры локального античита ИМХО. Ссылка на комментарий Поделиться на другие сайты Поделиться
Xipho Опубликовано 22 января, 2015 Поделиться Опубликовано 22 января, 2015 В общем, ответ жду в личку, тему до выяснения закрываю.Вопрос выяснен, тему открываю. Но смотри, если как-либо я выясню, что наработки используются для взлома онлайн-режима - накажу. Ссылка на комментарий Поделиться на другие сайты Поделиться
RockHammer Опубликовано 22 января, 2015 Автор Поделиться Опубликовано 22 января, 2015 (изменено) В 22.01.2015 в 09:57, Xipho сказал: В общем, ответ жду в личку, тему до выяснения закрываю.Вопрос выяснен, тему открываю. Но смотри, если как-либо я выясню, что наработки используются для взлома онлайн-режима - накажу. Понял. В 22.01.2015 в 07:21, Coder сказал: Да онлайн игра это очевидно, а подменяются сигнатуры локального античита ИМХО.No. Ломаю античит от Ubisoft (AS:Unity). Он действительно локальный, но никакого вреда мультиплееру нанести не может (по крайней мере как задумывалось).Вопрос актуален. Что передавать функции в потоке? Изменено 22 января, 2015 пользователем RockHamer Ссылка на комментарий Поделиться на другие сайты Поделиться
Xipho Опубликовано 22 января, 2015 Поделиться Опубликовано 22 января, 2015 LPVOID - это такой тип. Расшифровывается как Long Pointer to VOID. То есть, указатель неопределенного типа. Следовательно, в функцию нужно передать указатель на что-то. Но на что именно - смотри в реализации своей функции. Ссылка на комментарий Поделиться на другие сайты Поделиться
Рекомендуемые сообщения