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

partoftheworlD

Пользователи+
  • Постов

    2 687
  • Зарегистрирован

  • Посещение

  • Победитель дней

    172

Сообщения, опубликованные partoftheworlD

  1. 12 минут назад, CHBS сказал:

    Не могу понять какой байт имеет опкод push?

    Разный в зависимости от компиляции, вообще push размером в 1 байт это зарезервированные опкоды от 50 до 57

     

    50 push rax
    51 push rcx
    52 push rdx
    53 push rbx
    54 push rsp
    55 push rbp
    56 push rsi
    57 push rdi

    Ну и табличка:
    image.thumb.png.f6ddd8cbaa310e463b97cece3d919706.png

  2. Это довольно не простая тема, поэтому в идеале необходимо знать ООП, так будет проще воспринимать устройство инвентаря. В фолаче 4-м вроде нет ячеек, это просто список указателей внутри массива. Если игра написана с использованием виртуальных методов, то для поиска предметов и инвентаря в целом можно использовать RTTI, если нет, придется делать все ручками. По RTTI есть статьи на форуме. А поиск руками, тут все достаточно нудно.

     

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

     

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

     

    Второй шаг, найти указатель на структуру оружия, например базовый адрес 0xDEADBEEF, адрес патрон 0xE0. С этим справится обычный поиск, переводишь его в HEX вставляешь базовый адрес и ищешь. Получишь некое кол-во адресов. Каждый из которых нужно будет проверить, пока не найдешь, то что нужно.

     

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

    В упрощенном виде цепочка указателей выглядит примерно так:

    CWorld -> CLevel -> EntityArray[playerID] -> CActor -> CInventory -> CInventorySlot -> SlotArray[slotID] -> CWeapon -> ammo


     

  3. 1 час назад, Sergey1953 сказал:

    И его никак нельзя найти?

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

  4. 58 минут назад, Sergey1953 сказал:

    Это угол разворота машины или же что-то иное?

     

    Обычно это вектор единичной длины(если по простому -  шаг проделываемый объектом), который используется для вычисления позиции за определенное количество времени и может принимать в себя разные параметры, типа ускорения, скорости и т.д.

  5. 2 часа назад, Alex2411 сказал:

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

    Это самые основы, которые даже есть в видео-уроках, а именно стек вызовов и многоуровневые указатели(ручной способ).

  6. Сейчас нашлось свободных 10 минут, вот что нашел. В игре используется типичный switch/case, как первый вариант фильтрации просто использовать номера кейсов "если номер кейса равен n, то положить указатель в ...". Второй вариант продолжить искать инструкции формирующие указатель, он будет уровнем выше. И из-за этого раздули тему на целый десяток сообщений. -_-

     


    233646221_.thumb.png.039f79391dbc2e9ba3ad0d4ed6d070a5.png
     

  7. 4 часа назад, Alex2411 сказал:

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

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

  8. 1 минуту назад, WenSiL сказал:

    Как нашли?

     

    Деобфусцировал код игры и посмотрел какие значения принимает функция рисования этой полоски, а после поиском нашел значение (изменилось/не изменилось)

  9. 27 минут назад, Alex2411 сказал:

    а как сделать то же самое в x64dbg

     

    смотришь в документации объявленный счетчик срабатываний брейкпоинтов( $breakpointcounter), выбираешь вкладку трассировка, выбираешь тип трассировки с заходом или без захода в вызовы, появляется окошечко и туда вписываешь любые условия, для остановки, если остановка случилась, то что необходимо сделать и т.д. Вот пример, трассировка начнется, если счетчик срабатываний инструкции будет больше 1000.
    image.png.f4d0a2e009d374c34212f07722d561c3.png

     

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

     

  10.  

    12 часов назад, Alex2411 сказал:

    если бы на эту прогу были видеоуроки

     

    Есть видео уроки, а так же книги , а так же документация, так что информации полно. Например, OALabs. Уроки и книги по крутым инструментам для отладки обычно у малварщиков, а как применить их, это уже дело фантазии, в случае чего, существует туева хуча уроков по ollydbg в том числе и на русском, если знаешь olly, то проблем с использованием x64dbg не будет. Интерфейс у них похожий, плюс есть поддержка различных языков, так что даже методом "тыка" можно разобраться за минут 30. CE представляет из себя комбаин из всего что только есть, но вот реализация не самая удачная и тут встает единственный вопрос, готов ли ты тратить на какое-то дело некое количество времени, чтобы написать костыли в CE, когда существует готовое решение, делающее то, что тебе нужно в один клик.

     

     

  11. Как вариант, не заниматься ерундой, а использовать специально заточенные для отладки инструменты. Например, в x64dbg этот счетчик остановок вынесет в отдельную переменную ($breakpointcounter) для доступа к ней, или Windbg. CE не подойдет для чего-то серьезного как ни крути.

  12. 1 час назад, Jeffi сказал:

    На какой лучше всего выклпдывать файлообменик?

    Создай отдельный аккаунт на Mega, чисто для трейнеров, там будет доступно 50гб и ссылки на файлы не полетят, пока аккаунт или файл не удалишь.

     

    1 час назад, LIRW сказал:

    Да и трейнера твоего по ссылке нет уже...

    Есть

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

    как указать количество срабатываний , которое нужно пропустить ?

    Вроде бы у CE не счетчика остановок, поэтому придется делать свой с помощью скрипта.

     

    cmp [debugCounter],#99
    jne doSomething
    ...
    inc [debugCounter]
    jmp original_code
    
    doSomething:
    ...
    inc [debugCounter]
    jmp original_code
    

     

  14. 39 минут назад, Xhayla сказал:

    Вот только странно, почему в CE когда изменяешь байты через StealthEdit, игры не зависает и не идет рывками, а через PugaGuard на С++ наоборот, зависает. Хотя и там и там тот же адрес хукается.

     

    Да, это странно, потому что, вчера когда писал пример проверял на скайриме никаких проблем не было, фпс не просаживал, все так же плавно было. Могу предположить, что проблема в алгоритме, либо в самой игре, возможно у неё есть собственный обработчик исключений, который что-то с ними делает. И наверное было бы лучше просто убить эту защиту.

     

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

    показали другой способ.

     

    Способ с asm вставками не будет работать если игра x64

  15. Возможно, это подойдет. На счет VirtualProtect не уверен, но вроде он здесь нужен.

     

    Спойлер
    
    void copy_base(unsigned char* &copy_buffer, const MODULEINFO mi)
    {
    	DWORD dwOldProtect = 0;
    	
    	//получаем размер образа
    	const auto size = mi.SizeOfImage;
    	
    	//копируем
    	memcpy_s(copy_buffer, size, mi.lpBaseOfDll, size);
    
    	VirtualProtect(copy_buffer, size, PAGE_EXECUTE_READWRITE, &dwOldProtect);
    
    	//добавляем jmp to_addr
    	*reinterpret_cast<BYTE*>(copy_buffer[size])      = 0xE9;
    	*reinterpret_cast<DWORD*>(copy_buffer[size + 1]) = to_addr;
    
    	VirtualProtect(copy_buffer, size, dwOldProtect, 0);
    }
    
    void use_copy()
    {
    	//получений информации о модуле
    	MODULEINFO mi;
    	GetModuleInformation(0, 0, &mi, sizeof mi);
    	
    	// выделение памяти под копию c запасом в 5 байт
    	// для записи jmp to_addr(прыжка в оригинал)
    	auto buffer = new BYTE[mi.SizeOfImage + 5];
    	//создание копии
    	copy_base(buffer, mi);
    
    	/*
    	 *
    	 *
    	 * Какие-то действия с буфером
    	 *
    	 * 
    	 */
    
    	//Удаление копии
    	delete[] buffer;
    }

     

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

    PageGuard Hooking сам по себе медленный?

    Да, но не настолько медленный, так же еще зависит от того сколько кода вторая часть обработчика проверяет(которая SINGLE STEP). Явно, если пошаговая отладка будет работать для 10000 инструкций в поиске той самой на которую повешен хук, то быстродействия ждать не стоит.

  17. 12 минут назад, Xhayla сказал:

    а к примеру 1000 строк, если прыгнуть в jmp_original он все равно в правильный адрес прыгнет?

    Хоть тысячу, хук работает как в CE, главное чтобы состояние измененных регистров не приводило к крашу.

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

    jpm_original = (DWORD)(pExceptionInfo->ContextRecord->Esp + 5; ? 

    Это не так работает, советую посмотреть основы о том как работает стек.

     

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

     

    На счет защиты, как только мне перестанет быть нужен ХУК, нужно вернуть старую защиту и снять отлов исключений?

    Да

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

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

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