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

ChestGlaring

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

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

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

    8

Весь контент ChestGlaring

  1. Commit: adbb36b (Commits on Dec 18, 2020) ghidra_9.3_DEV_20201218_win64 ghidra_9.3_DEV_20201218_linux64 ghidra_9.3_DEV_20201218_osx64 Сборки из ветки debugger будут позже
  2. Commit: 5555566 (Commits on Dec 10, 2020) ghidra_9.3_DEV_20201211_win64 ghidra_9.3_DEV_20201211_linux64 ghidra_9.3_DEV_20201211_osx64
  3. Потому что такие значение у структуры. addr - указывает на первый элемент в массиве, у которого имеется имя array_size - количество элементов в массиве 0x16C / 8 + 4
  4. Не знаю куда скрипт лучше выложить, в общем вот дампер структур для игр на Game Maker для IDA На выходе получаем:
  5. Cheat Engine 7.2 под XP https://we.tl/t-qm8TSQewpT SHA-1: 067DF0AD414C2B3A54E12AC899EDCA8E2337F64E Не работает Veh/Speedhack и куча ошибок при запуске, но для инъекции скриптов и поиска значений сойдет
  6. [[<I Wanna Kill the Kamilia 3 v1.50.exe>+00450EB0]+C]+ 0xC9 = 1 "бессмертие" гг i_solid - 0xc9 Игра на GameMaker , поэтому все смещения и структуры подписаны. Вот еще некоторые в структуре игрока.
  7. Сборка 27.11.2020 Commit: 133d6c2 (Commits on Nov 24, 2020) WindowsLinux MacOS
  8. Если Unity и чит будет писаться на C#, то можно создать свой список сущностей по типу или классу, который использует игра. Вместо CActor у тебя будет что-то другое. CActor[] EntityList = UnityEngine.Object.FindObjectsOfType<CActor>
  9. После второй части, углубимся в работу виртуальной машины, а именно нам нужно понять как виртуальная машина понимает какую функцию надо выполнять при определенной команде. Тут все довольно просто, есть некоторый массив с нативными функциями, доступ к которым скрипт получает сравнивая их название. В этом методе помимо команд скриптов вызывающих нативные методы так же есть консольные команды. Массив с нативками выглядит следующим образом: Таким образом получаем доступ к нужной нам функции, которая создает предмет около игрока. Функция принимает в себя указатель на конструктор объекта, указатель на структуру игрока ( так и получаем координаты, где спавнить предмет ), адрес конструктора объекта, количество создаваемых предметов, тип компилятора и указатель на стек виртуальной машины. После выполнения рассматриваемого метода, виртуалка компилирует и ставит скомпилированный скрипт на выполнение в очередь. Отбросив мелочи, типа получение координат, угла камеры и прочего для создания предмета около игрока, на этом можно заканчивать, единственное, что указатель на специфичный конструктор объекта, вычисляет по id, но находится вне метода и передается по стеку. Ну и конечно же видосик. Прототип и сигнатура для тех, кто задумается создавать спавнер:
  10. После передачи консольной команды в игру, происходит её компиляция. Сперва происходит проверка синтаксиса, после проверка существования выбранной сущности в массиве со всеми npc/предметами. Если все прошло хорошо, переходим к следующему пункту, а именно выбору типа компилятора. Всего существует 3 типа компиляторов: DefaultCompiler = 0 SysWindowCompileAndRun = 1 DialogueCompileAndRun = 2 Для компиляции скриптов выбирается SysWindowCompileAndRun, консольная команда разбивается на тип команды, ид объекта и количество объектов, а дальше происходит вызов виртуальной машины, в которую передаются baseValue, stateVM, stackID, resultValue, frame. На этом этапе уже возможно спавнить предметы, но будет слишком сложно найти все( и самое главное правильные ) переменные для спавна через виртуальную машину. А значит спустимся на уровень ниже, и найдем нативную функцию.
  11. Но ведь и ты не спрашиваешь про общие принципы нахождения видовой матрицы. Какой вопрос - такой ответ. А в той игре, которая указана в названии темы, 3 видовых матрицы, для игрока, камеры и еще какой-то штуки.
  12. А что мешает взять dnSpy и просто найти, в каком методе используется видовая матрица? Затем взять CE Mono и перейти по методу найденному в dnSpy. Поиск можно начать с Camera, тем более, в зависимости от игры камер может быть несколько и у каждой будет своя матрица.
  13. Долго проверять целый файл, скорее просто в заголовке файла XXX.play указана контрольная сумма в каком-нибудь CRC-32, одна записывается в память при открытии редактора карты, другая хранится в файле, при попытке считывания или записи в файл, сначала проверяется контрольная сумма, если они не сходятся - файл поврежден.
  14. Восстанови структуру блока (если есть), а после выдели памяти больше, после чего сделай подмену указателей на массив объектов. В теории это должно работать, ведь какая разница игре из какого и в какой массивы добавлять объекты, но могут быть проверки, работающие с оригинальным указателем на массив, которые будут разбросаны по разным методам. Что-то похожее я делал для Left 4 Dead 2.
  15. Если коротко, то для вирусов и защиты от них необходимо знать базу. Например, process doppelgänging, process hollowing, хуки, инъекции в процесс, замена PEB и все что с этим связано. Некоторые из защитных техник противодействия антивирусам основанных на видах детекта (динамического по поведению и статического по сигнатуре), обфускация системных вызовов, обфускация строк, скрытие данных в сегменте кода, снятие чужих хуков, перехват чужих потоков. Некоторые методы митигации, которые будут снижать количество антивирусных детектов при тестах. Пожалуй этого достаточно будет для отправной точки.
  16. С самого начала ручного поиска выбрана не правильная инструкция. Почему именно fstp -108? Для ручного поиска лучше использовать инструкции, которые чаще других вызываются в момент, когда игра активна.
  17. Самое большое разочарование, которое может принести игра при попытках спидранить её - отсутствие быстрых сохранений и загрузок. Из-за чего практика и исследование игры превращаются в пытку. Для создания быстрых сохранений нам потребуется IDA и CE. В теории, существует некоторый флаг, который говорит игре в какой момент необходимо сделать сохранение игры, например, при выполнении задания или какого-то триггера местности. И раз игра умеет делать сохранения, то, и мы сможем. Вы можете сказать: “Эй, зачем такие сложности? Есть же телепорт”. К сожалению, телепорт не подходит из-за того, что не умеет сохранять текущее состояние сущностей, которое временами очень важно. Для начала найдем флаг, который говорит, что сохранение вообще существует. После чекпоинта ищем 1, перезагружаем локацию 0, 0100010001000101010000010100010001000010010001010100010101000110 пока не найдем единственный адрес. Вешаем на адрес бряк на запись, триггерим чекпоинт и начинаем исследовать код. Полученная инструкция указывает на код, который выглядит вот так. Дальше, необходимо исследовать функции уходя все глубже в код, но так как игра имеет не особо сложный движок, можно попробовать использовать Proximity View. Это довольно интересная опция, которой можно посмотреть связи между функциями, перекрестными ссылками, а также ссылками на данные. Используя опцию Find Path в Proximity View, говорим IDA построить путь вызовов от функции с проверкой “а существует ли чекпоинт” до переменной, которая отвечает за сохранение. Которая выглядит довольно просто. Установка значению флага 1 и перезапись указателя старых данных и текущих.
  18. Всем уже давно известно как делать Glow Esp, но сегодня мы посмотрим на проблемы, которые возникли при написании этого чита, для менее популярных игр, таких как Left 4 Dead 2. В погоне за оптимизацией, отрисовка обводки происходит не постоянно, как например, это было в Sniper Elite 4. В Left 4 Dead 2 существует Glow Manager, который пуст. Да-да, если же в CS:GO структура заполнена указателями на свойства подсветки всех сущностей, то здесь же вообще ничего нет. А значит, простым изменением “выключателя” включающего подсветку тут не обойтись. Для начала найдем указатель на Glow Manager, для этого найдем виртуальную таблицу класса CGlowManager и перейдем по второй виртуальной функции, в ней мы увидим глобальную переменную в которую пишется указатель на структуру Glow Manager. Теперь необходимо найти функцию, обновляющую отрисовку обводки, в той же виртуальной таблице, под 5 индексом можно её найти. игнорируя nullbytes в таблице. Адрес потребуется для дальнейшего исследования алгоритма работы функции, чтобы c помощью подмены некоторых значений, заставить работать обводку на нас. После восстановления функции, можем продолжать. Итак, на этом этапе необходимо понять, что нам потребуется в дальнейшем. Начнем по порядку, итак, под 1 пунктом мы видим, что свойства обводки берутся из массива с сущностями. Далее, 2-й пункт, на котором держится вся работа функции, необходимо точно указывать количество подсвечиваемых сущностей, а как мы видели из первого пункта, что индекс указывает на структуру сущности, из-за чего если укажем значение меньше, чем находится указателей в pEntityArray, то часть из них обводится не будет, если больше, получим исключение Access Violation и вылет из игры. Как собрать смещения из функций уже не будем обсуждать, раз статья в разделе для взрослых. Имея все необходимое, можно подумать как код будет работать. { // Для начала выделим память в размере 128 байт, этого будет достаточно, движок все равно не сможет рисовать больше 32 сущностей. auto argh = VirtualAllocEx(this->m_hProcess, 0, 128, MEM_RESERVE | MEM_COMMIT, PAGE_READWRITE); auto item = 0; this->m_writeMemory<DWORD, int>(this->m_hProcess, GlowManager + 0x18, item); // Далее, запишем адрес выделенной памяти в структуру CGlowManager по смещению 0xC. this->m_writeMemory<DWORD, DWORD>(this->m_hProcess, GlowManager + 0xC, reinterpret_cast<DWORD>(argh)); for (auto i = 0; i <= 4096; i++) { auto entity = this->m_readMemory<DWORD, DWORD>(this->m_hProcess, EntityList + this->m_getHiddenStruct(i) * 8); auto pClassID = this->m_readMemory<DWORD, DWORD>(this->m_hProcess, entity, {0x8, 0x4, 0x1, 0x14}); if (entity) { // Отфильтруем сущности по классу Infected if (pClassID == Infected) { // Теперь необходимо получить смещение на свойства обводки auto t = entity + 0x278; // Заполняем структуру свойств, цветом, состоянием и включаем все this->m_writeMemory<DWORD, int>(this->m_hProcess, entity + 0x278 + 0x4, state); this->m_writeMemory<DWORD, int>(this->m_hProcess, entity + 0x278 + 0x10, activator); this->m_writeMemory<DWORD, float>(this->m_hProcess, entity + 0x278 + 0x18, color[0]); this->m_writeMemory<DWORD, float>(this->m_hProcess, entity + 0x278 + 0x18 + 0x4, color[1]); this->m_writeMemory<DWORD, float>(this->m_hProcess, entity + 0x278 + 0x18 + 0x8, color[2]); this->m_writeMemory<DWORD, int>(this->m_hProcess, entity + 0x278 + 0x28, activator); //Поместим адрес свойств в argh и прибавим к количеству предметов в структуре 1 WriteProcessMemory(this->m_hProcess, static_cast<DWORD*>(argh) + item, &t, sizeof t, 0); item++; } } } } //И после того, как все циклы закончили свою работу, запишем количество сущностей в CGlowManager this->m_writeMemory<DWORD, int>(this->m_hProcess, GlowManager + 0x18, item); Запускаем, и хоба как два байта обнулить. Таким образом можно подсвечивать абсолютно любые предметы на локации. Возможно, после статьи по спавну предметов в TES Skyrim доберемся до Sniper Elite 4, вот в этой игре подсветка работает не так просто, и очень интересно, исследовать её было одно удовольствие.
  19. Pwn Adventure 3: Pwnie Island идеальная для начинающих, а дальше выбирай те, в которые больше всего играл и они нравятся, чтобы понимать механики игры, и примерную логику работы опций, которые собираешься искать.
  20. Если тебе нужны структуры для того, чтобы подсвечивать игроков, то вот некоторые наработки. сигнатура на функцию-активатор подсветки: E8 ?? ?? ?? ?? 8B 45 F8 8B 55 F4 40 89 45 F8 3B 42 18 0F 8C ?? ?? ?? ?? 5F 5E 8B E5 5D 8B E3 5B C3 и сигнатура на функцию, которая перебирает списки npc для дальнейшей подсветки: 53 8B DC 83 EC 08 83 E4 F0 83 C4 04 55 8B 6B 04 89 6C 24 04 8B EC 83 EC 28 56 8B F1 83 7E 18 00 57 89 75 F4 0F 84 ?? ?? ?? ?? 6A FF E8 ?? ?? ?? ?? 83 C4 04 89 45 FC 85 C0 0F 84 ?? ?? ?? ?? 83 7E 18 00 C7 45 ?? ?? ?? ?? ?? 0F 8E ?? ?? ?? ?? EB 02 и немного восстановленная функция на которую указывает сигнатура, надеюсь это как-то поможет И смещения на свойства подсветки, хотя похоже они у тебя и так есть
  21. Для скачивания требует войти в гитхаб. Сборка 31.10.2020 Commit: 027ba38 WindowsLinux Если кому-то нужна будет версия для Mac OS, то напишите в личку, добавлю в следующей сборке.
  22. Скорее всего дело в списке игроков, соурс движок славиться своим "отзеркаливанием" структур, которые разделены на кешированые и постоянные, в первых хранятся данные об игроках с которыми было какое-то взаимодействие ранее, в постоянных все остальные.
  23. Статья мне не понравилась, слишком жидкой и бесполезной вышла, поэтому немного углубимся в найденную функцию, во первых, если количество явно не указано в консольной команде, то всегда будет добавляться 1 единица. Дальше, создается структура, которая хранит в себе данные о консольной команде. Красным выделен тип запроса (Добавление) . Желтым ID предмета. Зеленым количество добавляемых предметов. После, эта структура передается в виртуальную машину, и становиться в очередь на выполнение. 1. Аргумент this указатель на класс SkyrimVM 2. Аргумент указатель на структуру, что показана выше на фото 3. Аргумент указатель на класс работающий с памятью. 4. Аргумент указатель на конструктор выбранного объекта, в котором храниться имя предмета, ссылка на текстуру и различные параметры этого оружия ( в данном случае оружия ) Внутри InventoryEventFilter код разбит на 3 блока, которые передают параметры из указателя на структуру 2-й картинки, для дальнейшей компиляции и выполнения внутри виртуальной машины. 1. Блок это компиляция кода для удаления предмета 2. Блок это компиляций кода для добавление предмета 3. Блок это компиляций кода для изменения предмета
×
×
  • Создать...

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

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