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

Поиск функции спавна предметов (Часть 1: Консольные команды)


Рекомендуемые сообщения

    Весь мир контейнер и ты в нем контейнер с контейнером. С этих слов и начинается наше приключение в мире отладки и исследований.
    

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

    Использование игровой консоли для спавна, на примере TES Skyrim команда выглядит как player.AddItem <ID> <количество>, во многих играх спавн с помощью консольной команды умеет класть предмет только в инвентарь игрока.
    

    На этапе поиска откуда начать взлом существует разветвление.

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

Если спавн происходит в инвентарь, тогда проще будет использовать указатель на инвентарь или какие-нибудь сообщения об успешном выполнении добавления предмета. 
    Для начала проверим, есть ли какое-либо сообщение об успешном добавлении предмета. 

 

                        dP4Bqmp.png

    

  Будем отталкиваться в анализе дампа от этого сообщения.

Идея проста, если мы найдем функцию, которая сообщает об успешном выполнении консольной команды, значит где-то ранее, есть функция спавна. 
Как только найдем функцию, отображающую сообщение, необходимо будет сохранить список вызовов, которые были ранее, для этого в 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 функции, которые подходят под описание выше. В итоге находим её и восстановив видим это.

 

hMqa70a.png

    

  Дальше, необходимо её как-то проверить и чтобы не заниматься ерундой, по типу написания длл или использования скриптов для вызова функции, просто меняем значения в передаваемых аргументах. Например, так: 

 

 

    

  Функция выглядит довольно просто для вызова извне. Первый аргумент указатель на виртуальную таблицу класса игрока. Вторым аргументом идет конструктор для типа оружия.

Четвертым, количество создаваемых предметов. Остальные аргументы при тестировании не на что не влияли. 


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

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

  • Плюс 1
Ссылка на комментарий
Поделиться на другие сайты

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

 

fiddcnZ.png

 

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

uPxwdUw.png

 

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

 

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

 

k4ytzSw.png


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

 

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

1uEkPNs.png

 

Изменено пользователем ChestGlaring
Большой Enter
Ссылка на комментарий
Поделиться на другие сайты

В 30.09.2020 в 17:46, ChestGlaring сказал:

Первый аргумент указатель на виртуальную таблицу класса игрока

Небольшая поправка - это указатель на экземпляр класса игрока (this). И он же совпадает с адресом начала таблицы виртуальных методов, так как vtable идет с начала класса. Суть одна и та же, но чтобы не вызывать путаницу, все же надо указывать, что у методов класса всегда первым скрытым параметром идет указатель на экземпляр класса.

 

UPD: Впрочем, ты про это в свежем посте сказал, я не сразу увидел ) 

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

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

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

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