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

Блоги

Старая, но все еще актуальная ммо 2 (Packet editing)

Вот и настало время для 2й части реверсинга данной игры
Сегодня будет рассмотрен Packet Editing
В качестве основной идеи выступает данное видео    Ну что же, начнем...
Для начала необходимо найти ф-ию отправки пакета на сервер игры
Эта ф-ия существует во всех онлайн играх.   На примере Perfect World, она выглядит вот так
В ф-ию передается 2 аргумента 
1й аргумент это указатель на массив байтов который передается серверу
В качестве второго аргумента выступает размер пакета в байтах
  Выглядит все это примерно так
byte data[] = { 0x0 , 0xfc, 0xbc };
int len = 3;
SendPacket(data, 3);
Таким образом можно отправлять серверу пакеты для выполнения каких-либо действий внутри игры

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

Приступим к самому хуку для чтения пакетов
Сам хук довольно прост, и ничем особым не выделяется, кроме того, что хук будет перед вызовом memmove
  //Main dll thread jmpBack = (DWORD)DetourFunction((BYTE*)(Module + 0x419ACF), (BYTE*)PacketHook); //Hook part __declspec(naked) void PacketHook() { __asm { mov hookedPacket, ecx mov hPacketSize, esi } memcpy(hpacket, (void*)hookedPacket, 256); i = 0; if (hpacket[0] == 0x0 && hpacket[1] == 0x0 && hPacketSize == 41) //Movement 41 len { printf("Movement Packet: "); printf("Y: %.3f X: %.3f Z: %.3f ", *(float*)(hpacket+2), *(float*)(hpacket + 6), *(float*)(hpacket + 10)); printf("Counter %02x \n", hpacket[16]); } else if (hpacket[0] == 0x07 && hpacket[1] == 0x00 && hPacketSize == 25) //Stop Move { printf("Stop Hero Packet: "); printf("Y: %.3f X: %.3f Z: %.3f \n", *(float*)(hpacket + 2), *(float*)(hpacket + 6), *(float*)(hpacket + 10)); } else if (hpacket[0] == 0x03 && hpacket[1] == 0x00 && hpacket[2] == 0x01 && hPacketSize == 3) //Attack Packet { printf("Standart Attack Packet\n"); } else if (hpacket[0] == 0x02 && hpacket[1] == 0x00 && hPacketSize == 6) //Select Target packet { printf("Select target: 0x%06x\n", *(int*)(hpacket+3)); } printf("Incoming Packet: "); for (i; i < hPacketSize; i++) { printf("%02x ", hpacket[i]); } printf("\n"); _asm jmp jmpBack } Собственно это весь хук который нужен для чтения
Некоторые пакеты я уже расшифровал
К примеру пакет движения
У каждого пакета в игре есть некий ID - это ровно 2 байта
Для перемещения это 00 00
Остановка персонажа 07 00
Обычная атака 03 00 и т.д.
В пакете движения передаются координаты перемещения персонажа в данный момент
  Что касается чтения пакетов, с этим все, больше тут придумывать нечего
Настало время сделать свою отправку пакета на сервер
  //SendPacket Prototype using Send_t = void(__thiscall*)(DWORD*,DWORD*, int); auto* fnc_Send = reinterpret_cast<Send_t>(Module + 0x419A40); if (GetAsyncKeyState(VK_NUMPAD8) & 0x1) { std::ifstream inFile("C:\\Users\\Administrator\\Documents\\Visual Studio 2017\\Projects\\PW\\Debug\\Send.txt"); std::vector<uint8_t> data; data.reserve(512); unsigned int temp; while (!inFile.eof()) { inFile >> std::hex >> temp; data.push_back(temp); } std::copy(data.begin(), data.end(), hSendPacket); printf("Sent: "); for (j; j < data.size(); j++) printf("%02x ", (int)data[j]); printf("\n"); DWORD* Packet = (DWORD*)&hSendPacket; DWORD BaseValue = *reinterpret_cast<DWORD *>(0x00E444A4); DWORD* Base = (DWORD*)(*reinterpret_cast<DWORD*>(BaseValue + 0x20)); int packsize = data.size(); fnc_Send(Base, Packet, packsize); } У ф-ии 3 аргумента, т.к в регистре ecx перед вызовом ф-ии должен быть еще 1 указатель
Теперь и отправка пакета готова, можно начать эксперементировать
Для примера возьму пакет использования 3ей ячейки в инвентаре, в которой лежит предмет
28 00 00 01 02 00 26 2c 00 00
28 00 - использование предмета
02 - ячейка в инвентаре
02 26 - ID предмета, которое можно посмотреть и свериться 11302 - 0x2C26

Ну а теперь когда найден пакет, можно попробовать отправить его на сервер с помощью написанного выше кода

На этом данная статья заканчивается. 
Примерно такие же действия можно сделать и с другими онлайн играми и автоматизировать некоторые действия

roma912

roma912

 

Составление критериев в к плагинам Cheat Engine

Для тех кому интересно, вопрос к ним. Какие критерии можно добавить спрашивая оценку плагина? Например, по 5-ти бальной шкале спрашивать оценку у пользователей:   Необходимость плагина в Cheat Engine Работает без ошибок                            Понятно как пользоваться Интерфейс плагина Удобство плагина Нравится Простая установка   Думаю, прикрутить аналитику прямо в плагины. Там будет как аналитика использования плагина, так и будет опросник выше. Ну и пользовательское соглашение об анонимном сборе данных для улучшения качества приложения. Чтобы можно было улучшать только те плагины, которые устанавливают и которыми пользуются.

MasterGH

MasterGH

 

User Action Logger 1.0 Beta

Обновлен и залит плагин "User Action Logger 1.0 Beta"      Для тех кто хочет, для поддержки плагина или других плагинов для CE принимаются пожертвования: yandex кошелек: 410015719959843  (можно добавить сообщение "Плагины CE" как примечание при переводе или иное)
paypal: masterGH.developer@gmail.com (тоже самое, добавьте сообщение "Плагины CE" как примечания при переводе или иное)

MasterGH

MasterGH

 

Разработка плагинов для Cheat Engine

Планируется улучшать и дорабатывать плагины, показать как с ними работать.   1. Вывод данных в окно логов: сканирование, подключение к процессу, опции сканирования, состояния активации и деактивации записией в таблице CE и другие 
2. Запись действий из пункта 1, сохранение этих действий и воспроизведение по кнопке или горячим клавишам
3. Показ в дизассемблере CE ветвлений кода при проходе потоками разными цветами (можно видеть код, который не был пройден в разных ситуациях)
4. Дополнительное окно дизассемблера с опциями подсветки инструкций по типу в градации черно-белых цветов: математические инструкции, логические инструкции, инструкции ветвления, на чтение и запись. 
5. Улучшение плагина "Dessect Data Scanner" с DBVM или на 4-HW брекйпоинта. В случае DBVM количество брейкпоинтов не ограничено и можно определить тип данных одновременно для каждого байта в структуре по смещениям, а в случае 4-х байтов это в режиме без DBVM одновременно задействуются все 4 hw брейкпоинта, а не 1 hw как сейчас.   Улучшения возможны при добровольной материальной поддержке для тех кто хочет yandex кошелек: 410015719959843  (добавьте сообщение "Плагины CE" как примечание при переводе)
paypal: masterGH.developer@gmail.com (тоже самое, добавьте сообщение "Плагины CE" как примечания при переводе)   На данный момент список плагинов https://bitbucket.org/MasterGH/   Extensions: 

MasterGH

MasterGH

 

Unreal Engine 4.22. Как захотеть делать игры

У меня бывают такие случаи, когда увидишь простой пример кода после которого захочется заняться разработкой какой-нибудь игры.  Вот один из таких примеров о том, как сделать подъем и опускание предмета и затем его вращение. Это 5 строчек "таких" и 5 строчек "таких", вот подъем и вращение   На видео код можно применять для левитации предметов и вражеских персонажей, которых  можем поднимать, удерживать и бросать.    Если кто-то очень хочет узнать как сделать бросок предметов и персонажей на тестовых проектах игровых движков Unity и UE4 , то по желанию можно поддержать меня лично донатом: yandex кошелек: 410015719959843  (добавьте сообщение "Левитация" как примечание при переводе)
paypal: masterGH.developer@gmail.com (тоже самое, добавьте сообщение "Левитация" как примечания при переводе)

MasterGH

MasterGH

Metal Gear Rising - Revengeance или трейнер с dx9

На днях решил с самого чистого нуля написать хук для Directx 9.
Чтобы было хоть какое-нибудь отображение для пользователя внутри игры
Собственно идея зародилась, осталось только воплотить 
Хук поддерживает Режим в окне / Полноэкранный
Использование EndScene и библиотеки для рисования самого меню.
Использованная версия игры: Metal Gear Rising - Revengeance v2, таблетка от Skidrow

Пара скриншотов самого меню, все получилось довольно ярко
  На момент тестирования багов и вылетов не обнаружил. 
Для написания ф-ий и самого хука были использованы MS Detours.
Вполне возможно что функционал я буду еще доделывать, постепенно
Но это в том случае, если не переключусь на игру поинтересней

Ну и конечно же видео  

roma912

roma912

 

ResFitter - управление разрешением и оптимизация

Эта программа полезна тем кто:
Хотят поиграть в новые игры, но возможности приобрести самые современные устройства для этого нету
Хотят увеличить разрешение в какой либо игре, выше системного - аналог сглаживания
Хотят развернуть на весь экран приложение, которое это не поддерживает

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

История:
В некоторых играх, например в Watch Dogs 2, есть такая настройка - качество разрешения. Изменяя её, можно уменьшить качество выводимого на экран изображения, и очень сильно увеличить fps. К сожалению далеко не все разработчики делают такую настройку, и мне захотелось создать такую программу, которая будет делать тоже самое, но с любой игрой.

Инструкция:
При первом запуске программа создаст в своей папке (там где лежит exe) файл games.ini, в нём будет 2 строчки заполненные для примера. Все команды программы и инструкцию можно узнать в ней, написав help.
Файл нужно заполнять вот так: Название_процесса.exe Xразрешение Yразрешение
Пример: witcher3.exe 800 600 terraria.exe 640 480 Каждая игра должна начинаться с новой строки, расстояние между элементами должно быть один пробел.
Если игра имеет права админинстратора, то программа тоже должна быть запущена с такими правами.
После запуска программа сразу начинает работать, если файл заполнен правильно, остаётся только запустить игру. После запуска игры разрешение изменится, окно игры разместится под размер экрана, после закрытия игры разрешение будет восстановлено, игру лучше всего запускать в оконном режиме без рамки. потому что некоторые игры в полноэкранном режиме принудительно пытаются поставить своё разрешение, если программа не сможет переспорить игру в таком случае, она об этом сообщит

Если возникают проблемы с узнаванием названия процесса игры, можно посмотреть все активные процессы и процессы использующие DirectX с помощью команды show
Если написало что игра запущена и разрешение, но оно не изменилось, значит это разрешение не подходит к вашему монитору, монитор не поддерживает любые разрешения, потому например 274 x 367 может и не сработать. Используйте правильные разрешения, например если хотите получить разрешение 2/3 от своего, разделите X и Y своего разрешения на 3, умножьте на 2 - такое вероятней всего будет записано.
Эксперементируйте, или посмотрите таблицу поддерживаемых разрешений для вашего монитора с помощью команды list.

Если в названии процесса используются пробелы, пишите его в кавычках, например: "For See.exe" 800 600
Файл:
64 бит:  ResFitter x64.exe 32 бит:  ResFitter x32.exe

imaginary

imaginary

 

Экономия времени при реверсе за счет вычислений энтропии

В зависимости от энтропии, мы можем с ходу определить какие утилиты нам понадобятся, для примера возьмем игровую дллку. Возьмем файл из каталога и проверим энтропию:
      Обычно энтропия выше 2-3 указывает на то, что файл накрыт чем-то и не подходит для статического анализа, из-за того, что будет попадаться мусор, куски нерабочего кода и отсутствие перекрестных ссылок, проделаем тоже самое, но уже с дампом этой же дллки.

    Как видите, энтропия стала меньше, а линия стала более ровной, это означает, что файл готов к использованию и во время реверса не возникнет никаких проблем.

partoftheworlD

partoftheworlD

 

Radare2 Эмуляция кода

Глава 0. Пролог   В общем в прошлой статье слетели картинки, да и статья не особо понравилась, вот её переписанная и обновленная версия. Место действия – терминал, в главных ролях – radare2, отлаживаемая программа.   Глава 1. Настройка окружения ESIL e asm.emu=true - Run ESIL emulation analysis on disasm e io.cache=true Глава 2. Настройка эмулятора Тут достаточно простой список команд: aei – инициализирует состояние виртуальной машины aeim – инициализирует стек aeip – устанавливает EIP по текущему положению в коде после всех этих команд в регистрах выставились адреса ebp, esp, eip.   Остальные регистры устанавливаем с помощью команды aer, значения обычно берутся из отладчика, но можно выставить любые. aer eax = 00000004;aer ebx = 0x17426e8;aer edx = 00000004;aer edi = 0x05e4830;aer tf  = 1;aer if  = 1;   Для пошагового выполнения кода используем aes, я обычно использую такую связку, чтобы получать необходимый минимум информации: pd -1 @ eip; aer=; aes но если кому так не удобно, есть возможность использовать визуальную отладку используя команду V!   Глава 3. Тест   Попробуем отладить код из дампа и посмотреть, что там вообще происходит.     Глава 4. Эпилог   Как видите, все достаточно просто, плюс поддерживается для эмуляции туева хуча архитектур. Так же это быстрее, чем поднять qemu или использовать реальное железо, плюс поддержка скриптов радара делает из эмуляции достаточно мощный инструмент для статической отладки и анализа кода.  

partoftheworlD

partoftheworlD

 

Старая, но все еще актуальная ммо

Сегодня рассмотрим старую, но все еще актуальную ммо под названием Perfect World
Берем конечно же не актуальную версию официального клиента, а пиратский сервер с его старенькой версией 1.5.3 (Summer PW)
Официальная версия 1.6+

На данном пвп сервере изменены некоторые полеты для персонажа, введены некоторые, так называемые "рисованные" вещи которые довольно плохо влияют на баланс сервера
Да к тому же сервер заточен еще и под донат, т.к статы вещей могут быть рандомными (Классно...)   Как раз 4 стата и считаются рандомными, выпадают с некоторым шансом из общего пула.

Ну и начнем собственно, посмотрим что можно сделать в этой игре интересного
Начнем копать от локального игрока
Ищем его указатель. Это довольно просто, не возникает никаких трудностей
  Указатель имеет всего одно смещение по типу *(LocalPlayer*) + 0x4 
И собственно так мы вышли на структуру персонажа
Далее нашли оффсеты до координат и прочего.

Самое интересное оказалось то, что можно изменить скорость персонажа прямо с клиента, а сервер будет воспринимать это как действительную скорость персонажа
Обычная скорость игроков на сервере порядка 5-6 м/с в зависимости от класса персонажа, довольно обычная расстановка в ммо играх
  Изменив скорость персонажа с клиента у сервера не возникло вопросов, а легально ли это и просто съело это.
Путем проб и ошибок я подобрал значение скорости [м/с] которое допустимо записью в адрес. Это 15 м/с
  Скорость 15 м/с считается максимальной скоростью передвижения персонажа на сервере (Когда мы передвигаемся пешочком)
Но скорости в 15 м/с ведь мало , без каких либо бафов на ускорение и пр.
Поэтому пробуем увеличить до 20 м/с простой записью и персонажа начинает откидывать назад при перемещении
Тут у меня есть предположение исходя из пошаговой отладки, что  переходе через порог допустимого значения, сервер начинает сбрасывать скорость персонажа до 5-6 м/с опять же в зависимости от класса

Но на сервере есть всякие плюшки на ускорение персонажа, этим мы и воспользуемся
Установлено что максимальная скорость без бафов 5-6 м/с. С бафами 15-20 м/с

Опять же путем проб и ошибок было выяснено что можно преодолеть эти 15 м/с
А преодолеть их можно путем наложения бафа ускорения на персонажа, которое работает примерно по такому принципу
curSpeed = (15.0*2)
  Значит мы можем это легко использовать и нас не будет откидывать. Звучит неплохо
Делаем бинд на запись значения в адрес скорости. Пусть это будет 30 м/с, включаем баф на ускорение и радуемся скорости в 30 м/с без каких-либо откидываний назад
Правда такое будет работать только пока на нас весит баф на ускорение, т.е ровно 15 сек
А после окончания действия бафа нам придется довольствоваться скоростью в 15 м/с, но все равно это скорость останется постоянной и уже превышает скорость обычных игроков примерно в 2-3 раза
  Вопрос остается в том, как же обойти или сделать так, чтобы значение подстраивалось в нужное когда на нас висит нужный баф
Делается довольно просто, путем чтения ID бафа на ускорение и его проверки на существование
Необходимо найти какой-то список бафов и после читать его каждые допустим 20 мс
А при нужном ID бафа просто менять значение скорости персонажа. Все довольно примитивно

Выйти на массив бафов нам поможет счетчик кол-ва бафов персонажа, который должен быть где-то в памяти игры
*Стандартные процедуры в СЕ. 1-2-3-4 бафа, сканируем, потом находим указатель на этот счетчик*
И в итоге оказывается что этот счетчик лежит прямо в структуре персонажа, хотя мб и логично
В некоторых играх может быть и иначе


Выше над счетчиком и лежит наш список бафов, смещение между бафами ровно в 0x12
  Узнаем наш ID ускорения и запоминаем

Остается теперь написать программу которая поможет нам делать все манипуляции с памятью


Запускаем, проверяем  

roma912

roma912

 

Немного о том, почему я люблю radare2

Покажу на примере кода по расшифровке строк, ничего особенного, просто xor шифрование, вроде бы все и понятно, но так не хочется вручную восстанавливать. А декомпилятор в x64dbg ужасен.
  И что же в таком случае делать? Воспользоваться radare2. Просто выделяем функцию, записываем её в файл и отрываем этот файл в r2.
Теперь определяемся что нам нужно из этого кода? Например, регистр cl. Пишем такую команду: pdc~cl Читается как:  pdc - pseudo disassembler output in C-like syntax ~ - grep cl   Хоба, и видим алгоритм расшифровки: [0x00aa93b0]> pdc~cl cl = bl cl ^= dl byte [rdi + rax + 1] = cl cl = bl cl ^= byte [rsi + 0x12c66dc] byte [rsp + rax + 0x1d] = cl cl = bl cl ^= byte [rsi + 0x12c66e0] byte [rax + rbp + 3] = cl cl = bl cl ^= dl byte [rsp + rax + 0x1f] = cl     Это не совсем декомпилятор, просто вывод дизассемблерного кода в удобно читаемом виде.  Код целиком.    

partoftheworlD

partoftheworlD

 

Программирование с помощью патернов проектирования

Отличная книга по изучению паттернов проектирования. Ее можно читать со шпаргалкой по паттернам (иллюстрацию по паттернам можно загуглить). Перед этим еще загуглить SOLID + Unity . До кучи еще алгоритмы и структуры данных.  Все это  пригодится, чтобы пойти работать на программиста игр или приложений с разными типами реальности: дополненная, виртуальная и смешанная. А так же сейчас можно встретить вакансии по программированию не только Android, iOS устройств, шлемов и очков, но различных устройств и дронов. Об алгоритмах может быть позже напишу

MasterGH

MasterGH

 

Lua плагины в CE

Нет времени, пока напишу заметки.   1. Можно сделать плагин с визуализацией счетчиков обращений к видимым данным в MemoryView с подключенным DBVM. 2. По аналогии в Dessect Data Scanner сделать выбор DBVM режима.   DBVM позволяет обойти ограничение в 4 аппаратных брейкопинта и в реальном времени визуализировать данные, которые обращаются к памяти на чтение, запись. Показывать счетчик обращения и даже показывать спискок инструкций при наведении курсором на байт или иные данные в MemoryView. В случае c Dessect Data Scanner может ускорить расструктуризацию, а не по 1-ому брейкпоинту снимать показания X секунд пробегаясь по структуре.   Кстати, кто-нибудь шарит в алгоритмах, структурах данных и паттернах проектирования? Если шарите, поделитесь в каких задачах применяли.  

MasterGH

MasterGH

 

[URLdrafter.exe]

Случилось мне столкнуться с ситуацией, что есть "лёгкий" способ сделать очень интересные изменения в процессе, просто подменив URL адрес запроса, или ответ, получив при этом совсем другой результат, так появилась эта программа 🖖.

Не работает на Windows 8 и 10

А вот и описание..
Программа URL drafter
Основные функции: Отслеживание URL запросов программы:
Позволяет отслеживать и логировать все передаваемые программой URL запросы. Это позволяет получить прямые ссылки на скачивание или просмотр файлов / информации которая запрашивается процессом. Например - htmp файл с параметрами, или 3ds модель, что угодно. Создание фильтров подмены:
Позволяет создать фильтр, указав в нём полный запрос от программы, управлять его состоянием, сохранять файлы со списком фильтров, загружать эти файлы. Таким образом можно сделать много файлов для разных функций и загружать их когда нужно. Фильтр позволяет заменить URL запрос на свой, таким образом можно подменить файл, или что либо ещё необходимое процессу. Файл можно положить на свой локальный сервер (localhost), или туда куда удобно. Нужно учитывать что не все файлообменники отдадут файл по прямому запросу от не авторизованного пользователя (процесса). Побочные функции: Просмотр всех процессов в системе - их id и имени. Просмотр загруженных в процесс модулей.   Команды программы можно посмотреть введя "help".
Все команды могут принимать аргументы сразу, или по порядку. Например ввести "connect 3442" или сначала "connect" а потом "3442" это одно и тоже.
Программа создаёт файлы в директории которой лежит, если не будет указан полный путь, потому лучше поместить файл в папку.

Версия 32 бит: URLdrafter x32.exe

Создание фильтра:
*Удобнее создавать фильтры через файл
Для создания фильтра нужно прописать "fcreate (название фильтра) (номер активности 1/0) (что найти) (на что заменить)"
Название - может быть абсолютно любым.
Номер активности - включён ли фильтр, позже можно изменить командой "fenable"
Что найти - полная URL ссылка, без http, в таком виде как выводит программа.
На что заменить - полная URL ссылка без http которой будет заменена найденная ссылка

Пример:
В файле фильтр выглядит вот так: ,1,WeaponModel,localhost/map.eax,abz/online.html, фильтры разделяются пробелом или переходом на новую строку, запятые обязательны в начале и в конце.

*Фильтры работают только если включен перехват URl .

Краткое руководство, если что то не понятно:

Примеры использования фильтров на разных приложениях (НЕ будет пополняться):
Небольшое видео работы:

*Это консольное приложение написанное на C++.
*Пока доступна только 32 битная версия, соответственно открывать 64 битные процессы ей не получится. 64 битная НЕ выйдет в ближайшее время.
*Распространение разрешено с указанием данного форума как источника и авторства (хотя в программе всё указано).
   

imaginary

imaginary

 

Firefox создатель "профилей"

Что бывает если сначала сделать а потом проверять...

Стало мне интересно, а что если в файле изменить текстовые название на другие?.. И так появился этот патчер, он создаёт изменённый exe файл в директории с firefox.exe, название которому даёт пользователь. Если запускать полученный файл, то открывается чистый абсолютно новый firefox, в котором нет никаких настроек, дополнений, информации и прочего, а так же который это всё не сохраняет.
Такой "супер приватный режим", при том после закрытия и открытия не изменённого exe файла, все закладки и прочая информация сохраняется, то есть использование такого изменённого файла никак ни на что не влияет. Изначально это планировалось как создание кучи exe каждый из которых будет иметь свой профиль, но оказалось что ничего не сохраняется... 🤦‍♀️

Инструкция к патчеру: Запустить патчер Нажать на кнопку "Создать профиль" Указать полный путь до изменяемого файла в появившемся окне Ввести название профиля
Профиль сохранится в ту же папку, файл будет иметь название которое вы дали профилю, основной файл не изменяется.
Работать должно на любых версиях браузера, ну может быть кроме очень старых.

Предупреждение: не стоит открывать основной профиль и тот который создан патчером одновременно..   Mozilla profile creator
 

imaginary

imaginary

 

[Assassin's Creed Unity] Отключалка проверки целостности

Думаю с получением бесплатной игры у многих могут зачесаться руки. Вот и набросал отключалку проверки целостности. Приятного взлома. Желательно запускать, после полной загрузки игры.     ACU_bypass.7z  

partoftheworlD

partoftheworlD

 

Приключение Wireshark в мире USB

Решил тут сделать кастомные пресеты для подсветки, но в софте производителя такой возможности не было, были стандартные, ограниченные. Как же я не люблю ограничения, ну что ж...приступим к исследованию.   Для начала необходимо понять как софт общается с клавиатурой, для этого запускаем Wireshark. При изменении яркости, происходит отправка пакета по USB.     Отлично, это уже что-то. Выполним еще пару действий, чтобы сделать шаблон для данных. //Стандартные настройки : 11 ff 0c 3a 00 01 ff 00 00 02 00 00 00 00 00 00 00 00 00 00 //Изменение яркости : 11 ff 0c 3a 00 01 f5 00 00 02 00 00 00 00 00 00 00 00 00 00 //Включение пресета : 11 ff 0c 3a 00 02 ff 00 00 10 40 00 64 00 00 00 00 00 00 00 //Изменение скорости пресета: 11 ff 0c 3a 00 02 ff 00 00 05 c7 00 64 00 00 00 00 00 00 00 Открываем 010 Editor и делаем шаблон.     Шаблон:   Шаблон можно будет использовать для программирования клавиатуры. Для программирования будем обращаться по имени HID устройства, чтобы с помощью CreateFile получить хендл и общаться с клавиатурой. Не самый лучший способ, но быстрый, хотя я бы выбрал хуки. Все есть файл. (ну почти) Посмотрим под отладчиком, что говорит софт логитека клавиатуре. Ставим бряк на WriteFile и бдыщ.     Дальше остается использовать CreateFile, Read/WriteFile, чтобы сделать основу для собственных пресетов. Один из плюсов всего этого, это уменьшение размера программы с 200 мб до 10кб.   Как раз вот-вот уже выходные, в планах привязать изменение подсветки клавиатуры в зависимости от готовности кофе в кофеварке. А до следующей статьи, можно будет разобрать как расширить функционал встроенных скриптов в клавиатуре и можно ли, туда прописать что-то действительно полезное, и что может пойти не так. И разобрать, за что отвечают последние 4 байта.

partoftheworlD

partoftheworlD

 

[Burp Suite] Написание кейгена для твика iOS

Похожая статья уже была, но тут "новый" инструмент и не просто подмена рандомного значения. Что ж, для начала надо запихнуть исполняемый файл под дизассемблер, ищем что-нибудь связанное с лицензией, реверсим.     Привели к читаемому виду, а теперь разбираемся что же тут происходит.   Часть 1, проверка, чтобы имя пользователя было не длиннее, чем 20 символов. IVar1 = __picsymbolstub4::_objc_retain(param_3,param_2,(_NSZone *)param_3); lenth = __picsymbolstub4::_objc_msgSend(IVar1,"length"); if (lenth < 20) { bResult._0_1_ = 0; } Часть 2. Считываем введенное имя пользователя с 12 по 16 символ. uname = __picsymbolstub4::_objc_msgSend(inpurt_username,"substringWithRange:",12,16); user_name = __picsymbolstub4::AutoreleasedReturnValue(uname); Часть 3. Получение серийного номера устройства. SerialNumber = __picsymbolstub4::_objc_msgSend(&ATTweakClient,"getSerialNumber"); serial_number = __picsymbolstub4::AutoreleasedReturnValue(SerialNumber); Часть 4. Составление строки из соли, серийного номера и имени пользователя. _complite_string = __picsymbolstub4::_objc_msgSend (&_OBJC_CLASS_$_NSString,"stringWithFormat:",&cf_%@%@%@, & cf_kyf6jFJYT8aawe[we]D+F-s4JYI3jsaDp69jsdq123sDdflkDuF3sgvlkd3asfKLFDGhjalsddgasd ,serial_number,user_name); complite_string = __picsymbolstub4::AutoreleasedReturnValue(_complite_string); Часть 5. Хеширование полученной строки. hash = __picsymbolstub4::_objc_msgSend(&Utils,"sha1:",complite_string); IVar1 = __picsymbolstub4::AutoreleasedReturnValue(hash); Часть 6. Узнаем, что приходит от сервера. (Формат ключа)   Начинаем писать кейген. #Импортируем модуль для работы с хеш-функциями from hashlib import sha1 #Задаем серийный номер аппарата serial = b"QTW6NR7XXP7M" #Задаем имя пользователя == 16 знакам name = b"partoftheworlD16" #Задаем соль salt = b"kyf6jFJYT8aawe[we]D+F-s4JYI3jsaDp69jsdq123sDdflkDuF3sgvlkd3asfKLFDGhjalsddgasd" def generate_license_file(): #Хешируем и переводим хеш в hex license_hash = sha1(salt + serial + name).hexdigest() #Формируем ключ key = license_hash[:12]+name.decode("utf-8")+license_hash[12:] #Формируем лицензионный файл print("{\"validated\":true,\"key\":\""+key+"\",\"create_time\":\"00:00:00 Apr 10, 2019 MSK\"}") generate_license_file() На выходе получаем. {"validated":true,"key":"2ebb4e00950epartoftheworlD16cff6343256a724d56eb6506173ec","create_time":"00:00:00 Apr 10, 2019 MSK"}   Теперь необходимо этот ключ как-то скормить программе. 1. Способ, поместить ключ прямо в папку с программой 2. Скормить, через ответ с сервера.   Я выбрал второй, просто потому, что мне лень по папкам лазить, чтобы создать файл. Пусть за меня это делает программа, я что её зря взламывал? Заходим в Burp Suite, вкладка Proxy, Options.     Переходим в программу и запрашиваем лицензию.     Ах да, я забыл снова включить прокси. Все, после запроса, срабатывает подмена ответа с сервера и в Burp Suite видим.     А на экране телефона, успешно загруженную лицензию.  
   

partoftheworlD

partoftheworlD

 

Fiddler vs Burp Suite

Ну что ж, случайно на последнем CTF узнал, что Burp умеет сертификаты генерировать для прослушки HTTPS. Раньше я писал скрип для подмены запроса для mouse sensitivity в Fiddler, а тут оказалось, ничего писать не надо, составил регулярку для поиска и написал в окошечко на что заменить. Да и инструмент более гибкий, имеющий кучу плюшек.     Это же прелесть. А баг так и не по фиксили.      

partoftheworlD

partoftheworlD

 

Игровой фаззер

В общем начал разрабатывать игровой фазер, предназначенный для восстановления классов и смещений для не виртуальных функций. На данный момент я представляю это как отдельный проект, возможно написанный с нуля, но думаю использовать готовые дизассемблерные библиотеки, чтобы сэкономить время, который будет представлять из себя универсальный дампер SDK для любых игр. Хотя использовать x64dbg для подобного будет очень даже уместно т.к. функциональное ядро будет готово.   На первом этапе вешаем бряк на инструкцию. Получаем стек вызовов и восстанавливаем путь от 1-й функции вызванной клиентом до последней в которой находимся мы. На втором этапе будет создаваться каркас из классов, функций и ответвлений, я думаю воспользоваться перекрестными ссылками. На третьем этапе начнется интерпретация и парсинг инструкций основного древа без ответвлений кода, чтобы восстановить используемые в коде смещения и типы данных, отслеживая поведение инструкций. На четвертом этапе будет проводиться тоже самое, но только для ответвлений имея на руках уже найденные адреса и значения, я думаю это эффективней работы с ответвлениями начиная с нуля. На пятом этапе представлять в графическом виде все древо. На шестом генерировать таблицу рекласса.   Красным веделен четвертый этап, черным третий.   Основная проблема в том, что мы не знаем точный размер структур. И пока я не представляю, как можно получить размер динамически выделяемой памяти. Как вариант, пятым этапом вешать бряки на функции освобождающие память, фильтруя по всем найденным начальным адресам структур и после убивать процесс, чтобы перехватить размер. А после обрезать структуры по размеру, но концепция "ищи, чтобы удалить" мне не очень нравится.   Плюсы данного проекта в том, что ничего не надо делать самому(пфф, что-то там руками искать в 2019), а так же можно прилепить на один из этапов "рекурсивное" восстановление, т.е начинаешь с инструкции патрон и чем больше смещений восстановится, тем к большему числу классов получаешь доступ для восстановления и так будет продолжаться, пока файл не восстановится полностью. (нет это не нейронная сеть, хотя кто знает)

partoftheworlD

partoftheworlD

×

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

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