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

ChestGlaring

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

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

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

    8

Сообщения, опубликованные ChestGlaring

  1. 7 минут назад, JIeXA сказал:

    Почему 

    
    addr = 0x60B65B
    
    ИИИИ  array_size = (Dword(0x60B64A) >> 3) + 4

     

    Потому что такие значение у структуры.

     

    addr - указывает на первый элемент в массиве, у которого имеется имя

    array_size - количество элементов в массиве 0x16C / 8 + 4

  2. Не знаю куда скрипт лучше выложить, в общем вот дампер структур для игр на 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
  3. [[<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

     

     

  4. Если Unity и чит будет писаться на C#, то можно создать свой список сущностей по типу или классу, который использует игра.
    Вместо CActor у тебя будет что-то другое.


    CActor[] EntityList = UnityEngine.Object.FindObjectsOfType<CActor>

     

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

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

     

    Pen7Y1h.png

     

    Массив с нативками выглядит следующим образом:

     

    TaUBHQh.png

     

    Таким образом получаем доступ к нужной нам функции, которая создает предмет около игрока. Функция принимает в себя  указатель на конструктор объекта, указатель на структуру игрока ( так и получаем координаты, где спавнить предмет ), адрес конструктора объекта, количество создаваемых предметов,  тип компилятора и указатель на стек виртуальной машины.

     

    После выполнения рассматриваемого метода, виртуалка компилирует и ставит скомпилированный скрипт на выполнение в очередь.

    Отбросив мелочи, типа получение координат, угла камеры и прочего для создания предмета около игрока, на этом можно заканчивать, единственное, что указатель на специфичный конструктор объекта, вычисляет по 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
  6. После передачи консольной команды в игру, происходит её компиляция.
     

    Сперва происходит проверка синтаксиса, после проверка существования выбранной сущности в массиве со всеми npc/предметами.

    Если все прошло хорошо, переходим к следующему пункту, а именно выбору типа компилятора.

     

    PwXRubb.png

     

    Всего существует 3 типа компиляторов:

     

    • DefaultCompiler  = 0
    • SysWindowCompileAndRun  = 1
    • DialogueCompileAndRun  = 2

     

    Для компиляции скриптов выбирается SysWindowCompileAndRun, консольная команда разбивается на тип команды, ид объекта и количество объектов, а дальше происходит вызов виртуальной машины, в которую передаются baseValue, stateVM, stackID, resultValue, frame.

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

    • Плюс 1
  7. 1 час назад, Sergey99 сказал:

    но не каждая же игра написана на таких общедоступных движках

     

    Но ведь и ты не спрашиваешь про общие принципы нахождения видовой матрицы. Какой вопрос - такой ответ. А в той игре, которая указана в названии темы, 3 видовых матрицы, для игрока, камеры и еще какой-то штуки.

  8. А что мешает взять dnSpy и просто найти, в каком методе используется видовая  матрица? Затем взять CE Mono и перейти по методу найденному в dnSpy.
    Поиск можно начать с Camera, тем более, в зависимости от игры камер может быть несколько и у каждой будет своя матрица.

  9. 34 минуты назад, Antonshka сказал:

    Неужто игра хранит где-либо продублированный файл и при запуске проверяет его схожесть с этим

    Долго проверять целый файл, скорее просто в заголовке файла XXX.play указана контрольная сумма в каком-нибудь CRC-32, одна записывается в память при открытии редактора карты, другая хранится в файле, при попытке считывания или записи в файл, сначала проверяется контрольная сумма, если они не сходятся - файл поврежден.

  10. 12 часов назад, Antonshka сказал:

    а есть просто выделенная память, поделенная на блоки для каждого объекта

    Восстанови структуру блока (если есть), а после выдели памяти больше, после чего сделай подмену указателей на массив объектов. В теории это должно работать, ведь какая разница игре из какого и в какой массивы добавлять объекты, но могут быть проверки, работающие с оригинальным указателем на массив, которые будут разбросаны по разным методам. Что-то похожее я делал для Left 4 Dead 2.

  11. Если коротко, то для вирусов и защиты от них необходимо знать базу.

    Например,  process doppelgänging,  process hollowing,  хуки,  инъекции в процесс, замена PEB и все что с этим связано.
    Некоторые из защитных техник противодействия антивирусам основанных на видах детекта (динамического по поведению и статического по сигнатуре), обфускация системных вызовов, обфускация строк, скрытие данных в сегменте кода, снятие чужих хуков, перехват чужих потоков.
    Некоторые методы митигации, которые будут снижать количество антивирусных детектов при тестах.

    Пожалуй этого достаточно будет для отправной точки.

  12. В 03.11.2020 в 22:48, zxc99 сказал:

    я покажу вам на практике данную проблему

     

    С самого начала ручного поиска выбрана не правильная инструкция. Почему именно  fstp -108? 
    Для ручного поиска лучше использовать инструкции, которые чаще других вызываются в момент, когда игра активна.

    • Плюс 1
  13. Самое большое разочарование, которое может принести игра при попытках спидранить её - отсутствие быстрых сохранений и загрузок. Из-за чего практика и исследование игры превращаются в пытку. Для создания быстрых сохранений нам потребуется IDA и CE. В теории, существует некоторый флаг, который говорит игре в какой момент необходимо сделать сохранение игры, например, при выполнении задания или какого-то триггера местности. И раз игра умеет делать сохранения, то, и мы сможем. Вы можете сказать: “Эй, зачем такие сложности? Есть же телепорт”. К сожалению, телепорт не подходит из-за того, что не умеет сохранять текущее состояние сущностей, которое временами очень важно.


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

     

    Полученная инструкция указывает на код, который выглядит вот так.

     

    bBVFogA.png

     

     

    Дальше, необходимо исследовать функции уходя все глубже в код, но так как игра имеет не особо сложный движок, можно попробовать использовать Proximity View. Это довольно интересная опция, которой можно посмотреть связи между функциями, перекрестными ссылками, а также ссылками на данные. Используя опцию Find Path в Proximity View, говорим IDA построить путь вызовов от функции с проверкой “а существует ли чекпоинт” до переменной, которая отвечает за сохранение.

     

    pmFccAh.png

     

     

    Которая выглядит довольно просто. Установка значению флага 1 и перезапись указателя старых данных и текущих.

     

    LJbFLIS.png

     

     

    • Плюс 1
  14. Всем уже давно известно как делать Glow Esp, но сегодня мы посмотрим на проблемы, которые возникли при написании этого чита, для менее популярных игр, таких как Left 4 Dead 2. В погоне за оптимизацией, отрисовка обводки происходит не постоянно, как например, это было в Sniper Elite 4. В Left 4 Dead 2 существует Glow Manager, который пуст. Да-да, если же в CS:GO структура заполнена указателями на свойства подсветки всех сущностей, то здесь же вообще ничего нет. А значит, простым изменением “выключателя” включающего подсветку тут не обойтись.

     

    lCJPfjo.png

     

    Для начала найдем указатель на Glow Manager, для этого найдем виртуальную таблицу класса CGlowManager и перейдем по второй виртуальной функции, в ней мы увидим глобальную переменную в которую пишется указатель на структуру Glow Manager.

     

    dAxv539.png

     

    Теперь необходимо найти функцию, обновляющую отрисовку обводки, в той же виртуальной таблице, под 5 индексом можно её найти. игнорируя nullbytes в таблице. Адрес потребуется для дальнейшего исследования алгоритма работы функции, чтобы c помощью подмены некоторых значений, заставить работать обводку на нас.

     

    После восстановления функции, можем продолжать. Итак, на этом этапе необходимо понять, что нам потребуется в дальнейшем. 

     

    84UpZGL.png

     

    Начнем по порядку, итак, под 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, вот в этой игре подсветка работает не так просто, и очень интересно, исследовать её было одно удовольствие.

    owg1o0Y.png

     

    • Понравилось 1
    • Плюс 3
  15. 4 часа назад, Siemas сказал:

    Подскажите пожалуйста какие то 3 легкие игры для новичка для тренировки по взлому. 

    Pwn Adventure 3: Pwnie Island идеальная для начинающих, а дальше выбирай те,  в которые больше всего играл и они нравятся, чтобы понимать механики игры, и примерную логику работы опций, которые собираешься искать.

  16. Если тебе нужны структуры для того, чтобы подсвечивать игроков, то вот некоторые наработки.
     

    сигнатура на функцию-активатор подсветки: 
    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


     

    Спойлер

    unknown.png?width=565&height=438

     

    и немного восстановленная функция на которую указывает сигнатура, надеюсь это как-то поможет

    Спойлер

    unknown.png

     

    И смещения на свойства подсветки, хотя похоже они у тебя и так есть

     

    Спойлер

    HoEfVzUnzkQ.jpg

     

    • Плюс 1
  17. Скорее всего дело в списке игроков, соурс движок славиться своим "отзеркаливанием" структур, которые разделены на кешированые и постоянные, в первых хранятся данные об игроках с которыми было какое-то взаимодействие ранее, в постоянных все остальные. 

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

     

    fiddcnZ.png

     

    Дальше, создается структура, которая хранит в себе данные о консольной команде.

    uPxwdUw.png

     

    Красным выделен тип запроса (Добавление) .
    Желтым ID предмета.
    Зеленым количество добавляемых предметов.

     

    После, эта структура передается в виртуальную машину, и становиться в очередь на выполнение.

     

    k4ytzSw.png


    1. Аргумент this указатель на класс SkyrimVM
    2. Аргумент указатель на структуру, что показана выше на фото
    3. Аргумент указатель на класс работающий с памятью.
    4. Аргумент указатель на конструктор выбранного объекта, в котором храниться имя предмета, ссылка на текстуру и различные параметры этого оружия ( в данном случае оружия )

     

    Внутри InventoryEventFilter код разбит на 3 блока, которые передают параметры из указателя на структуру 2-й картинки, для дальнейшей компиляции и выполнения внутри виртуальной машины.
    1. Блок это компиляция кода для удаления предмета
    2. Блок это компиляций кода для добавление предмета
    3. Блок это компиляций кода для изменения предмета

    1uEkPNs.png

     

×
×
  • Создать...

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

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