Xhayla Опубликовано 21 августа, 2019 Поделиться Опубликовано 21 августа, 2019 (изменено) Всем привет, вот по этой теме решил попробовать написать программу, создал консольное приложение и написал вот такой код - Спойлер HANDLE Open = OpenProcess(PROCESS_ALL_ACCESS, false, GetProcessID("Имя процесса")); GameDll = GetModuleBaseAddress(GetProcessID("Имя процесса"), "Game.dll"); byte size = 5292032; char* memoryCopy = (char*)malloc(size); cout << memoryCopy; memcpy(memoryCopy, (void*)GameDll, size); CloseHandle(Open); system("pause"); return 0; В той теме, которую указывал выше, уважаемый Xipho написал, что копировать участок памяти нужно с помощью malloc и memcpy. В итоге, после запуска программы, я открыл CE дабы посмотреть выделилась ли память в процессе, и скопировался ли туда модуль, на который я указал адрес, в переменной "size" я вписал размер всей Game.dll который мне показал CE, но в итоге ничего не происходит, и в итоге память выделяется вообще не в процессе который я указал, а в консольном приложении которое я запускаю... Изменено 21 августа, 2019 пользователем Xhayla редактирую Ссылка на комментарий Поделиться на другие сайты Поделиться
Hack Опубликовано 21 августа, 2019 Поделиться Опубликовано 21 августа, 2019 Используй ReadProcessMemory вместо memcpy. Ссылка на комментарий Поделиться на другие сайты Поделиться
Senpai Опубликовано 21 августа, 2019 Поделиться Опубликовано 21 августа, 2019 4 часа назад, Xhayla сказал: в итоге память выделяется вообще не в процессе который я указал, а в консольном приложении которое я запускаю... это вполне закономерно. Крч, узнаёшь размер модуля в процессе, создаёшь динамический массив, и читаешь с ReadProcessMemory, как написали выше Ссылка на комментарий Поделиться на другие сайты Поделиться
Xhayla Опубликовано 22 августа, 2019 Автор Поделиться Опубликовано 22 августа, 2019 (изменено) 6 часов назад, Senpai сказал: Крч, узнаёшь размер модуля в процессе, создаёшь динамический массив Размер модуля узнал в CE. Динамический массив? Мне нужно участок когда скопировать и вставить в выделенную память в чужом процессе. memcpy не будет работать? Хорошо, если я скопирую участок кода с помощью RPM в переменную, как мне записать ее в выделенную память в чужом процессе, если malloc выделяет его в своем. Изменено 22 августа, 2019 пользователем Xhayla Ссылка на комментарий Поделиться на другие сайты Поделиться
Xhayla Опубликовано 22 августа, 2019 Автор Поделиться Опубликовано 22 августа, 2019 7 часов назад, Hack сказал: Используй ReadProcessMemory вместо memcpy. malloc тоже выделяет память в своем процессе, а не в том на который я открыл OpenProcess. Обязательно создавать динамический массив и туда копировать модуль, а после ещё с помощью WriteProcessMemory с этой переменной в выделенную память? Или WPM тут не нужен? Ссылка на комментарий Поделиться на другие сайты Поделиться
Xhayla Опубликовано 22 августа, 2019 Автор Поделиться Опубликовано 22 августа, 2019 Получилось скопировать модуль Game.dll как Вы мне советовали с помощь ReadProcessMemory, выделил память в процессе с помощью VirtualAllocEx и вписал туда скопированный модуль с помощью WriteProcessMemory. Но, тут кое что не понятно, а именно, мне нужной изменить в СКОПИРОВАННОМ модуле определенную инструкцию, в оригинальном модуле я это делал так - "Game.dll" + 0x13163B и значение этого в байтах было 76, делаю тоже самое, только уже с скопированным модулем, CopyGame(тут хранится начало скопированного модуля) + 0x13163B, но он мне показывает совсем другие значения, почему так? Ссылка на комментарий Поделиться на другие сайты Поделиться
partoftheworlD Опубликовано 22 августа, 2019 Поделиться Опубликовано 22 августа, 2019 40 минут назад, Xhayla сказал: CopyGame(тут хранится начало скопированного модуля) + 0x13163B CopyGame(тут хранится начало скопированного модуля) + 0x13263B, возможно не учитывается заголовок. Ссылка на комментарий Поделиться на другие сайты Поделиться
Xhayla Опубликовано 22 августа, 2019 Автор Поделиться Опубликовано 22 августа, 2019 (изменено) 5 минут назад, partoftheworlD сказал: CopyGame(тут хранится начало скопированного модуля) + 0x13263B, возможно не учитывается заголовок. Все верно, я не учел заголовок, нужно было приплюсовывать последние байты, хорошо что Вы написал, хотел спросить у Вас, вы скинули тогда код который изменяет EIP, чтобы оно сработала нужно же его запускать с помощью SetUnhandledExceptionFilter(UnhandledExceptionFilter); ? @partoftheworlD, еще там аргумент pExceptionInfo, что нужно туда указывать? Изменено 22 августа, 2019 пользователем Xhayla Ссылка на комментарий Поделиться на другие сайты Поделиться
Xhayla Опубликовано 22 августа, 2019 Автор Поделиться Опубликовано 22 августа, 2019 (изменено) @partoftheworlD, мучаюсь уже несколько часов, если вам не сложно подскажите пожалуйста, почему не работает, вот код.(ТЫК) Прокомментировал почти каждые действия, чтобы Вам было легче понять что происходит. Изменено 22 августа, 2019 пользователем Xhayla Ссылка на комментарий Поделиться на другие сайты Поделиться
partoftheworlD Опубликовано 22 августа, 2019 Поделиться Опубликовано 22 августа, 2019 5 часов назад, Xhayla сказал: еще там аргумент pExceptionInfo, что нужно туда указывать? EXCEPTION_POINTERS* pExceptionInfo 4 часа назад, Xhayla сказал: почему не работает Без понятия, ведь ты не указал какую ошибку выдает твой код или какое поведение у кода, что говорит отладчик? Если так с ходу, то не работает потому, что где-то ошибка или не правильный отлов исключения. UnhandledExceptionFilter вообще написан странно у тебя в коде и не будет ничего отлавливать. Кусок кода с подменой адресов должен быть примерно такой. Спойлер LONG WINAPI UnhandledExceptionFilter(EXCEPTION_POINTERS *pExceptionInfo) { if(pExceptionInfo->ExceptionRecord->ExceptionCode == UNK) //или if(pExceptionInfo->ExceptionRecord->ExceptionCode == STATUS_GUARD_PAGE_VIOLATION) { if(pExceptionInfo->ExceptionRecord->ExceptionAddress == (DWORD)GetModuleHandle("Game.dll")+0x13163B) { pExceptionInfo->ContextRecord->Eip = (DWORD)address; return EXCEPTION_CONTINUE_EXECUTION; } } return EXCEPTION_CONTINUE_SEARCH; } Ссылка на комментарий Поделиться на другие сайты Поделиться
Hack Опубликовано 22 августа, 2019 Поделиться Опубликовано 22 августа, 2019 UnhandledExceptionFilter Работает только в текущем процессе. Зачем ловить исключение и менять адрес? jmp что не катит? Ссылка на комментарий Поделиться на другие сайты Поделиться
Xhayla Опубликовано 22 августа, 2019 Автор Поделиться Опубликовано 22 августа, 2019 31 минуту назад, Hack сказал: UnhandledExceptionFilter Работает только в текущем процессе. Зачем ловить исключение и менять адрес? jmp что не катит? То-есть UnhandledExceptionFilter работает если DLL подгружать в процесс? Ссылка на комментарий Поделиться на другие сайты Поделиться
Hack Опубликовано 22 августа, 2019 Поделиться Опубликовано 22 августа, 2019 2 минуты назад, Xhayla сказал: То-есть UnhandledExceptionFilter работает если DLL подгружать в процесс? Да Ссылка на комментарий Поделиться на другие сайты Поделиться
Xhayla Опубликовано 22 августа, 2019 Автор Поделиться Опубликовано 22 августа, 2019 (изменено) 1 минуту назад, Hack сказал: Да Из одного процесса поставить UnhandledExceptionFilte в другой вообще никак нельзя? Изменено 22 августа, 2019 пользователем Xhayla Ссылка на комментарий Поделиться на другие сайты Поделиться
Hack Опубликовано 22 августа, 2019 Поделиться Опубликовано 22 августа, 2019 Есть API функции для отладки. Ссылка на комментарий Поделиться на другие сайты Поделиться
Xhayla Опубликовано 22 августа, 2019 Автор Поделиться Опубликовано 22 августа, 2019 (изменено) 1 минуту назад, Hack сказал: Есть API функции для отладки. Получается нужно сейчас весь код в DLL переносить? С другой стороны, там и готовые функции из коробки есть. Изменено 22 августа, 2019 пользователем Xhayla Ссылка на комментарий Поделиться на другие сайты Поделиться
Hack Опубликовано 22 августа, 2019 Поделиться Опубликовано 22 августа, 2019 Я не знаю что ты делаешь, для чего тебе отлов исключение? Какие функции из коробки? Ссылка на комментарий Поделиться на другие сайты Поделиться
partoftheworlD Опубликовано 22 августа, 2019 Поделиться Опубликовано 22 августа, 2019 11 минут назад, Xhayla сказал: UnhandledExceptionFilte в другой вообще никак нельзя? Можно отлавливать события с помощью WaitForDebugEvent, после открывать поток при срабатывании события, через хендл потока можно получить его контекст со всеми регистрами, а дальше все как в коде. Сейчас пример накатаю. Ссылка на комментарий Поделиться на другие сайты Поделиться
Xhayla Опубликовано 22 августа, 2019 Автор Поделиться Опубликовано 22 августа, 2019 (изменено) 13 минут назад, Hack сказал: Я не знаю что ты делаешь, для чего тебе отлов исключение? Какие функции из коробки? Изначально мне нужен был аналог функции StealthEdit на CE, тогда на C++. Есть программа, в которой просто так не сделаешь jmp, поэтому нужно перенаправлять код в другой участок без изменение байтов. 11 минут назад, partoftheworlD сказал: Можно отлавливать события с помощью WaitForDebugEvent, после открывать поток при срабатывании события, через хендл потока можно получить его контекст со всеми регистрами, а дальше все как в коде. Сейчас пример накатаю. Изначально код который Вы мне написали был рассчитан на DLL? @partoftheworlD я переписал код на DLL, подцепляю DLL к нужной игре, но, оригинальный участок кода, исчезает, то-есть участок который я копировал, становится пустым. Изменено 22 августа, 2019 пользователем Xhayla Ссылка на комментарий Поделиться на другие сайты Поделиться
partoftheworlD Опубликовано 22 августа, 2019 Поделиться Опубликовано 22 августа, 2019 13 минут назад, Xhayla сказал: Изначально код который Вы мне написали был рассчитан на DLL? нет, это код из обработки исключений отладчиком. 13 минут назад, Xhayla сказал: Изначально мне нужен был аналог функции StealthEdit на CE Почему бы просто не убивать поток с проверкой целостности? Вроде так, думаю переписать на C++ не составит труда тут все тоже самое за исключением скобок Спойлер if WaitForDebugEvent(&lpDebugEvent,INFINITE): h_thread = open_thread(lpDebugEvent->dwThreadId) context = get_thread_context(h_thread) if lpDebugEvent->dwDebugEventCode == EXCEPTION_DEBUG_EVENT: exception = lpDebugEvent->Exception->ExceptionRecord->ExceptionCode exception_address = lpDebugEvent->Exception.ExceptionRecord->ExceptionAddress if exception == EXCEPTION_GUARD_PAGE: print "Guard page" elif exception == EXCEPTION_SINGLE_STEP: print "Single Stepping." ContinueDebugEvent( lpDebugEvent->dwProcessId, lpDebugEvent->dwThreadId, DBG_CONTINUE ) Ссылка на комментарий Поделиться на другие сайты Поделиться
Xhayla Опубликовано 22 августа, 2019 Автор Поделиться Опубликовано 22 августа, 2019 @partoftheworlD посмотрите пожалуйста код для DLL'ки вот, почему то не работает. Ссылка на комментарий Поделиться на другие сайты Поделиться
Xipho Опубликовано 23 августа, 2019 Поделиться Опубликовано 23 августа, 2019 В 21.08.2019 в 22:17, Xhayla сказал: которую указывал выше, уважаемый Xipho написал, что копировать участок памяти нужно с помощью malloc и memcpy Это в том случае, если ты внедряешь свою длл в целевой процесс, а не работаешь с ним снаружи. Читать внимательнее надо мои рекомендации. Ссылка на комментарий Поделиться на другие сайты Поделиться
Xhayla Опубликовано 23 августа, 2019 Автор Поделиться Опубликовано 23 августа, 2019 (изменено) 3 минуты назад, Xipho сказал: Это в том случае, если ты внедряешь свою длл в целевой процесс, а не работаешь с ним снаружи. Читать внимательнее надо мои рекомендации. Да, спасибо, я тогда еще не понимал этого, выше скинул код для @partoftheworlD, вдруг глянет, подцепляю DLL игру крашет, проверяю оригинальный адрес, ОТКУДА я копировал страницу, вообще пустой, поэтому и крашет. Изменено 23 августа, 2019 пользователем Xhayla Ссылка на комментарий Поделиться на другие сайты Поделиться
Xhayla Опубликовано 23 августа, 2019 Автор Поделиться Опубликовано 23 августа, 2019 @partoftheworlD Когда выполняется VirtualProtect, в том месте где я его выполняю все становится пустое, ВОТ СКРИНШОТ Ссылка на комментарий Поделиться на другие сайты Поделиться
Рекомендуемые сообщения