ChestGlaring
-
Постов
30 -
Зарегистрирован
-
Победитель дней
8
Тип контента
Профили
Форумы
Загрузки
Блоги
Сообщения, опубликованные ChestGlaring
-
-
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- 1
-
-
7 минут назад, JIeXA сказал:
Почему
addr = 0x60B65B ИИИИ array_size = (Dword(0x60B64A) >> 3) + 4
Потому что такие значение у структуры.
addr - указывает на первый элемент в массиве, у которого имеется имя
array_size - количество элементов в массиве 0x16C / 8 + 4
-
Не знаю куда скрипт лучше выложить, в общем вот дампер структур для игр на Game Maker для IDA
Спойлерimport idaapi def String(addr, size): return idaapi.get_bytes(addr, size, 0) def dump(addr): offset = hex(Dword(addr)).upper().replace("X","x")[:-1] length = Byte(addr+4) name = String(addr+5, length) print name, offset return length def main(): length = 4 addr = 0x60B65B array_size = (Dword(0x60B64A) >> 3) + 4 for _ in range(array_size): addr += (dump(addr) + 0xc) main()
На выходе получаем:
Спойлерi_id 0x4 i_spriteindex 0x8 i_imageindex 0x10 i_imagespeed 0x18 i_imagescalex 0x20 i_imagescaley 0x28 i_imageangle 0x30 i_imagealpha 0x38 i_imageblend 0x40 i_maskindex 0x44 i_depth 0x48 i_x 0x50 i_y 0x58 i_xstart 0x60 i_ystart 0x68 i_xprevious 0x70 i_yprevious 0x78 i_direction 0x80 i_speed 0x88 i_friction 0x90 i_gravitydir 0x98 i_gravity 0xA0 i_hspeed 0xA8 i_vspeed 0xB0 i_bbox 0xB8 i_visible 0xC8 i_solid 0xC9 i_persistent 0xCA i_objectindex 0xCC i_object 0xD0 i_timer 0xD4 i_vars 0x104 i_marked 0x108 i_deactivated 0x109 i_pathindex 0x10C i_pathposition 0x110 i_pathpositionprevious 0x118 i_pathspeed 0x120 i_pathscale 0x128 i_pathorientation 0x130 i_pathend 0x138 i_pathxstart 0x140 i_pathystart 0x148 i_timelineindex 0x150 i_timelineposition 0x158 i_timelinespeed 0x160 i_timelinerunning 0x168 i_timelineloop 0x169 i_initcode 0x16C
- 1
-
Cheat Engine 7.2 под XP https://we.tl/t-qm8TSQewpT
SHA-1: 067DF0AD414C2B3A54E12AC899EDCA8E2337F64E
Не работает Veh/Speedhack и куча ошибок при запуске, но для инъекции скриптов и поиска значений сойдет
-
[[<I Wanna Kill the Kamilia 3 v1.50.exe>+00450EB0]+C]+ 0xC9 = 1 "бессмертие" гг
i_solid - 0xc9
Игра на GameMaker , поэтому все смещения и структуры подписаны. Вот еще некоторые в структуре игрока.
Спойлерi_bbox - 0x14 i_depth - 0x48 i_direction - 0x80 i_friction - 0x90 i_gravity - 0xa0 i_gravitydir - 0x98 i_hspeed - 0xa8 i_imagealpha - 0x38 i_imageangle - 0x30 i_imageblend - 0x40 i_imageindex - 0x10 i_imagescalex - 0x20 i_imagescaley - 0x28 i_imagespeed - 0x18 i_initcode - 0x6c i_mask - 0x24 i_maskindex - 0x44 i_object - 0xd0 i_objectindex - 0xcc i_pathend - 0x38 i_pathorientation - 0x30 i_pathposition - 0x10 i_pathscale - 0x28 i_pathspeed - 0x20 i_pathxstart - 0x40 i_pathystart - 0x48 i_persistent - 0xca i_solid - 0xc9 i_speed - 0x88 i_tex - 0x2c i_timelineindex - 0x50 i_timelineloop - 0x69 i_timelineposition - 0x58 i_timelinerunning - 0x68 i_timelinespeed - 0x60 i_timer - 0xd4 i_visible - 0xc8 i_vspeed - 0xb0 i_xprevious - 0x70 i_xstart - 0x60 i_yprevious - 0x78 i_ystart - 0x68
-
-
Если Unity и чит будет писаться на C#, то можно создать свой список сущностей по типу или классу, который использует игра.
Вместо CActor у тебя будет что-то другое.
CActor[] EntityList = UnityEngine.Object.FindObjectsOfType<CActor> -
После второй части, углубимся в работу виртуальной машины, а именно нам нужно понять как виртуальная машина понимает какую функцию надо выполнять при определенной команде.
Тут все довольно просто, есть некоторый массив с нативными функциями, доступ к которым скрипт получает сравнивая их название. В этом методе помимо команд скриптов вызывающих нативные методы так же есть консольные команды.
Массив с нативками выглядит следующим образом:
Таким образом получаем доступ к нужной нам функции, которая создает предмет около игрока. Функция принимает в себя указатель на конструктор объекта, указатель на структуру игрока ( так и получаем координаты, где спавнить предмет ), адрес конструктора объекта, количество создаваемых предметов, тип компилятора и указатель на стек виртуальной машины.
После выполнения рассматриваемого метода, виртуалка компилирует и ставит скомпилированный скрипт на выполнение в очередь.
Отбросив мелочи, типа получение координат, угла камеры и прочего для создания предмета около игрока, на этом можно заканчивать, единственное, что указатель на специфичный конструктор объекта, вычисляет по id, но находится вне метода и передается по стеку. Ну и конечно же видосик.
Прототип и сигнатура для тех, кто задумается создавать спавнер:
Спойлер_DWORD *__fastcall SpawnEntity(_DWORD *pTESNPC, __int64 pPlayerCharacter, _BYTE *TESNPC_Constructor, int Amount, signed int unk_0, int stackframe, char CompilerType, char unk_1) E8 ? ? ? ? 4C 89 B4 24 ? ? ? ? 48 8D 94 24 ? ? ? ? 48 8B C8 E8 ? ? ? ? 90 48 8B 9C 24 ? ? ? ? 48 85 DB 0F 84 ? ? ? ? F3 0F 10 43 ? F3 0F 11 44 24
- 1
- 2
-
После передачи консольной команды в игру, происходит её компиляция.
Сперва происходит проверка синтаксиса, после проверка существования выбранной сущности в массиве со всеми npc/предметами.
Если все прошло хорошо, переходим к следующему пункту, а именно выбору типа компилятора.
Всего существует 3 типа компиляторов:
- DefaultCompiler = 0
- SysWindowCompileAndRun = 1
- DialogueCompileAndRun = 2
Для компиляции скриптов выбирается SysWindowCompileAndRun, консольная команда разбивается на тип команды, ид объекта и количество объектов, а дальше происходит вызов виртуальной машины, в которую передаются baseValue, stateVM, stackID, resultValue, frame.
На этом этапе уже возможно спавнить предметы, но будет слишком сложно найти все( и самое главное правильные ) переменные для спавна через виртуальную машину. А значит спустимся на уровень ниже, и найдем нативную функцию.- 1
-
1 час назад, Sergey99 сказал:
но не каждая же игра написана на таких общедоступных движках
Но ведь и ты не спрашиваешь про общие принципы нахождения видовой матрицы. Какой вопрос - такой ответ. А в той игре, которая указана в названии темы, 3 видовых матрицы, для игрока, камеры и еще какой-то штуки.
-
А что мешает взять dnSpy и просто найти, в каком методе используется видовая матрица? Затем взять CE Mono и перейти по методу найденному в dnSpy.
Поиск можно начать с Camera, тем более, в зависимости от игры камер может быть несколько и у каждой будет своя матрица. -
34 минуты назад, Antonshka сказал:
Неужто игра хранит где-либо продублированный файл и при запуске проверяет его схожесть с этим
Долго проверять целый файл, скорее просто в заголовке файла XXX.play указана контрольная сумма в каком-нибудь CRC-32, одна записывается в память при открытии редактора карты, другая хранится в файле, при попытке считывания или записи в файл, сначала проверяется контрольная сумма, если они не сходятся - файл поврежден.
-
12 часов назад, Antonshka сказал:
а есть просто выделенная память, поделенная на блоки для каждого объекта
Восстанови структуру блока (если есть), а после выдели памяти больше, после чего сделай подмену указателей на массив объектов. В теории это должно работать, ведь какая разница игре из какого и в какой массивы добавлять объекты, но могут быть проверки, работающие с оригинальным указателем на массив, которые будут разбросаны по разным методам. Что-то похожее я делал для Left 4 Dead 2.
-
Если коротко, то для вирусов и защиты от них необходимо знать базу.
Например, process doppelgänging, process hollowing, хуки, инъекции в процесс, замена PEB и все что с этим связано.
Некоторые из защитных техник противодействия антивирусам основанных на видах детекта (динамического по поведению и статического по сигнатуре), обфускация системных вызовов, обфускация строк, скрытие данных в сегменте кода, снятие чужих хуков, перехват чужих потоков.
Некоторые методы митигации, которые будут снижать количество антивирусных детектов при тестах.
Пожалуй этого достаточно будет для отправной точки. -
-
В 03.11.2020 в 22:48, zxc99 сказал:
я покажу вам на практике данную проблему
С самого начала ручного поиска выбрана не правильная инструкция. Почему именно fstp -108?
Для ручного поиска лучше использовать инструкции, которые чаще других вызываются в момент, когда игра активна.- 1
-
Самое большое разочарование, которое может принести игра при попытках спидранить её - отсутствие быстрых сохранений и загрузок. Из-за чего практика и исследование игры превращаются в пытку. Для создания быстрых сохранений нам потребуется IDA и CE. В теории, существует некоторый флаг, который говорит игре в какой момент необходимо сделать сохранение игры, например, при выполнении задания или какого-то триггера местности. И раз игра умеет делать сохранения, то, и мы сможем. Вы можете сказать: “Эй, зачем такие сложности? Есть же телепорт”. К сожалению, телепорт не подходит из-за того, что не умеет сохранять текущее состояние сущностей, которое временами очень важно.
Для начала найдем флаг, который говорит, что сохранение вообще существует.
После чекпоинта ищем 1, перезагружаем локацию 0, 0100010001000101010000010100010001000010010001010100010101000110 пока не найдем единственный адрес. Вешаем на адрес бряк на запись, триггерим чекпоинт и начинаем исследовать код.Полученная инструкция указывает на код, который выглядит вот так.
Дальше, необходимо исследовать функции уходя все глубже в код, но так как игра имеет не особо сложный движок, можно попробовать использовать Proximity View. Это довольно интересная опция, которой можно посмотреть связи между функциями, перекрестными ссылками, а также ссылками на данные. Используя опцию Find Path в Proximity View, говорим IDA построить путь вызовов от функции с проверкой “а существует ли чекпоинт” до переменной, которая отвечает за сохранение.
Которая выглядит довольно просто. Установка значению флага 1 и перезапись указателя старых данных и текущих.
- 1
-
Всем уже давно известно как делать 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, вот в этой игре подсветка работает не так просто, и очень интересно, исследовать её было одно удовольствие.
- 1
- 3
-
4 часа назад, Siemas сказал:
Подскажите пожалуйста какие то 3 легкие игры для новичка для тренировки по взлому.
Pwn Adventure 3: Pwnie Island идеальная для начинающих, а дальше выбирай те, в которые больше всего играл и они нравятся, чтобы понимать механики игры, и примерную логику работы опций, которые собираешься искать.
-
Если тебе нужны структуры для того, чтобы подсвечивать игроков, то вот некоторые наработки.
сигнатура на функцию-активатор подсветки: 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
Спойлери немного восстановленная функция на которую указывает сигнатура, надеюсь это как-то поможет
СпойлерИ смещения на свойства подсветки, хотя похоже они у тебя и так есть
Спойлер- 1
-
-
Скорее всего дело в списке игроков, соурс движок славиться своим "отзеркаливанием" структур, которые разделены на кешированые и постоянные, в первых хранятся данные об игроках с которыми было какое-то взаимодействие ранее, в постоянных все остальные.
-
Статья мне не понравилась, слишком жидкой и бесполезной вышла, поэтому немного углубимся в найденную функцию, во первых, если количество явно не указано в консольной команде, то всегда будет добавляться 1 единица.
Дальше, создается структура, которая хранит в себе данные о консольной команде.
Красным выделен тип запроса (Добавление) .
Желтым ID предмета.
Зеленым количество добавляемых предметов.После, эта структура передается в виртуальную машину, и становиться в очередь на выполнение.
1. Аргумент this указатель на класс SkyrimVM
2. Аргумент указатель на структуру, что показана выше на фото
3. Аргумент указатель на класс работающий с памятью.
4. Аргумент указатель на конструктор выбранного объекта, в котором храниться имя предмета, ссылка на текстуру и различные параметры этого оружия ( в данном случае оружия )Внутри InventoryEventFilter код разбит на 3 блока, которые передают параметры из указателя на структуру 2-й картинки, для дальнейшей компиляции и выполнения внутри виртуальной машины.
1. Блок это компиляция кода для удаления предмета
2. Блок это компиляций кода для добавление предмета
3. Блок это компиляций кода для изменения предмета
GHIDRA 9.2 Dev ( 31.10.2020 Сборка Commit: 027ba38)
in Вопросы по утилитам
Опубликовано
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 будут позже