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

ChestGlaring

Стажёры
  • Публикаций

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

  • Посещение

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

    3

ChestGlaring стал победителем дня 13 октября

ChestGlaring имел наиболее популярный контент!

Репутация

7 Lamer

1 Подписчик

Информация о ChestGlaring

  • Звание
    Пользователь

Посетители профиля

Блок последних пользователей отключён и не показывается другим пользователям.

  1. GHIDRA 9.2 Dev (12.10.2020 Сборка Commit: f7f366b) Windows Linux
  2. Всем уже давно известно как делать 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, вот в этой игре подсветка работает не так просто, и очень интересно, исследовать её было одно удовольствие.
  3. Pwn Adventure 3: Pwnie Island идеальная для начинающих, а дальше выбирай те, в которые больше всего играл и они нравятся, чтобы понимать механики игры, и примерную логику работы опций, которые собираешься искать.
  4. Если тебе нужны структуры для того, чтобы подсвечивать игроков, то вот некоторые наработки. сигнатура на функцию-активатор подсветки: 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 и немного восстановленная функция на которую указывает сигнатура, надеюсь это как-то поможет И смещения на свойства подсветки, хотя похоже они у тебя и так есть
  5. Для скачивания требует войти в гитхаб. Windows Linux Если кому-то нужна будет версия для Mac OS, то напишите в личку, добавлю в следующей сборке.
  6. Скорее всего дело в списке игроков, соурс движок славиться своим "отзеркаливанием" структур, которые разделены на кешированые и постоянные, в первых хранятся данные об игроках с которыми было какое-то взаимодействие ранее, в постоянных все остальные.
  7. Статья мне не понравилась, слишком жидкой и бесполезной вышла, поэтому немного углубимся в найденную функцию, во первых, если количество явно не указано в консольной команде, то всегда будет добавляться 1 единица. Дальше, создается структура, которая хранит в себе данные о консольной команде. Красным выделен тип запроса (Добавление) . Желтым ID предмета. Зеленым количество добавляемых предметов. После, эта структура передается в виртуальную машину, и становиться в очередь на выполнение. 1. Аргумент this указатель на класс SkyrimVM 2. Аргумент указатель на структуру, что показана выше на фото 3. Аргумент указатель на класс работающий с памятью. 4. Аргумент указатель на конструктор выбранного объекта, в котором храниться имя предмета, ссылка на текстуру и различные параметры этого оружия ( в данном случае оружия ) Внутри InventoryEventFilter код разбит на 3 блока, которые передают параметры из указателя на структуру 2-й картинки, для дальнейшей компиляции и выполнения внутри виртуальной машины. 1. Блок это компиляция кода для удаления предмета 2. Блок это компиляций кода для добавление предмета 3. Блок это компиляций кода для изменения предмета
  8. Весь мир контейнер и ты в нем контейнер с контейнером. С этих слов и начинается наше приключение в мире отладки и исследований. В первой части статьи мы рассмотрим, только способ с использованием консольных команд, во второй с использованием указателя на структуру предмета и мира. Использование игровой консоли для спавна, на примере TES Skyrim команда выглядит как player.AddItem <ID> <количество>, во многих играх спавн с помощью консольной команды умеет класть предмет только в инвентарь игрока. На этапе поиска откуда начать взлом существует разветвление. Например, если консольная команда спавнит предмет рядом с игроком, то для начала будет логично использовать координаты игрока, чтобы впустую не тратить время и сразу узнать, кто использует наши координаты. Если спавн происходит в инвентарь, тогда проще будет использовать указатель на инвентарь или какие-нибудь сообщения об успешном выполнении добавления предмета. Для начала проверим, есть ли какое-либо сообщение об успешном добавлении предмета. Будем отталкиваться в анализе дампа от этого сообщения. Идея проста, если мы найдем функцию, которая сообщает об успешном выполнении консольной команды, значит где-то ранее, есть функция спавна. Как только найдем функцию, отображающую сообщение, необходимо будет сохранить список вызовов, которые были ранее, для этого в x64dbg необходимо перейти во вкладку Call Stack. Получаем вот такой список. Далее необходимо исследовать функции сверху вниз, восстанавливая только основные переменные, чтобы не тратить впустую время. Address To From Siz Comment Party 000000A0B28FE9D8 00007FF6E84D8872 00007FF6E84A0ABF 7B0 skyrimse.00007FF6E84A0ABF User 000000A0B28FF188 00007FF6E84D7B8D 00007FF6E84D8872 7B0 skyrimse.00007FF6E84D8872 User 000000A0B28FF938 00007FF6E84D8E2B 00007FF6E84D7B8D 80 skyrimse.00007FF6E84D7B8D User 000000A0B28FF9B8 00007FF6E849739F 00007FF6E84D8E2B A0 skyrimse.00007FF6E84D8E2B User 000000A0B28FFA58 00007FF6E8497692 00007FF6E849739F 60 skyrimse.00007FF6E849739F User 000000A0B28FFAB8 00007FF6E8A8AF07 00007FF6E8497692 50 skyrimse.00007FF6E8497692 User 000000A0B28FFB08 00007FF6E876362D 00007FF6E8A8AF07 40 skyrimse.00007FF6E8A8AF07 User 000000A0B28FFB48 00007FF6E875F4F4 00007FF6E876362D 90 skyrimse.00007FF6E876362D User 000000A0B28FFBD8 00007FF6E875CC05 00007FF6E875F4F4 30 skyrimse.00007FF6E875F4F4 User 000000A0B28FFC08 00007FF6E94FB17A 00007FF6E875CC05 40 skyrimse.00007FF6E875CC05 User 000000A0B28FFC48 00007FF88ED46FD4 00007FF6E94FB17A 30 skyrimse.00007FF6E94FB17A System 000000A0B28FFC78 00007FF88FE5CEC1 00007FF88ED46FD4 80 kernel32.00007FF88ED46FD4 System 000000A0B28FFCF8 0000000000000000 00007FF88FE5CEC1 ntdll.00007FF88FE5CEC1 User В теории, необходимо искать функцию по нескольким параметрам: 1. Скорее всего это вызов виртуальной функции (Слава ООП) 2. В аргументах передается указатель на конструктор предмета, который необходим для выделения памяти под конкретно выбранный тип предмета. Указатель на виртуальную таблицу класса игрока/мира/npc в зависимости где будет создаваться предмет. Передача количества создаваемых предметов, если предмет один, то может вообще ничего не передаваться, а оговариваться уже внутри функции по созданию предмета. Походу исследования, я нашел 3 функции, которые подходят под описание выше. В итоге находим её и восстановив видим это. Дальше, необходимо её как-то проверить и чтобы не заниматься ерундой, по типу написания длл или использования скриптов для вызова функции, просто меняем значения в передаваемых аргументах. Например, так: Функция выглядит довольно просто для вызова извне. Первый аргумент указатель на виртуальную таблицу класса игрока. Вторым аргументом идет конструктор для типа оружия. Четвертым, количество создаваемых предметов. Остальные аргументы при тестировании не на что не влияли. В заключении, поиск функции спавна предметов довольно простой процесс, которого многие почему-то бояться, хотя это не сложнее, чем создания телепорта. Если углубиться в исследование найденной функции, то скорее всего окажется, что существует один единственный метод обвешанный шаблонами, который используется как для спавна предметов в мире, так и в инвентаре игрока. На этом первая часть статьи подходит к концу, дальше будет интересней.
  9. Подними свой сервер на виртуалке или же в гугл vds, отключи определение детекта утилит в настройках сервера, дальше можешь делать все что захочешь.
×
×
  • Создать...

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

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