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

Блоги

 

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

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

partoftheworlD

partoftheworlD

 

Плагин для ведения логов в CE

Плагин ведет историю поиска, отсева, отмены. Логи выглядят следующим образом Для чего может применятся На шаге отсева посмотреть в логах, какое значение искали до этого и какой способ поиска использовали. При неудачных поисках мы просматриваем как и что мы сканировали раньше. Если вообще ничего не получается при сканировании, то логами можно обмениваться. Горячие клавиши, которые настраиваются из окна настроек CE работают и в логах.   Установка: скопировать GHL_log.lua в директорию "/autorun" Lua скрипт:  В комментариях можно написать про ошибки или про идеи улучшения плагина.  

MasterGH

MasterGH

 

Скин для Vivaldi

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

partoftheworlD

partoftheworlD

 

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

И снова, здравствуйте)) В этой части, мы с вами создадим NoRecoil hack. Здесь, я уже не буду всё разжевывать. Опирайтесь на прошлые статьи, кому что-то не понятно. Открываем дамп из прошлых частей. Поиск по строкам. Для начала, нам нужно найти IGameFramework.   Вводим "Failed to create the GameFramework Interface!".   Двойной клик по строке, попадаем сюда   Через окно перекрестных ссылок, выходим на адрес   Итак, мы нашли адрес IGameFramewrok = 0x1AF7E2C   Теперь, в окне поиска строк, ищем "sp_difficulty"   Двойной клик по строке. Меню перекрестных ссылок. Открываем псевдокод.   Через ReClass x32 восстанавливаем классы. Переходим к написанию кода.   classes.h     Собираем проект. Внедряем в игру. Готово.  

JustHack

JustHack

 

[Grand Theft Auto Online] Stealth money или поиск скрытых структур для получения денег

Необходимые инструменты чтобы начать искать и делать стелс деньги: OpenIV, IDA, Cheat Engine и конечно же GTA с доступом к онлайну. Так же, если вы все собираетесь проделывать на основном аккаунте, то советую после всех манипуляций удалить персонажа и создать нового, так очищается список транзакций(но это не точно). Для начала нам необходимо зайти в одиночный режим, чтобы найти инструкции работающие с деньгами.     Это нам необходимо для того, чтобы не искать деньги в онлайне, в любом случае там найти мы их не сможем. Дальше, переходим в онлайн и так же переходим в дизассемблер. Нам необходимо узнать как рассчитывается rdx.     Ставим бряк на инструкцию mov rdx, [r8+rax*8] и в регистре rdx видим 00007FF739F26820, перейдем на этот адрес в IDA. Да это же массив с указателями на скрытые структуры, нам необходимо найти единственную работающую с деньгами, я думаю вы сами справитесь с этим, поэтому, как только мы нашли структуру связанную с деньгами высчитаем её индекс, он нам пригодится во время эмуляции транзакции.   (00007FF739F268A0 - 00007FF739F26820) / 8 = 0x10  
Теперь, нам придется восстановить смещения, проблема в том, что эта структура работает только с миссиями, ну что ж пойдем работать, но сначала необходимо найти начало структуры внутри указателя на структуру денег, для этого ещё немного по реверсим, зная адрес начала структуры поставим на инструкцию которую нашли до этого бряк с условием.     И идем выполнять миссию, главное получить деньги, поэтому советую выбрать одиночную миссию т.к. во время бряка с условием у вас будет фпс около 3-4 кадров(на моем компуктере миссия в 5 минут растянулась на 2 часа и пришлось перепроходить т.к. бряк не сработал, ага победитель по жизни.). Так что вас ожидает боль и страдания, но как только найдем начало нашей структуры, выставляем сравнение структур с блокировкой текущего состояния структуры и снова идем проходить миссию(в этот раз все будет на много лучше, обещаю)

  После прохождения миссии, снова смотрим в эту структуру, получаем вот такие значения, это и есть смещения работающие с транзакцией.   #1 000000000000004A * 8 = 1 (offset 0x250 ) //активатор транзакциии #2 0000000000000000 * 8 = 5 (offset 0x00 ) //5 счет банка, 4 наличка #3 0000000000000001 * 8 = 3587 (offset 0x08 ) //сумма #4 0000000000000002 * 8 = 1 (offset 0x10 ) //активатор #5 0000000000000003 * 8 = BC537E0D (offset 0x18 ) //хеш #6 0000000000000004 * 8 = 00000000 (offset 0x20 ) //сервисный хеш #7 0000000000000006 * 8 = 57DE404E (offset 0x30 ) //хеш #8 0000000000000007 * 8 = 00000000 (offset 0x38 ) //хеш типа действий #9 0000000000000047 * 8 = 4 (offset 0x238 ) //?? #10 0000000000000048 * 8 = 7 (offset 0x240 ) //?? #11 000000000000000A * 8 = -1 (offset 0x50 ) //?? #12 0000000000000028 * 8 = 0 (offset 0x140 ) //?? #13 0000000000000049 * 8 = 0 (offset 0x248 ) //?? #14 000000000000004B * 8 = 0 (offset 0x258 ) //?? #15 000000000000004F * 8 = 0 (offset 0x278 ) //?? Теперь нам необходимо найти новые хеши вместо нулей, для этого запускаем OpenIV и ищем файл с названием networkshop, и подставляем все хеши из блоков actiontype и services по нашим смещениям, actiontype задает тип транзакции т.е. добавить, отнять деньги и т.д, services задает от кого мы получили деньги, от R*, с гонок, со ставок и т.д.     Комбинаций много, но что делать, халява это дело времязатратное, тем самым перебирая хеши выстраиваем порядок выполнения транзакции, но иногда хеши фиксят, чтобы не допустить распространение читов.   BC537E0D
57DE404E
Эти 2 хеша предустановлены их можно найти в коде тем самым определив и функции работающие с транзакциями. Самое время начать писать код и тестировать. Хеши не рабочие в этом примере кода, чтобы любителям ничего не делать, пришлось пошевелиться.😉 //активация транзакции DWORD64 activate = 0x1; //установка хешей валидации транзакции WriteProcessMemory(hProcess, reinterpret_cast<PBYTE*>(buf + 0x60), &activate, sizeof(activate), 0); DWORD64 value = 0xBC537E0D; WriteProcessMemory(hProcess, reinterpret_cast<PBYTE*>(buf + 0x68), &value, sizeof(value), 0); //установка суммы транзакции int amount = 10000000; WriteProcessMemory(hProcess, reinterpret_cast<PBYTE*>(buf + 0x58), &amount, sizeof(amount), 0); //установка хешей действий и откого будем получать деньги value = 0x762D6BF6; WriteProcessMemory(hProcess, reinterpret_cast<PBYTE*>(buf + 0x70), &value, sizeof(value), 0); value = 0x3B6B7024; WriteProcessMemory(hProcess, reinterpret_cast<PBYTE*>(buf + 0x88), &value, sizeof(value), 0); value = 0x57DE404E; WriteProcessMemory(hProcess, reinterpret_cast<PBYTE*>(buf + 0x80), &value, sizeof(value), 0); //установка для того чтобы транзакция не зависла в ходе выполнения по разным причинам value = 0x7FFFFFFF; WriteProcessMemory(hProcess, reinterpret_cast<PBYTE*>(buf + 0x50), &value, sizeof(value), 0); value = 0x07; WriteProcessMemory(hProcess, reinterpret_cast<PBYTE*>(buf + 0x290), &value, sizeof(value), 0); //куда будем давать деньги 4 наличка, 5 счет банка value = 0x04; WriteProcessMemory(hProcess, reinterpret_cast<PBYTE*>(buf + 0x288), &value, sizeof(value), 0); value = 0x01; WriteProcessMemory(hProcess, reinterpret_cast<PBYTE*>(buf + 0x2a0), &value, sizeof(value), 0); //деактивация транзакции value = 0; WriteProcessMemory(hProcess, reinterpret_cast<PBYTE*>(buf + 0x78), &value, sizeof(value), 0); WriteProcessMemory(hProcess, reinterpret_cast<PBYTE*>(buf + 0x298), &value, sizeof(value), 0); WriteProcessMemory(hProcess, reinterpret_cast<PBYTE*>(buf + 0x2a8), &value, sizeof(value), 0); WriteProcessMemory(hProcess, reinterpret_cast<PBYTE*>(buf + 0x2c8), &value, sizeof(value), 0); Инструкции работающие со значениями в функции.     Ну и результаты, так же я испытываю новый метод поиска подобного функционала, если все пройдет удачно, то скоро будет новая статья, в разы проще этой и быстрее. Ну, что вы молодцы, если дочитали до сюда, можете взять печеньку.      

partoftheworlD

partoftheworlD

 

Скрытые структуры, что это такое и с чем их едят.

Сегодня у нас будет прелюдия перед основной статьей, так что желательно быть готовым ко всему. Поехали. Скрытые структуры, что они из себя представляют? Скрытая структура это какая-то структура находящаяся в любой части используемой кодом структурой(назовем её мега-структурой), обычно мега-структуры огромных размеров(не зря же мы её так назвали) и содержат в себе по 10-100 скрытых структур, в ГТА например она занимает около 105кб. Как вообще игра находит скрытые структуры? Да, как и везде адрес мега-структуры + index * 0x8 для 64 битных приложений. А теперь поговорим о том как они работают, по сути скрытые структуры просто принимают в себя значения, а в коде это выглядит как обычная функция примерно так.

  Если по простому, то скрытые структуры можно представить как обработчики значений, которые работают постоянно, но как только определенное смещение будет равно определенному значению, то что-то случится. Одна из проблем при использовании таких структур им необходимо подавать все переменные в определенном порядке, например, если мы не активируем транзакцию, то и значение передаваемое не будет обработано, оно будет просто пропущено. Находить такие структуры обычным поиском практически не реально, значения попадающие в неё перезаписываются нулями через 10-20 мс в среднем. Поэтому нам и необходим реверс-инжиниринг. Еще одна проблема конкретно для гта, это расширение функционала структуры, а именно получение рабочих хешей, скажем так, хеши нужны для того чтобы транзакция считалась валидной для определенного количества денег, например для значений денег от 100к до 1 миллиона будет один хеш, для того чтобы получить от 1 миллиона до 10 миллионов нужен другой, но об этом расскажу в следующей статье. Думаю, пока информации хватит, если возникнут вопросы по таким структурам, то пишите в комментариях.    

partoftheworlD

partoftheworlD

 

[RTTI] Автоматизация дампа структур класса

Хехей для начала мне лень писать статью с картинками и прочим, кто поймет, тот молодец, а кто нет, значит не особо нужно. Ну в общем я когда-то показывал что можно сделать с динамической типизацией, а точнее с классами, так что мы будем использовать код сканера сигнатур, немного переписав его чтобы сканировать всю память компьютера, чтобы дампить все предметы которые используют выбранный нами класс. Для начала подготовим базу, берем свой сканер сигнатур, либо из паблика. 
Теперь нам необходимо изменить  код который указывает диапазон по которому мы будем брать страницы виртуальной памяти.
Он выглядит примерно так: while(offset < size) { VirtualQueryEx ... Для того, чтобы получить минимальный и максимальный адрес памяти будем использовать GetSystemInfo.
  SYSTEM_INFO si; GetSystemInfo(&si); auto seg_base = si.lpMinimumApplicationAddress; while (seg_base <= si.lpMaximumApplicationAddress) { if (VirtualQueryEx(hProcess, reinterpret_cast<DWORD64*>(seg_base), &mbi, sizeof(MEMORY_BASIC_INFORMATION))) ... Необходимо отфильтровать страницы, чтобы уменьшить время поиска значений и работы программы, для этого добавляем такую проверку.   if ((mbi.State == MEM_COMMIT) && (!(mbi.Protect & PAGE_GUARD)) || (!(mbi.Protect & PAGE_NOACCESS))) Теперь в цикле будем считывать адреса с шагом в 4 байта каждой оставшейся страницы памяти.
  for (auto i = 0; i < mbi.RegionSize; i+=4) { ... ReadProcessMemory(hProcess, reinterpret_cast<PBYTE*>(base + i), &wrBuff, sizeof(wrBuff), nullptr); Настало время для проверки значений, это можно сделать с помощью memcmp и загрузить результат в контейнер для удобного хранения. Выглядит это примерно так.     Из минусов такой способ относительно долгий, повысить скорость работы можно за счет многопоточности.
А из плюсов это дает нам возможность забить на поиски структур хранящих список вещей, списки оружия или же игроков. Т.е. нам достаточно сгенерировать сигнатуру указывающую на нужный нам класс, чтобы находить адреса всех структур, которые используют выбранный нами класс. Сделать ESP, Radar Hack или просто взломать список вещей в инвентаре не прикладывая усилий, вот что я люблю.

partoftheworlD

partoftheworlD

 

[Grand theft Auto Online v1.43] Stealth Money (20 миллионов в секунду) Update 2

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

partoftheworlD

partoftheworlD

 

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

Продолжаем создавать наш noflash хак. В этой части, мы восстановим классы и напишем код. Открываем Reclass x32 и создаем новый класс.     Далее, переименовываем название класса в SSystemGlobalEnvironment. Сейчас наш класс очень мал. Нарастите класс до смещения 0x90, используя панель модификации.     Переходим на смещение 0x88, жмем по зеленой стрелке, выбираем тип - Указатель.     Переименовываем указатель в p3DEngine. Ниже строчкой, переименовываем класс в I3DEngine. Спускаемся еще на строчку ниже. Создаём виртуальную таблицу, указав тип VTable.     Открываем и видим, что функций всего 9, а нам нужно 143. Смещение 572 / 4 т.к. 32 битный процесс. Если бы был 64 битный, то делили бы на 8. 143 это и есть наша функция SetPostEffectParam()     Наращиваем количество функций, как делали с классом. Переходим на 143 функцию, двойной клик, вписываем саму функцию. И очищаем лишнее в классе. Далее жмем "генерировать" класс.     Получаем готовый код класса, копируем в удобное место.     Открываем Visual Studio, создаем пустой проект, тип проекта "Библиотека DLL". Добавляем исходный файл main.cpp и заголовочный файл classes.h . В main.cpp подключаем  #include <windows.h> #include "classes.h"   Прописываем нашу функцию void no_flash(){ SSystemGlobalEnvironment* pEnv = (SSystemGlobalEnvironment*)(*(DWORD*)(0x18C23DC)); while (true){ if (!pEnv)continue; I3DEngine* p3DEngine = pEnv->p3DEngine; if (!p3DEngine)continue; p3DEngine->SetPostEffectParam("Flashbang_Time", 0, true); } }   В точке входа пишем CreateThread(0, 0, (LPTHREAD_START_ROUTINE)no_flash, 0, 0, 0);   Открываем файл classes.h и вставляем туда сгенерированный код из ReClass. В итоге файл classes.h будет выглядеть вот так     Собираем проект. Внедряем в игру. Готово.    

JustHack

JustHack

 

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

Итак, мы вооружились всеми нужными инструментами и поверхностным пониманием того, что будем делать. Теперь, можно приступать к самому интересному 👀 В этой части, перед нами стоит задача найти SSystemGlobalEnvironment и I3DEngine. Сразу скажу, что буду разжевывать максимально подробно, дабы избежать лишних вопросов (а как сдампить, а как открыть перекрестные ссылки и т.п.). Поэтому, не обижайтесь на меня, профи этого дела, кому это покажется слишком "жидким"😆   Запускаем игру, открываем PeTools и делаем полный дамп   Далее, запускаем IDAPRO и выбираем "новый проект"   Открываем наш дамп игры. Выбираем   IDAPRO, предложит указать расположение 3 библиотек. Выбираем место установки игры и нажимаем ОК.   Дождёмся, пока IDA проанализирует файл. Вы услышите звуковый сигнал, по окончании. Также, можно будет видеть надпись "idle" (в простое).   После окончания анализа, открываем список всех строк. Через меню View или нажав Shift+F12.   Жмем Ctrl+F и вводим " ai_CompatibilityMode "   Двойной клик по строке и оказываемся тут   Выделяем строку и жмем X, в открывшемся окне перекрестных ссылок, нажимаем ОК   Оказываемся тут   dword_18C23DC это и есть адрес нашего SSystemGlobalEnvironment = 0x18C23DC. Можете переименовать сразу (выделив и нажав N), можете оставить так. Кому как удобнее. Самое главное мы нашли. Теперь нам нужно найти  I3DEngine и SetPostEffectParam. Повторяем шаги с поиском SSystemGlobalEnvironment , только теперь вводим "Dof_Active" в строке поиска.     Нашли, выделили, перешли в окно перекрестных ссылок, выбираем первую и жмем ОК.   Попадаем сюда   Выделяем, жмем F5, для перехода к псевдокоду. Видим такую запись.    Выделяем смещение '+136', жмем ПКМ, переводим в HEX.   И получаем SSystemGlobalEnvironment + 0x88 это и есть смещение до I3DEngine
  В итоге имеем: SSystemGlobalEnvironment = 0x18C23DC SSystemGlobalEnvironment + 0x88 = I3DEngine   Продолжение следует...

JustHack

JustHack

 

Создаем мультихак, на примере игры Warface [Введение]

Привет всем, кто это читает, а может даже, пытается повторить)) По просьбам некоторых злодеев с форума, дискорда и ютуба, я буду пытаться написать цикл статей, по созданию мультихака через внутренние классы, на примере игры Варфейс. А может, я не буду вас мучать и ограничимся всего 1-2 публикациями. Всё зависит от вашего интереса и моего свободного времени. Все описанные действия, могут быть реализованы в какой-то степени и в других играх, на движке CryEngine3. Итак, начнем пожалуй с самого простого, а далее будем двигаться к более сложному. Здесь не будет объяснений, что такое дизассемлер, указатели, классы, интерфейсы, смещения и прочее. Если вы не знаете, что это, то вам придется самостоятельно восполнять эти пробелы. Движок CryEngine3, сделан на основе глобальных объектов. Глобальные объекты завёрнуты в одну структуру и являются указателями на абстрактные сущности, которые инициализируются в нужный момент, в нужном месте программы. Никаких дополнительных накладных расходов, никаких лишних надстроек, контроль за типом во время компиляции. CryEngine3 представляет собой достаточно старый проект, где все интерфейсы устаканились, а новое прикручивается подобно тому, что существует на данный момент. Поэтому нет необходимости придумывать дополнительные обёртки или способы работы с глобальными объектами. SSystemGlobalEnvironment - это основной базовый класс, где хранятся указатели на "стартовые классы". Примерное описание и содержание можно посмотреть на GitHub. Т.к. мы решили начать с самого простого, то на этом этапе, мы сделаем хак, который будет убирать эффект ослепления от светошумовых гранат (антислепа / noflash). Для этого, нам понадобится класс - I3DEngine* p3DEngine; Он находится по такому пути SSystemGlobalEnvironment->I3DEngine. И вызвать метод SetPostEffectParam (ознакомиться)     Итак, наша задача найти адрес базового класса SSystemGlobalEnvironment, затем указатель на I3DEngine, восстановить класс и вызывать метод SetPostEffectParam, с нужными нам параметрами. Делов то 😆
Необходимый софт: Официальный SDK движка Visual Studio 2015+ PeTools IdaPro версии 6.6+ ReClass x32 Блокнот, notepad++, sublimetext и т.п.(на выбор) Калькулятор    Продолжение следует...

JustHack

JustHack

 

[JS] Старая творческая студия для youtube

Начал учить JS еще и из-за того, что меня ютуб начал раздражать перекидывая постоянно на новый дизайн творческой студии, даже если переходить на классический и писать матерные слова в окне фидбека. Так, что если я не один такой, то вот скрипт для Tampermonkey и его альтернатив под разные браузеры. Скрип во время загрузки страницы подменяет новый адрес кнопки ведущий на обновленный дизайн, на старый.   // ==UserScript== // @name Old youtube video manager // @version 0.1 // @author partoftheworlD // @include https://www.youtube.com/* // ==/UserScript== (function() { function replace_C() { var vm_button = document.querySelector("a.yt-uix-button.yt-masthead-picker-button.yt-masthead-picker-button-primary.yt-uix-sessionlink.yt-uix-button-default.yt-uix-button-size-default"); if(vm_button && vm_button.href.includes("dashboard") || vm_button.href.includes("studio")) { vm_button.href = "/my_videos?ar=1&o=U"; vm_button.text = "Творческая студия"; } } document.addEventListener('DOMContentLoaded', replace_C()); })();  

partoftheworlD

partoftheworlD

[IDA7] Function String Associate скрипт Update 0.05

Накидал небольшой скрипт, который выполняет тоже самое что и плагин FunctionStringAssociate, просто потому что, для новой версии плагин часто вылетает, нет кроссплатформенности, его нет под x86, для того чтобы был необходимо качать несколько библиотек, какие-то файлы и настраивать VS, никаких альтернатив не нашел, а также скрипт наверняка будет работать после следующих обновлений, даже если вдруг Hex-Rays снова решат обновить API. Сейчас это просто скрипт, в дальнейшем прилеплю меню и доступ из вкладки плагинов и увеличу скорость работы (как разберусь с новомодными модулями, которые нагуглю). Если кто-то будет пользоваться скриптом, то пожалуйста пишите, если возникнут какие-то проблем, а баги сразу на гите оформляйте.   Для чего нужен?     Плагин пригодится для беглого анализа всех функций в виртуальной таблице, при рассматривании скриптовых движков, может помочь найти всякие функции, относящиеся к обработке скриптов скриптовым движком игры, ну и конечно же помогает восстановить виртуальные таблицы из библиотеки игры с подписанными функциями MacOS в библиотеке Windows.   Как пользоваться? Кидаем в иду нужный нам файл, так же кидаем файл с плагином в папку plugins Заходим в пункт Edit/Plugins будет надпись FunctionStringassociate тыкаем на неё. Как только запустится скрипт в окне Output window будет надпись Launching По завершению анализа в том же окне получаем информацию о том сколько было просканировано функций и добавлено комментариев.     Возможно работоспособность может зависеть от степени анализа файла т.е. некая зависимость от количества анализированных функций относительно всех возможных Вроде бы все проверил, но так как скрипт писался всю ночь и день тестировался, то могут быть баги, которые я упустил.   Demo:     https://github.com/partoftheworlD/IDA7py_FunctionStringAssociate/     Обновления    

partoftheworlD

partoftheworlD

 

CE 6.8 Обзор нового инструмента поиска по структурам

1. Открываем trainme Dark Byte. 2. Проходим первый шаг (там нужно сделать One Hit Kill чит через прогресс бар, количество патронов тоже интересно поломать) 3. Так вот на Step2  ищем адрес здоровья нашего космического корабля. Ставим брейкпоинт на доступ, стреляем. Видим, три адреса и вот теперь новые функции в контекстном меню как на скриншоте   На "(1)-(2)" - вызываем контекстное меню выделив адрес своего корабля и добавляем его в группу1. Тоже самое делаем для красных адресов кораблей противников На "(2)" вызываем опцию сканирования и видим "(3)" На (3) выбираем скан по RAX или по другим значениям. Например, когда по RAX не нашли ничего.   Дальше видим окно и галку ставим "Only find matching groups" и сканим. Видим результат    Т.е. по +70 и другим смещениям можно сделать фильтр свой - чужой.  В общем замечательный инструмент для работы со структурами с заданием уровня сканирования по оффестам

MasterGH

MasterGH

[Hotline Miami] Бессмертие за счет отключения коллизии

Даже удивительно почему никто не сделал бессмертие для этой игры, ведь все достаточно просто. Раз у нас нет индикатора здоровья, значит необходимо найти триггер, который бы говорил "вот тебе дали по лицу и ты умер", а значит нам нужны *эффекты смерти и грустная музыка*. Если подумать из всего, от чего мы можем оттолкнуться стремясь к бессмертию, использовать сможет только координаты. Итак, план действий: Находим координаты Находим участок кода отвечающий за коллизию Делаем бессмертие за счет отключения коллизии, фильтруя для чего нам нужна коллизия, а для чего нет или переходим к пункту 4. Делаем бессмертие за счет нахождения триггера, изменяя условный переход, который больше не будет выводить сообщение о смерти и грустную музыку.   Бессмертие за счет отключения коллизии это самый простейший способ, но он для любителей поглазеть в структуры игрока, npc, стен, в поисках их уникальных ID, чтобы написать хороший фильтр. Бессмертие за счет изменения триггера это немного дольше, плюс могут быть проблемы, если игра использует скрипты, то скорее всего после отключения триггера и когда нам дадут по лицу мы получим софтлок и тут уже спасет только перезапуск.   Находим координаты, ставим бряк на доступ, необходимо немного побегать, чтобы отделить инструкции для передвижения от инструкций работающими с расчетом коллизии.     До красной линии это все инструкции которые работают с персонажем при движении, зеленым помечены инструкции, появляющиеся после того как нас ударили. Как только переходим по самой первой инструкции после удара, видим такой интересный код.     В общем здесь и происходит вся магия, загружаются значения, загружается коллизия предметов и npc, так же значения коллизии к пример стен статичны 1.875, немного пореверсив, можем написать скрипт, но чтобы он работал как бессмертие, его необходимо будет дописать с учетом состояния врага или же дистанции от врага, чтобы коллизия отключалась когда враг собирается нас атаковать. Это нужно для того чтобы игра не крашилась при переходе между локациями, т.к. при отключении коллизии игра не будет знать где можно спавнить игрока, а где нет.   А вот и функция расчета коллизии, входные данные для функции это размер коллизии предметов, текущие координаты npc/врага, а так же скорость:   Ну вот и все, небольшая демка и бонус будут чуть ниже, а так же скрины показывающие, что будет если изменять размер коллизий. По времени на взлом ушло около 20 минут, самое сложное было найти координаты. 😁 Если будет интерес, то напишу ещё одну статью в которой будем рассматривать бессмертие с помощью второго способа, а т.е. поиск триггера который бы говорил "вот тебе дали по лицу и ты умер", а значит нам нужны *эффекты смерти и грустная музыка*   Демо 1:     Демо 2:     Размер коллизий:          

partoftheworlD

partoftheworlD

[Radare 2] Статическая "отладка" кода

Всем радар, пацаны. Сегодня расскажу про эмуляцию кода или ESIL, это очень крутая штука позволяющая "отлаживать" код без отладки, но для начала небольшой экскурс.   Вы можете спросить, а какова цель ESIL, да и кому он нужен, когда есть отладчики? Ну, во-первых, не всегда нужный код срабатывает, когда нам это нужно, а ждать минуты, часы, дни, пока он сработает тоже не вариант. Во-вторых, при анализе малвари даже под виртуалкой опасно запускать исследуемую программу т.к. она может нанести вред хосту. В-третьих, иногда нет физического устройства со специфичной архитектурой.   Для того чтобы решить эти проблемы и придумали эмуляцию. Radare2 поддерживает для эмуляции множество архитектур, но не полный список инструкций, для некоторых из них (но это решается со временем), а только основные для облегчения нам с вами жизни, ну и конечно ESIL можно использовать в скриптах. Список поддерживаемых архитектур на 2015 год:   Итак, начнем. Для начала посмотрим на все команды для работы с ESIL.     Нам понадобятся только несколько из них. Для инициализации виртуальной машины используется команда:   Теперь необходимо установить начало, откуда начнем эмулировать код т.е. установить адрес в регистр EIP. Для примера накидал небольшую программку, которая что-то считает.   Выберем 0x1400010c7, как раз до этой инструкции загружается значение из буфера в eax.   Таким же образом загрузим в rax какое-нибудь значение, например 0x1234   И теперь необходимо установить триггер, чтобы эмуляция выполнялась только до этого адреса или условия. Триггер является неким подобием бряка во время отладки. Для триггера по адресу используем   теперь, как только RIP станет равным нашему адресу, то эмуляция остановится.   Для триггера с условием будем использовать другую команду к примеру, нам надо чтобы триггер сработал, когда eax станет больше 0x1234.   Конструкция выражений не самая удобная, но понятная, к примеру инструкция sub rsp, 8; будет выглядеть как "8, rsp, -"  т.е даже не зная опкодов каждый сможет понять, что делает инструкция на любой архитектуре.   Для наглядности посмотрим состояния регистров до эмуляции и после. До:   (Забыл сделать скрин по xmm регистрам, но там были одни нули)   После:   Так же можно эмулировать код пошагово с помощью команд   Ну думаю на этом все, надо будет испробовать такой способ в следующем видео для статического расчета указателей на разные статы игрока, типа здоровья или еще чего от базового адреса.

partoftheworlD

partoftheworlD

 

Новый контент

Если кто помнит был черновой плагин Дизассемблера  к Cheat Engine в статьях блогах   В его минимальные задачи входит Подсветка кода, выделяя его разной яркостью. Например математические, логические, запись/чтения инструкции вы увидите быстрее, если их сделать ярче, а другие инструкции темнее.  Вторая задача отображать пути трейслогов по открытым окнам  трейслогов Третья задача. Связь дизаассемблера с картой ветвления кода. Ветвления связаны с брейкпоинтом на адресе игрового параметра (возможно с адресами в структуре определенного размера). Отображаются трейслоги из окон call-ret связями.    Общая цель плагина находить дизассемблированные условия и ветви кода, которые будут связаны со значениями структуры. В принципе это можно сделать без плагина, в IDA или разными инструментами.   По желанию можно дарить любую денежную сумму в течении любого времени, пока я активен на форуме. Подарок формально ни с чем не связан и обратно не возвращается. 250 руб.:  500 руб.:  1000 руб.:  3000 руб.:    При этом можно надеяться, что плагин выйдет в публичный доступ и потом будет обновляться. Возможно плагин будет неплохим инструментом

MasterGH

MasterGH

 

[Ubisoft The Crew] Как я поборол ошибку #0_35 и смог все же поиграть

Это больше юмористический пост нежели технический, просто забавная история про китайский модем и юбисофт. Не так давно проходила распродажа, по которой я урвал The Crew, в тот же день установил её и думал погонять от души. Но не тут-то было, при входе стал получать ошибку, что сервера Ubisoft не доступны, это обычное дело для Ubisoft, зашел на форум юбиков, смотрю надпись: "Сервера юбисофт для некоторых игроков не доступны". Спустя неделю ситуация не изменилась, погуглив оказалось, что игра не умеет открывать порты и из-за этого может быть ошибка. Отключив роутер и запустив интернет прямиком по кабелю, игра запустилась, дело было в роутере. Что-ж раз так, начал открывать порты, к моему удивлению открылись все порты кроме нужного, т.е. из 65535 портов не открылся только 1 проверял с помощью nmap. Нашел довольно странный способ, но рабочий, открывать 3000 порт с помощью торрент-клиента установив в нем кастомный порт. Для того чтобы избавится или хотя бы уменьшить костыли набросал простой клиент, который бы слушал нужный мне порт на python, как итог все прекрасно работало, но, чтобы избавится от зависимости устанавливать python пришлось переписать на cpp. В итоге перед запуском клиента надо запускать этот костыль, чтобы поиграть, а все из-за лени юбиков. Вот и конец этой замечательной истории, когда ты платишь деньги за игру, так ещё должен фиксить проблемы игры всякими костылями, но причину почему не открывается 3000 порт на роутере так и не нашел, возможно что-то прописано в прошивке.   Не думаю, что кому-то нужен такой исходник, но все же приложу.    

partoftheworlD

partoftheworlD

 

[Sniper Elite 4] Практическая часть: реверс и понимание логики игры.

Ну что, хватит скучной теории, пора что-нибудь поломать. Хочу сказать сразу, к черту поиск значений, это скучно, не интересно, нудно и вообще поиск для слабаков. Первое, что необходимо это изучить игру, данная игра использует скриптовый движок, поэтому это для нас облегчит поиск необходимого участка кода.Раз движок использует скрипты, то есть высокая вероятность того, что некоторые данные будут как простые строки, ищем все строки и фильтруем по строке"Glow".     Можем выбрать любую строку и поставить бряк на доступ в памяти. Я выбрал "Dg_fOuterGlowMin", просто потому что немного ниже, есть строка указывающая тип этой текстовой переменной. И как только срабатывает бряк, у нас появляется такая функция, которая использует нашу строку.     После недолгих экспериментов и метода тыка, узнаем что эта функция проверяет видимость npc, т.е изменив значение возвращаемого значения мы можем использовать бинокль везде и всюду, стоя упершись биноклем в стену. Теперь, зная что делает эта функция изучим по подробней, что тут вообще происходит. Для начала, посмотрим, что, где, как, и почему здесь проверяют. Нас будет интересовать только несколько инструкций.   Выходим из функции и смотрим, что происходить выше по коду, а здесь у нас происходит вычисление id модельки, по id npc и получение её базового адреса, базовый адрес скорее всего является вложенной структурой используемой чисто для подсветки. А массив r15 хранит в себе все предметы, думаю это очевидный вывод, раз используются такие огромные индексы. | mov eax, dword ptr [rsp+rbx*4+0x50] | rsp = 5; rbx = 4; rbx является реальным id ... | lea rcx, qword ptr [rax+rax*2] | rax = 0x4B5; rcx = 0xE1F | add rcx, rcx | rcx = 0xE1F * 2; rcx = 0x1C3E | mov r9, qword ptr [r15+rcx*8+0x20] | получаем базовый адрес предметов; r15 массив с предметами + индекс * 8 + 0x20 Дальше, после получения базового адреса происходит передача его же первым аргументом, а дальше проверка видимости после которой получаем результат. И результат. Сама функция проверяет как я уже написал выше видимость, за счет дистанции между игроком и npс, так же проверяя, а не мешает что-либо игроку видеть npc.     Это только самая основа, радоваться ещё рано, ведь предстоит много работы.  Мы же не гуманитарии какие-нибудь, чтобы руками помечать цели.     Что ж, для одиночной игры этого могло бы и хватить, но для мультиплеера, придется ковырять ещё глубже, чтобы восстановить логику и порядок действий для воспроизведения этого в нашем будущем хаке. Да, да скорее всего для наглядности будем писать чит. Но это уже совсем другая история, ведь уже скачался сериал.
 

Обработка исключения в Cheat Engine AA

Новые директивы try/except в AA доступны Cheat Engine 6.8 Beta2   Задача  try/except в AA обработать исключение, не допустить crash. Чтобы игра продолжалась, а чит в лучшем случае не закрыл бы процесс. В теории возможно определить, что был crash и что-то сделать. Например, отправить логи в свой или иной удаленный сервис аналитики, что такой-то чит не сработал...   Пример от DarkByte для  try/except с счетчиком crashes    

MasterGH

MasterGH

 

Виды внутриигрового wallhack

Данная статья будет выступать теорией перед практикой, для начала, если кто не знает что за "внутриигровой wallhack" это тот который сделал за нас разработчик. Выглядит это примерно так     А теперь о типах подсветки, в зависимости от движка, игра может подсвечивать все что угодно, либо какие-то конкретные предметы прописанные в недрах кода, подсвечивая контур вокруг модельки или же залив полностью. Но как игра это делает? От игры к игре делается это по разному, либо же ведется подсвечивание модельки постоянно, но при определенных обстоятельствах меняет цвет подсветки на зарегистрированный, т.е. игра постоянно всех подсвечивает, но если игрок "A" сделал действие "B", то игра меняет по смещению цвета подсветки значение к примеру на 0xEB и все, игрок "A" будет подсвечен, но если изменить значение по этому же смещение на 0xEC или 0xEA то ничего не произойдет. Это был первый популярный способ подсветки у игр, теперь перейдем ко второму. Этот способ обычно использует  вложенную структуру подсветки в структуре игрока т.е   pPlayer->pGlow->bActivator pPlayer->pGlow->fRed pPlayer->pGlow->fGreen pPlayer->pGlow->fBlue pPlayer->pGlow->fAlpha ... Все происходит достаточно просто, сначала для игрока "A" одна из функций игры активирует подсветку, а другая задает цвет в зависимости от ситуации, иногда они объединены в одну функцию. Привлекателен этот способ тем, что независимо что мы захотим подсвечивать, у всех структур (машин, npc, ящиков, птиц) по одному и тому же смещению будет указатель на подсветку.   А теперь поговорим о вариантах поиска и возможных проблемах.   Первая и основная проблема состоит в том, что большинство разработчиков делают подсветку объекта одноразовой из-за этого будет не реально выйти на это значение обычным поиском. В таком случае, я бы посоветовал найти структуру npc и с помощью поиска найти изменения во время подсветки, если все прошло удачно, то мы уберем все не нужное и зная примерные смещения можно сравнить структуры нескольких npc, чтобы найти единственно нужное смещение. Вторая проблема. Даже если найдем активатор подсветки, то надо хорошо разбираться в асме, просто потому, что в таких тонких делах декомпилятор может лишь запутать. Я бы посоветовал использовать radare2 для отслеживая инструкций т.к. там есть удобный фильтр для вывода только того дизассемблерного листинга, который нам нужен. Третья проблема. В некоторых играх для активации подсветки может использоваться не истинный id игрока, а id предмета на локации после загрузки всех предметов. К примеру, есть у нас структура npc у которого id будет равно 1, но, когда он заходит на локацию id модельки будет 150, т.е. id будет назначен после всех динамических моделек, которые уже загружены на локации типа шторок, столов, ящиков и прочего.   Отличия первого способа от второго в том, что в первом достаточно изменить цвет и все будет работать, во втором же нужно соблюдать определенный порядок, иначе ничего работать не будет, это не во всех играх, но такое практикуют.   Я ещё думаю на какой игре бы показать. но пока выбор останавливается на Sniper Elite 4.
 

Обработка исключения в Cheat Engine Lua

pcall() функция может вызывать функцию, которая может вызывать исключение. Возвращает статус в виде булевой о том, есть ли исключение или нет и возвращает текст исключения.    Источник   Как этим пользоваться? Если вдруг знаем, что может произойти ошибка, то можно её обработать и выполнить правильное действие не останавливая работу Lua скрипта. Или например если  не выполняется условие, то можем сами создать ошибку с помощью функции error, что остановит скрипт.

MasterGH

MasterGH

×

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

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