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

Блоги

Новогодний PvP нагиб Warface

Возможен бан в игре. Вы используйте хак, на свой страх и риск.   Перед использованием, ознакомьтесь с ЭТИМ   Поддерживаемые ОС: Win7+ (x32 , x64) Поддерживаемые античиты: MRAC   Версия от 29.12.18 (Последняя) Undetected           Мемхаки: Без отдачи (Убирает отдачу у всего оружия) Точность 100% (Все пули летят в 1 точку) Супер урон (Повышает наносимый урон каждой пули в 10 раз) Скрыть ники (Скрывает ваш ник, ники союзников и противников. Вы будете показываться как ADMIN,  все остальные как BOT. В списке игроков, не будет видно НИКОГО) Антислепа (Убирает эффект светошумовых гранат) Подсад (Вы сможете забираться на любые возвышенности, без помощи напарника, там где это возможно в игре) Длинный подкат (Сможете подкатываться через полкарты) Бесконечные патроны (Патроны никогда не заканчиваются) Кик с ПВЕ (Сможете исключить ЛЮБОГО союзника с ЛЮБОЙ миссии или Спецоперации, в ЛЮБОЙ момент) ЕСП: Силуеты (Обводит противников в определенный цвет, в зависимости от видимости ) Линии (показывает линии от вашего прицела до противников) Взрывчатка (Позволяет видеть установленные мины, а также гранаты летящие в вас) Аимбот: Фаст Аим (Убиваете противников, даже не наводясь на них) Угол Аима (Выбор угла действия Аима) Кость (Аим всегда наводится на выбранную кость) Триггер бот / Автошот (Производит выстрел, при наведение на любую кость противника. Очень полезен на снайпере или медике.)   Инструкция: Закрываете игру и ИЦ Запускаете хак Запускаете игру Нагибаете   Показать / Скрыть меню - клавиша HOME Пароль от архива : wfru   ВИДЕО   ENJOY

JustHack

JustHack

 

CE 6.8.2. Lua .Считаем размер инъекции в байтах

Пост для тех, кто интересуется Lua в Cheat Engine.    Можно подхватить разные моменты активации и деактивации записи в таблице CE и рассчитать размер кода между метками   1. По шаблону вставляем АА код для туториала Cheat Engine 2. Регистрируем метки-маркеры в АА коде 3. Этими метками в Lua считаем и выводим ""endCode - startCode" размер байтов   Пример, который подсчитал 15 байтов       Пример скрипта   Документация кому интересно  

MasterGH

MasterGH

 

Боль и ненависть восстановления винды

В общем, сегодня расскажу историю о том как я восстанавливал систему имея на руках только загрузчик образов Acronis и старый телефон.   Представьте страшный сон сис.админа, когда уничтожается весь жесткий диск с бекапами и образами систем. В итоге компьютер становится гробом собирающим пыль.     Первое, что пришло в голову это скачать tib образ из облака, включив торрент на телефоне и скачав 4 гб бекапа из 8 начали появляться ошибки, потом вспомнил, что все MicroSD карты форматрованны в FAT, где размер 1 файла может быть не больше 4 гб. Искал бекапы под w10/8.1/7 и подошли по размеру только бекапы win хр, самые свежие за 15 год, из 30 бекапов получилось скачать только 2, никто не раздаёт, а те, которые получилось скачать невозможно было запустить, в системе было все на столько сильно вырезано, что отваливалось абсолютно все. Так я промучился около 1.5 суток. Единственное решение, которое было возможно сделать - отключить все драйвера и запустить систему в безопасном режиме, но тогда я не знал, работают ли вообще программы в этом режиме. После того как удалось успешно запустить WIndows XP, начал качать образ ubuntu и UltraISO, но после записи обнаружилось, что записывая загрузочные флешки Linux , через эту программу, флешки не будут запускаться, а других программ для создания загрузочных флешек я не нашел. А дальше, старый смартфон на андройде, плохой интернет, загрузка x32 образа винды, чтобы после получить доступ к современным программам и записать x64 винду и наконец-то восстановить систему.   В общем, флешек много не бывает, как и внешних жестких дисков. Лучше раскидать флешки по углам, чем потом придумывать такие извращения.

partoftheworlD

partoftheworlD

 

Самое интересное в дополненной реальности

Дополненная реальность похоже на спецэффекты в кино, только на экране видим изображение получаемое с видео камеры, которой управляет пользователь.    Что интересно. Камера, которая есть у многих на телефоне и допустим некоторая программа с API(какой-нибудь дополненной реальности написанная вами) определяет, что происходит на изображении и по этим данным можно   1) определить плоскости реальные в нашем мире 2) определить положение объектов относительно друг друга в нашем мире 3) определить уникальные маркеры и изображения   Это было чтение данных, затем идет запись данных. На изображение накладывается поверх другое.   Чтение данных с реального мира и запись данных поверх изображения по данным чтения это основные процессы.   Что меня заинтересовало. Так это, что можно что-то делать в реальности, а камера будет писать программу. Самый простой пример. Берем маркер - бумагу с рисунком. Камера увидела и поставила на нем 3д-дом или светофор. Резко убираем маркер и дом остается в этом месте. Таким образом можно построить виртуальный город. Есть на Ютубе.   Теперь можно взять вместо 3д-дома, 3д-светофоров маркеры для выстраивания алгоритма программы. Таким образом направив камеру можно что-то подхватывать из дополненной реальности, вытаскивать,  размещать таким образом программируя действия без строчки кода.   Берем маркер А и рядом с ним ставим маркер S. Означает, чтобы запомнилось положение макера А в пространстве. Убираем маркер S. Далее ставим маркер R, означает запись движения. Далее перемещаем А на точку2. Убираем маркер R, что означает остановку слежеия за маркеромА. Далее ставим маркер P, который запускает движение 3д объекта связанного с маркером А.   Ну и так далее. Это очень интересно в плане программирования маркерами...   Видео по построению объектов в городе  

MasterGH

MasterGH

 

[x64dbg] Снятие дампа с инструкции для самых маленьких

Итак, для дампа будем использовать точку останова с условием, с выводом определенных типов для нужных нам регистров.     Условие остановки: представляет из себя условие при котором будет срабатывать бряк, так как мы не знаем количество, функций которые имеет игра, то установим чуть меньше максимального количества функций в IDA. Текст журнала: Это то, что будет выводится в журнале во время остановки. Формат вывода такой {тип: регистр}. Весь список типов и пример использования:
    Условие добавление в журнал: Говорит само за себя. Текст команды: Это то, что будет выполняться после остановки бряка, на скрине указана команда go - тоже самое что нажать F9. Так же команд может быть несколько, каждая последующая добавляется со знаком точка с запятой. (go; StepOut) Условие для команды: Условие для выполнения команды. Счетчик остановок: Просто счетчик, к значению которого можно обратиться через $breakpointcounter   Демо:   Ссылка на док: https://x64dbg.readthedocs.io/en/latest/introduction/ConditionalBreakpoint.html

partoftheworlD

partoftheworlD

 

[Reverse Thread] Metal Gear Solid V: The Phantom Pain

Думаю, стоит начать создавать подобные темы на ковыряемые игры участниками форума, чтобы каждый мог внести вклад в будущее разработки трейнеров/читов конкретной игры, объединив усилия при поиске и реверсе, и конечно же, узнать что-то новое,а так же воспользоваться этим функционалом. Так как решил сделать Silent Aim для этой игры, начнем пожалуй с неё. Тема будет обновляться, если есть желание помочь, пишите комментарии с найденными плюшками, они так же появятся в этой теме.   Base_ptr : "\xE8\x00\x00\x00\x00\x48\x8B\x05\x00\x00\x00\x00\x48\x85\xC0\x48\x0F\x44\xC3", "x????xxx????xxxxxxx" + 8 CWeapon : [Base_ptr] CWeapon_vftable : [Base_ptr] + 0x330     Определение адресов интерфейсов игры: Скрипт использует адреса перекрестных ссылок функции CreateInterface, чтобы получить все функции, которые создают интерфейсы, после скрипт получает адрес функции, декомпилирует, регулярками чистим вывод декомплиятора, передаем имя интерфейса и его адрес функции переименовывающей адреса. (в скрипте перекрестные ссылки в виде массива, просто потому что они статичные)   И список всех интерфейсов:   Игровые функции и lua методы (дамп):   Reclass: metal_gear.rcnet Игровые скрипты: Scripts.7z (позже будет отформатированная версия)  

partoftheworlD

partoftheworlD

Создаем internal мультихак, на примере игры Warface [5 часть]

Всем привет. В этой статье, мы создадим 100% точность и разброс для нашего мультихака. В этом уроке, появляется всё больше самостоятельной работы. Хотя, для тех, кто освоил прошлые уроки, это покажется легкой прогулкой. Мы просто, заставляем ваш мозг производить какие-то действия, а не тупо идти по шагам и копипастить. Итак, для создания этих хаков, нам понадобится узнать смещения 2 классов - IGame и ICVar.   IGame  -  ищем "IsPlayer"   Нашли, вышли на ссылки, зашли в псевдокод     Получили смещение класса IGame.  Аналогично с ICVar -  ищем "GetCVar" и проделываем предыдущие шаги.   После этого, нам нужно найти смещения функции SetIPelletsDisp и CrosshairSpreadTuning в ICVar Это останется вам, как домашнее задание. Строки для поиска, указаны в комментариях к коду.   Нашли, восстановили классы, пишем саму функцию   Собираем, внедряем, готово. Продолжение следует...      

JustHack

JustHack

 

[Разное] Почитать на вечер.

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

http://etutorials.org/Networking/network+security+assessment/Chapter+13.+Application-Level+Risks/

partoftheworlD

partoftheworlD

 

[Pwnie Island: Pwn Adventure 3] Pirate's Treasure

Это было великолепное задания, я прям удовлетворен. Советую всем попробовать эту игру, это отличная практика, где можно попробовать свои силы в разных сферах. От поиска и изменения значений до понимания работы прокси сервера, перехвата пакетов, модификации, генерации ключей и целочисленного переполнения.    

partoftheworlD

partoftheworlD

 

[IDA PRO 7] Расширенная фильтрация инструкций по стеку вызовов

Ничего нового, просто из-за ненадобности решил поделится скриптом, который поможет многим в анализе стека вызовов. Кому хочется искать где пишется и используется какой-либо адрес или переменная. Достаточно сделать бряк, скопировать адреса функций из стека вызовов и указать необходимую инструкцию.    Например, нам необходимо узнать что происходить с ebp+arg_0 по ходу выполнения кода десятка  функций по сотне инструкций в каждой.   Вставляем в скрипт адреса из стека вызовов:     Вставляем то, что нужно найти: ebp+arg_0   И в выводе получаем:   Addr | Instruction | ---------------------------------------------- ---------------------------------------------- 0x88B59 -- mov eax, [ebp+arg_0] ---------------------------------------------- 0x2DCA16 -- mov ecx, [ebp+arg_0] 0x2DCA59 -- push [ebp+arg_0]; void * 0x2DCA71 -- movss xmm0, [ebp+arg_4] 0x2DCA9E -- movss xmm0, [ebp+arg_4] ---------------------------------------------- 0x2DC8BC -- push [ebp+arg_0] 0x2DC8DB -- mov ebx, [ebp+arg_0] ---------------------------------------------- 0x1D6D3A -- mov esi, [ebp+arg_0] 0x1D6ED6 -- mov esi, [ebp+arg_0] ---------------------------------------------- 0x1D6F2A -- mov ebx, [ebp+arg_0] 0x1D6F5F -- cmp [ebp+arg_4], 0 0x1D6F87 -- mov eax, [ebp+arg_4] 0x1D717C -- mov byte ptr [ebp+arg_4+3], cl 0x1D71CA -- cmp byte ptr [ebp+arg_4+3], 22h ---------------------------------------------- или например при поиске скорострельности, ставим бряк на адрес инструкции отнимающей патроны, вставляем стек вызовов и фильтруем:   Addr | Instruction | ---------------------------------------------- 0x21068F -- ucomisd xmm1, xmm0 0x21073A -- comiss xmm0, xmm1 0x210792 -- comisd xmm1, xmm0 0x2108EF -- comisd xmm5, xmm0 0x210B4F -- comiss xmm0, ds:flt_4DC2A8 0x211366 -- comisd xmm1, xmm0 0x211478 -- comiss xmm0, xmm1 0x2114FC -- comisd xmm0, [ebp+var_50] 0x211885 -- comiss xmm0, xmm1 0x211915 -- comisd xmm0, ds:dbl_4DC5E8 ---------------------------------------------- 0x222437 -- comiss xmm0, xmm1 0x222452 -- comiss xmm1, xmm0 0x22247E -- comiss xmm1, xmm0 ---------------------------------------------- 0x277321 -- comiss xmm0, ds:dword_4DBFC8 0x2773A5 -- comisd xmm1, qword_895F18 0x277422 -- comiss xmm1, xmm0 0x277446 -- comiss xmm0, xmm1 ---------------------------------------------- Бам, как 2 пальца почесать.   Ссылка на скрипт: https://github.com/partoftheworlD/IDA7_IntructionFilter   В планах написать интерфейс, а то без него как-то не круто. Так же будет подобный плагин для radare2, но позже.

partoftheworlD

partoftheworlD

 

[Alpha protocol] Управление скоростью показа диалогов. Часть 2. Исследование+

Статьи придется растянуть ещё на 1-2 т.к. я свалился с температурой. Но сегодня не об этом, для начала нам необходимо вспомнить структуру построения диалогов.   [B01_P_INTRO_01_000 SoundNodeWave] SpokenText="Ты очнулся, очень хорошо - я не знала, сколько ты проваляешься. Эти транквилизаторы в конце концов перестали действовать." Comment="NOTES[], TRIGGER[], GLOSSARY[]" bMature=False Subtitles[0]=(Text="Ты очнулся, очень хорошо - я не знала, сколько ты проваляешься. Эти транквилизаторы в конце концов перестали действовать.") Необходимо обратить внимание на идентификатор, а точнее на SoundNodeWave, в прошлой статье я забыл указать, что это класс UE3, по сути это звуковой узел, работающий с локализацией, который содержит данные об воспроизводимом файле, а также его характеристиках.   Но для нашей цели, а именно увеличения времени показа субтитров, надо обратить внимание на массив Subtitles, а дальше просто, посмотреть в документацию.     смотрим на структуру array<SubtitleCue>     Линия текста субтитров и время, которое субтитры должны отображаться. Из примера выше:   Text="Ты очнулся, очень хорошо - я не знала, сколько ты проваляешься. Эти транквилизаторы в конце концов перестали действовать."   Вот мы и нашли способ для увеличения времени показа субтитров, имея на руках только гугл и файлы локализации. Да, он относительно долгий (нам надо будет переписать все субтитры, а их там 598 файлов). Можно конечно скрипт написать, который подправит все, но должен же быть способ проще. Но насколько я понял по локализации, то проблема в быстрых субтитрах именно в ней, в нормальной английской версии, субтитры разделены на группы, а в русской все в одной строке.   Eng: [B01_P_INTRO_01_000 SoundNodeWave] SpokenText="Good, you're awake - I wasn't sure how long you'd be under. Those tranquilizers wore off fast." Subtitles[0]=(Text="Good, you're awake - ") Subtitles[1]=(Text="I wasn't sure how long you'd be under. ") Subtitles[2]=(Text="Those tranquilizers wore off fast.") bManualWordWrap=True Comment="NOTES[], TRIGGER[], GLOSSARY[]" bMature=False Rus: [B01_P_INTRO_01_000 SoundNodeWave] SpokenText="Ты очнулся, очень хорошо - я не знала, сколько ты проваляешься. Эти транквилизаторы в конце концов перестали действовать." Comment="NOTES[], TRIGGER[], GLOSSARY[]" bMature=False Subtitles[0]=(Text="Ты очнулся, очень хорошо - я не знала, сколько ты проваляешься. Эти транквилизаторы в конце концов перестали действовать.") В следующей статье, мы будет находить объект SoundNodeWave, реверсить его структуру, восстанавливать в ReClass и писать скрипт в CE, который будет подсовывать в массив SubtitleCue указанное нами время. Или оставить это моим читателям как домашнее задание?

partoftheworlD

partoftheworlD

 

[Alpha protocol] Управление скоростью показа диалогов. Часть 1. Исследование

В игру я не играл, поэтому начнем с того что известно, используется движок в игре Unreal Engine 3. Это на самом деле круто, у движков UE достаточно упорядоченная структура данных, что во многом облегчит исследование и модификацию игры. Покопался в папках игры и нашел файлы с субтитрами, которые привязаны к звуковому диалогу, о чем и была речь в прошлой статье.  Субтитры выглядят вот так:   [E08_D_LELAND_01_003 SoundNodeWave] // идентефикатор воспроизведенного звукового диалога, указывающий миссию, имя персонажа и номер диалога SpokenText="If by home, you mean prison. Mr. Westridge first spoke to you in this room, didn't he?" // Озвученный текст Subtitles[0]=(Text="If by home, you mean prison. ") // Subtitles[1]=(Text="Mr. Westridge first spoke to you in this room, didn't he?") // Субтитры bManualWordWrap=True // Возможно, пропуск диалогов по нажатию кнопки Comment="NOTES[], TRIGGER[], GLOSSARY[]" // ??? (Возможно, добавление в записи, типа логирование диалогов) bMature=False // Цензура     Хех, за 10 минут мы добыли всю нужную информацию для реверса. Пока порядок действий таков:   Найти название идентификатора диалога, поставить на него бряк. Найти функцию, которая читает из файла с диалогами идентификатор, чтобы получить доступ к функции, которая будет считывать диалоги, а после рисует их. А также, найти прямую связь между запуском озвучки с субтитрами.     Продолжение следует...

partoftheworlD

partoftheworlD

 

Разбор работы системы диалогов в играх

Итак, это будет предисловие к основной статье, здесь мы рассмотрим структуру диалогов и как они создаются. Во вторник я освобожусь и уже займусь написанием основной статьи.   Существует всего несколько типов привязки диалогов для показа игроку: К какой-либо ситуации(триггеру) К нажатию клавиш К среднему времени чтения диалога. К озвучке   Чаще всего используется 4 вариант, но есть извращенцы, которые любят смешивать 1-2, 1-3.   Первая привязка это привязка к триггеру, когда игрок подходит к определенному нпц с каким-либо квестовым предметом, то срабатывает триггер и запускается диалог.   Вторая привязка это привязка к нажатию клавиш, т.е подойдя к нпц диалог не будет запущен, пока не будет нажата клавиша.   Третья привязка по времени, обычно в таком варианте используется константа для показа диалогов, значение константы рассчитывается командой специалистов по *заумное название исследований поведения и информации тестировщиков*   Четвертая привязка, субтитры привязываются к озвучке т.е если началась озвучка, то после начинаются рисоваться субтитры, а как только заканчивается воспроизведение файла с диалогом, то и субтитры пропадают.   В играх на UE, Unity диалоги делаются с помощью чертежей, либо написанием кода.

  В других играх через скрипты.   Но что объединяет эти способы? Инициализация пользовательского интерфеса. Парсинг игровых файлов, для загрузки диалогов в память.   Отлично, теперь мы знаем, что нам необходимо искать, либо находить функцию рисования субтитров, через поиск текста в памяти, либо будем искать обработчик/проверку, которая будет проверять запущена ли озвучка, и когда она заканчивается. Скорее всего, используется QueryPerformanceCounter для вычисления момента когда остановится озвучка и выглядит как-то так. rax, rbx, rcx = 0 rax = QueryPerformanceCounter() rbx = GetDialogTime("dialog_+" i "+.wav") rcx = rbx + rax while(bDialogEnabled): if rax > rcx: clear_text(); Dialogs[i]++; else: draw_text(Dialogs[i]) Вдруг это предисловие сможет указать верный путь для тех, кто не хочет ждать когда за него все сделают. Если такие найдутся, то пишите о результатах в комментариях к этой теме(пока что, позже все комментарии будут перенесены в основную статью)

partoftheworlD

partoftheworlD

 

[Dishonored] История о там как решал проблему с русской версией игры

Добро пожаловать на борт, мои юные любители моря и реверса. На этот раз мы решим проблему игры, разработчики которой не стали этого делать уже на протяжении 6 лет.   На весь реверс ушло порядка 50 рюмок рома, 6 подбитых кораблей британской империи и конечно же несколько портовых шл..., ах да, реверс. С языковыми winapi я не работал до этого момента и поэтому пришлось вручную дебажить весь код от инициализации игры, до создания интерфейсов и всякой не интересной ерунды.   Итак, изначально у нас было решение проблемы в виде костылей, что для фикса надо сменить язык в системе или текущую клавиатуру на английский, но кому это нравится? Можете спросить: «Зачем отлаживать код вручную, когда есть трассировка?»
Ну что-ж, мои маленькие пираты ответ прост, игра при использовании трассировки или отладки с обходом вызывает странный код и пропускает вообще все, что нам нужно исследовать, который при отладке с заходом не вызывается.     Всего пришлось дебажить около 10к инструкций, чтобы найти винапи которая выгружает, угадайте что? Правильно, идентификатор локали ввода. После вызова этой функции, у нас и пропадает из трея языковая панель и ломается локаль. Итак, мы нашли виновника, и что нам делать с ним? Нет, мы не будем скидывать разработчиков за борт. (а стоило бы)     Теперь нам нужно понять, как это все работает и откуда берется этот идентификатор локали ввода.   Отправляемся в бухту знаний и таинств…     Гуглим, гуглим, гуглим и наконец нагуглили winapi с именем LoadKeyboarLayout, круто,  отправляемся снова в дом к прекрасной иде, которую за все время нашего путешествия встречаем впервые, переходим на адрес инструкции с функцией выгрузки идентификатора. Вот и весь путь идентификатора.       Нашли мы LoadKeyboarLayout и теперь нас будет интересовать только первый аргумент этой функции, почему так? Да просто потому что мы умеем читать документацию и знаем, что значение первого аргумента равно 409, будет работать как положено, только если дефолтный язык в системе будет английский, для русского языка, необходимо использовать значение 419 это можно найти в мсдн.     В чем же заключалась проблема? Я думаю в лени разработчиков, а если судить о коде, проблему вызывала загрузка английской локали, но если её нет, то и загружать нечего, а значит и выгружать, а значит будут проблемы. Фикс заключается в исправлении значений загружаемой локали для распакованной версии, либо создании загрузчика для стимовской версии, который бы фиксил все это каждый запуск.   Всех с днем пиратства!   P.S Ах, да совсем забыл написать, все эксперименты проводились на распакованной версии игры, без Steam DRM т.к. со Steam DRM весь файл зашифрован и найти что-либо или пропатчить невозможно. Этим утром нашел ещё проблему некорректной инициализации steamapi, из-за чего игра время от времени крашилась. Сам по себе Steam-DRM инициализирует steamapi, но раз мы его вырезали, то естественно будут проблемы при обращении к нему. Для того чтобы решить проблему со steamapi, нам необходимо создать текстовый файл около файла steam_api.dll с именем steam_appid.txt и указать в нем ID игры для принудительно инициализации.    

partoftheworlD

partoftheworlD

 

Временное отсутствие

Привет всем. Я думаю, что меня может не быть на форуме продолжительное время от 2х месяцев в связи с обстоятельствами. Переезд, поиск работы и семейные обстоятельства. Второй момент. Я создал кнопки яндекс кошелька в некоторых темах моего блога. Толку от кнопок нет, т.к. там все по нулям. Поэтому я их удалю. Lua плагины для CE пока делать нет возможности. До встречи в Москве! ) Буду искать работу в новой игровой студии уже в Москве

MasterGH

MasterGH

 

[Counter-Strike Global Offensive]RCS аналог no recoil

Сегодня сделаем Recoil Control System, а точнее его простейшую реализацию. Используя такой способ можно добиться стрельбы в одну точку на любом расстоянии с учетом значений разброса и ускорения отдачи. Все как обычно, открываем иду и ищем смещения.  m_Local m_aimPunch   Ещё необходимо найти адрес управляющий координатами камеры, но это слишком просто чтобы останавливаться на этом. Итак, теперь надо компенсировать отдачу, для этого мы просто складывает старый вектор Punch с новым, можно умножать на 2, но точность будет отличаться на 10-15%.   DWORD m_dwLocal = 0x0; DWORD m_vecAimPunch = 0x0; vec3 m_vecOldPunch = {0,0,0}; auto CLocalPlayer = m->read<DWORD>(dwClient + 0x00C5C86C); auto CClientState = m->read<DWORD>(dwEngine + 0x586A74); vec3 m_vecAngles = m->read<vec3>(CClientState + 0x4D10); vec3 m_vecPunch = m->read<vec3>(CLocalPlayer + m_dwLocal + m_vecAimPunch) static vec3 *tempAngles = new vec3(m_vecAngles); tempAngles->x -= m_vecPunch.x + m_vecOldPunch.x; tempAngles->y -= m_vecPunch.y + m_vecOldPunch.y; tempAngles->z = 0; m->write<vec3>(dwvecAngles + 0x4D10, tempAngles); m_vecOldPunch = m_vecPunch; delete tempAngles; Это конечно не так просто как в Warface, но затруднений вызвать не должно.      

partoftheworlD

partoftheworlD

 

[IDA Pro] Отслеживание интересующего регистра по функции

Сегодня напишем простейшую реализацию функции поиска используемого регистра в коде при статическом анализе, как когда-то показывал этот функционал в radare2. Немного модифицированный скрипт стоит у меня на вооружении для динамического анализа т.е. определяет где впервые адрес появляется, как рассчитывается, дампит смещения и пробует найти сигнатуру на статический адрес в коде. В общем немного подумав и почитав доки по иде, тоже сможете такое сделать без особых проблем.   Скрипт пишется минут за 15-20, но в дальнейшем экономит нереально много времени.   Единственная проблема возникла с получением точно адреса инструкции, во избежании повторений в выводе и была написана альтернатива функции range.  # подключаем необходимые библиотеки import idc # стандартные модуля для общения между идой import idaapi import re # для расширения функционала поиска reg_value = r'.*\[r14\+.*' # то, что будем искать def range_reverse(start, stop): # аналог функции range for i in FuncItems(start): if i < start and i >= stop: yield i ea = ScreenEA() # получение текущего адреса курсора current_function = idaapi.get_func(ea) # получение информации о функции # перебор инструкций по адресам for inst_addr in range_reverse(ea, current_function.startEA): disasm_output = idc.GetDisasm(inst_addr) # вывод дизассемблированной инструкции по её адресу if re.findall(reg_value, disasm_output): # фильтрация по нужному тексту print("0x%X" % inst_addr, disasm_output) Раз скрипт уже написали(скопипастили), приступим к тестам.   И так, у нас есть инструкций работающая со скорострельностью, нам надо посмотреть всякие интересности, типа проверок, что ещё работает с базовым адресом таймера скорострельности и т.д.     Выполняем скрипт и получаем всю информацию о интересующем регистре, так же, чтобы избавится от инструкций чтения и выводить только инструкции записи, можно добавив одну проверку, но с этим вы сами сможете справиться, я надеюсь вы меня не расстроите.     Так же можем отследить как вычисляется база следуя за регистром, переходя двойным кликом по адресу в окне вывода.     Это ведь проще, чем руками скролить функцию под 10-20к инструкций. В общем, если лень, что-то делать — автоматизируй или не делай.  

partoftheworlD

partoftheworlD

 

[IDA Pro] Экспорт информации из старой базы в новую

Тыкался тут на днях в кнопочках у иды и как оказалось у неё есть экспорт, и давно был, просто находятся в самом неожиданном месте. Так что, я был удивлен и расстроен одновременно. А расстроен тем, что я писал плагин для экспорта, руководствуясь словами "раз нет какого-то функционала, то сделай".   Итак, чтобы задампить всю информацию из старой базы надо будет кликнуть на File->Produce file -> Dump database to IDC script.   В итоге ида создаст для нас скрипт со всей информацией, останется лишь после анализа нового файла запустить его и база восстановится. Пример скрипта.     Если вы анализировали дамп, то советую перебазировать его по первому сегменту к 0 старую и новую базу, перед созданием скрипта для экспорта. И восстановление занимает достаточное количество времени(возможно, зависит от того на сколько восстановлена база) поэтому это отличная возможность, чтобы сходить за чаем.

partoftheworlD

partoftheworlD

 

[Grand Theft Auto Online] Поиск скрытых структур за счет игровых скриптов

Необходимые инструменты чтобы начать искать и делать скрытые структуры: OpenIV, Cheat Engine, GTA HLD, какой-нибудь ЯП для автоматизации действий и конечно же GTA. По сути этот метод позволяет использовать нативные вызовы без инъекции/скриптов в игру и делать с ней все что вздумается, спавнить оружие, спавнить машины, накручивать деньги, перемещать других игроков и т.д возможности безграничны. Итак, открываем OpenIV, находим скрипт freemode, экспортируем и декомпилируем с помощью GTA HLD , на выходе получается такой псевдокод.     Нас интересуют только глобальные переменные - Global_XXXX, где XXXX это значение индекса по которому будем вычислять положение скрытой структуры, кстати все это делается в той же функции которая была в прошлой статье про гта и чтобы не создавать костыли, достаточно зареверсить функцию и скопировать из неё код.   Вычисления будут выглядеть примерно так, newGlobalPageBase = struct_array + 8 * (index >> 18 & 0x3F) , таким образом мы получаем страницы памяти по 2Мб в которых будут скрытые структуры, а чтобы получить конкретный адрес, для работы с глобальной переменной,  value = newGlobalPageBase + 8 * (index & 0x3FFFF) Рассмотрим все это на конкретном примере, например на таймере одной из заданий.     Теперь, нам необходимо посчитать, либо индекс до начала структуры 0x40001, либо сразу до значения просто сложив 0x40001+0x454B. Подставляем, индекс в наш код и хоба     У нас есть адрес таймера игрового скрипта, который бы мы не смогли найти вручную с помощью поисковика, просто  потому что это статическое значение. Этот способ проще, быстрее и дает нам безграничные возможности по взлому игры просто тыкаясь в файлы скриптов. Именно таким образом и работает накрутка денег, спавн машин в онлайне, только манипулируя памятью игры.   Благодарности:  Reversal Thread 7h3 7r14ngl3

partoftheworlD

partoftheworlD

 

Основа для нейронной сети основанная на OpenCV

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

partoftheworlD

partoftheworlD

×

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

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