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

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

Всем привет, вот по этой теме решил попробовать написать программу, создал консольное приложение и написал вот такой код -

Спойлер

	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, но в итоге ничего не происходит, и в итоге память выделяется вообще не в процессе который я указал, а в консольном приложении которое я запускаю...

 

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

4 часа назад, Xhayla сказал:

в итоге память выделяется вообще не в процессе который я указал, а в консольном приложении которое я запускаю...

 

это вполне закономерно. Крч, узнаёшь размер модуля в процессе, создаёшь динамический массив, и читаешь с ReadProcessMemory, как написали выше 

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

6 часов назад, Senpai сказал:

Крч, узнаёшь размер модуля в процессе, создаёшь динамический массив

Размер модуля узнал в CE.

Динамический массив? Мне нужно участок когда скопировать и вставить в выделенную память в чужом процессе. memcpy не будет работать?

Хорошо, если я скопирую участок кода с помощью RPM в переменную, как мне записать ее в выделенную память в чужом процессе, если malloc выделяет его в своем.

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

7 часов назад, Hack сказал:

Используй ReadProcessMemory вместо memcpy.

malloc тоже выделяет память в своем процессе, а не в том на который я открыл OpenProcess.

Обязательно создавать динамический массив и туда копировать модуль, а после ещё с помощью WriteProcessMemory с этой переменной в выделенную память? Или WPM тут не нужен?

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

Получилось скопировать модуль Game.dll как Вы мне советовали с помощь ReadProcessMemory, выделил память в процессе с помощью VirtualAllocEx и вписал туда скопированный модуль с помощью WriteProcessMemory.
Но, тут кое что не понятно, а именно, мне нужной изменить в СКОПИРОВАННОМ модуле определенную инструкцию, в оригинальном модуле я это делал так - "Game.dll" + 0x13163B и значение этого в байтах было 76, делаю тоже самое, только уже с скопированным модулем, CopyGame(тут хранится начало скопированного модуля) + 0x13163B, но он мне показывает совсем другие значения, почему так?

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

40 минут назад, Xhayla сказал:

CopyGame(тут хранится начало скопированного модуля) + 0x13163B

CopyGame(тут хранится начало скопированного модуля) + 0x13263B, возможно не учитывается заголовок.

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

5 минут назад, partoftheworlD сказал:

CopyGame(тут хранится начало скопированного модуля) + 0x13263B, возможно не учитывается заголовок.

Все верно, я не учел заголовок, нужно было приплюсовывать последние байты, хорошо что Вы написал, хотел спросить у Вас, вы скинули тогда код который изменяет EIP, чтобы оно сработала нужно же его запускать с помощью SetUnhandledExceptionFilter(UnhandledExceptionFilter); ?

@partoftheworlD, еще там аргумент pExceptionInfo, что нужно туда указывать?

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

@partoftheworlD, мучаюсь уже несколько часов, если вам не сложно подскажите пожалуйста, почему не работает, вот код.(ТЫК)

Прокомментировал почти каждые действия, чтобы Вам было легче понять что происходит.

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

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;
}

 

 

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

31 минуту назад, Hack сказал:

UnhandledExceptionFilter Работает только в текущем процессе.

Зачем ловить исключение и менять адрес? jmp что не катит?

То-есть UnhandledExceptionFilter работает если DLL подгружать в процесс?

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

1 минуту назад, Hack сказал:

Да

Из одного процесса поставить UnhandledExceptionFilte в другой вообще никак нельзя?

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

1 минуту назад, Hack сказал:

Есть API функции для отладки.

Получается нужно сейчас весь код в DLL переносить? С другой стороны, там и готовые функции из коробки есть.

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

11 минут назад, Xhayla сказал:

UnhandledExceptionFilte в другой вообще никак нельзя?

 

Можно отлавливать события с помощью WaitForDebugEvent, после открывать поток при срабатывании события, через хендл потока можно получить его контекст со всеми регистрами, а дальше все как в коде. Сейчас пример накатаю.

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

13 минут назад, Hack сказал:

Я не знаю что ты делаешь, для чего тебе отлов исключение? Какие функции из коробки?

Изначально мне нужен был аналог функции StealthEdit на CE, тогда на C++. Есть программа, в которой просто так не сделаешь jmp, поэтому нужно перенаправлять код в другой участок без изменение байтов.

11 минут назад, partoftheworlD сказал:

 

Можно отлавливать события с помощью WaitForDebugEvent, после открывать поток при срабатывании события, через хендл потока можно получить его контекст со всеми регистрами, а дальше все как в коде. Сейчас пример накатаю.

Изначально код который Вы мне написали был рассчитан на DLL? 

@partoftheworlD я переписал код на DLL, подцепляю DLL к нужной игре, но, оригинальный участок кода, исчезает, то-есть участок который я копировал, становится пустым.

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

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 ) 

 

 

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

В 21.08.2019 в 22:17, Xhayla сказал:

которую указывал выше, уважаемый Xipho написал, что копировать участок памяти нужно с помощью malloc и memcpy

Это в том случае, если ты внедряешь свою длл в целевой процесс, а не работаешь с ним снаружи. Читать внимательнее надо мои рекомендации.

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

3 минуты назад, Xipho сказал:

Это в том случае, если ты внедряешь свою длл в целевой процесс, а не работаешь с ним снаружи. Читать внимательнее надо мои рекомендации.

Да, спасибо, я тогда еще не понимал этого, выше скинул код для @partoftheworlD, вдруг глянет, подцепляю DLL игру крашет, проверяю оригинальный адрес, ОТКУДА я копировал страницу, вообще пустой, поэтому и крашет.

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

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

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

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