Автор Тема: Структура Полицейского вертолёта  (Прочитано 1709 раз)

Оффлайн Tommi4kaVar4etti

  • Прохожий
  • *
  • Сообщений: 55
  • Репутация: +0/-0
    • Просмотр профиля
По сути, Вертолёт - та же машина, но только со своими особенностями, 0x813D10 4b, значение - это пойнтер вертолёта, но он всего лишь добавляет огни, прожектор и возможность сбить этот вертолёт из оружия. Если поставить значение на 0, то сам вертолёт никуда не исчезнет, а будет так же преследовать игрока, даже без уровня розыска. Так же он станет неуязвим. Но, если сесть в вертолёт и к Player's car pointer'у прибавить смещение 0x2C0 и сменить значение на 3, то вертолёт моментально взорвётся. Это значит, что остальные характеристики вертолёта можно найти и возможно, частично перенести на любой другой транспорт. Например, статус атаки или статус преследования, Либо натравить вертолёт на пешехода/автомобиль, подменив player pointer на другой указатель. Но увы, смещения к Player's Car Pointer'у всего этого я не знаю.

Оффлайн Tommi4kaVar4etti

  • Прохожий
  • *
  • Сообщений: 55
  • Репутация: +0/-0
    • Просмотр профиля
Поискал немного сам, но был сильно огорчён, т.к не нашёл в структуре вертолёта пойнтера преследуемой цели, которую атакует вертолёт. Но нашёл кое что другое:

CHeli+2D4 f - Поворот вертолёта по оси X
CHeli+2DC f - Положение света от прожектора, относительно вертолёта.
CHeli+2E4 f f(?) - Не знаю какой тип, при float он выпускает 2-3 верёвки, а при 1-4 bytes только одну.
CHeli+328 f - Поворот винта вертолёта

Оффлайн DK

  • Новичек
  • **
  • Сообщений: 222
  • Репутация: +313/-0
    • dk22pac
    • Просмотр профиля
Разбор структуры/класса лучше всего начать с исследования конструктора (если он есть), т.к. именно в нём происходит первая инициализация полей структуры/класса.
Напомню, конструктор имеет вид ClassName::ClassName([параметры]). Для CHeli это функция @5AF7F0.

В новых версиях hex-rays есть удобная фишка - создание структуры "на лету". Кликаем ПКМ на переменной, которая хранит указатель на обьект класса и выбираем "Create new structure".

Тут надо поменять стандартное название (struct_v%) на нужное (CHeli).

Дальше надо разбирать назначение полей. CHeli унаследован от CVehicle, следовательно - структура CHeli начинается со структуры CVehicle. Поле dword0 можно привести к типу CVehicle (ПКМ на поле - Convert to struct, или нажать Y на выбранном поле). Ну и можно переименовать поле (Rename или кл. N).

Кстати, числа 1287568416, 1065343150 и похожие - это float, представленный как int. Hex-rays пока что не идеален в этом аспекте.
Конструктор дал общее представление о структуре CHeli.

Что дальше - нужно исследовать методы CHeli (напр. PreRender, Render, ProcessControl) или функции, где может использоваться этот класс (напр. обработчики скриптовых команд (опкодов)).
Например, в методе SetModelIndex заполняется массив указателей на компоненты транспорта (структуры RwFrame).

Т.е. поле 2A0 - начало массива, а всего в нём элементов - 8.

PS редактировать структуры можно как в окне hex-rays, так и во вкладке Structures.

Я обычно совмещаю эти два варианта.
Plugin-SDK https://github.com/DK22Pac/plugin-sdk

Discord-сервер по plugin-sdk и программированию в GTA
RU https://discord.gg/QEesDGb
ENG https://discord.gg/zaVqFQv

Оффлайн Tommi4kaVar4etti

  • Прохожий
  • *
  • Сообщений: 55
  • Репутация: +0/-0
    • Просмотр профиля
Мм, я смотрю, структура поезда осталась от gta3, было бы классно пустить поезд по вайсу.

Оффлайн kenking

  • Новичек
  • **
  • Сообщений: 144
  • Репутация: +5/-0
    • Просмотр профиля
Re: Структура Полицейского вертолёта
« Ответ #4 : Октябрь 25, 2016, 02:45:02 pm »
В новых версиях hex-rays есть удобная фишка - создание структуры "на лету". Кликаем ПКМ на переменной, которая хранит указатель на обьект класса и выбираем "Create new structure".
У меня нет такой позиции "Create new structure". Версия IDA Version 6.8.150423 (32-bit)


Оффлайн DK

  • Новичек
  • **
  • Сообщений: 222
  • Репутация: +313/-0
    • dk22pac
    • Просмотр профиля
Re: Структура Полицейского вертолёта
« Ответ #5 : Октябрь 25, 2016, 07:39:47 pm »
Чтобы появилось, сначала выбери "Reset pointer type".
Plugin-SDK https://github.com/DK22Pac/plugin-sdk

Discord-сервер по plugin-sdk и программированию в GTA
RU https://discord.gg/QEesDGb
ENG https://discord.gg/zaVqFQv

Оффлайн kenking

  • Новичек
  • **
  • Сообщений: 144
  • Репутация: +5/-0
    • Просмотр профиля
Re: Структура Полицейского вертолёта
« Ответ #6 : Октябрь 26, 2016, 03:37:11 pm »
Теперь есть, но какая-то ерунда получается. Я для gta3 решил структуры посмотреть. Вот, что вышло для CAutomobile
00000000 CAutomobile     struc ; (sizeof=0x58C, align=0x4, mappedto_6)
00000000 vehicle         db ?
00000001 gap1            db 79 dup(?)
00000050 byte50          db ?
00000051 byte51          db ?
00000052 byte52          db ?
00000053 byte53          db ?
00000054 gap54           db 8 dup(?)
0000005C word5C          dw ?
0000005E gap5E           db 362 dup(?)
000001C8 byte1C8         db ?
000001C9 gap1C9          db 91 dup(?)
00000224 dword224        dd ?
00000228 gap228          db 92 dup(?)
00000284 dword284        dd ?
00000288 dword288        dd ?
0000028C gap28C          db 20 dup(?)
000002A0 byte2A0         db ?
000002A1 gap2A1          db 223 dup(?)
00000380 dword380        dd ?
00000384 gap384          db 4 dup(?)
00000388 dword388        dd ?
0000038C dword38C        dd ?
00000390 gap390          db 4 dup(?)
00000394 dword394        dd ?
00000398 gap398          db 321 dup(?)
000004D9 byte4D9         db ?
000004DA                 db ? ; undefined
000004DB                 db ? ; undefined
000004DC dword4DC        dd ?
000004E0 word4E0         dw ?
000004E2 gap4E2          db 78 dup(?)
00000530 dword530        dd ?
00000534 gap534          db 68 dup(?)
00000578 float578        dd ?
0000057C float57C        dd ?
00000580 dword580        dd ?
00000584 dword584        dd ?
00000588 dword588        dd ?
0000058C CAutomobile     ends


m_aCarNodes     dd 20 dup(?) начинается реально с 0x37С
а здесь показывается 0000028C gap28C          db 20 dup(?)Как разбираться?

Оффлайн DK

  • Новичек
  • **
  • Сообщений: 222
  • Репутация: +313/-0
    • dk22pac
    • Просмотр профиля
Re: Структура Полицейского вертолёта
« Ответ #7 : Октябрь 26, 2016, 05:55:29 pm »
IDA и hex-rays не выдадут полностью готовые структуры, это будет что-то вроде макета, который тебе нужно продолжать разбирать.
В данном случае надо разбить массив gap2A1 и по смещению 0x37C создать массив в 20 элементов.
Plugin-SDK https://github.com/DK22Pac/plugin-sdk

Discord-сервер по plugin-sdk и программированию в GTA
RU https://discord.gg/QEesDGb
ENG https://discord.gg/zaVqFQv

Оффлайн kenking

  • Новичек
  • **
  • Сообщений: 144
  • Репутация: +5/-0
    • Просмотр профиля
Re: Структура Полицейского вертолёта
« Ответ #8 : Февраль 01, 2017, 08:30:01 am »
IDA и hex-rays не выдадут полностью готовые структуры, это будет что-то вроде макета, который тебе нужно продолжать разбирать.
А размер структур всегда выдают правильно?

Оффлайн DK

  • Новичек
  • **
  • Сообщений: 222
  • Репутация: +313/-0
    • dk22pac
    • Просмотр профиля
Re: Структура Полицейского вертолёта
« Ответ #9 : Февраль 01, 2017, 10:56:59 pm »
Нет.
IDA "строит" структуру на основе информации, которая есть в конкретной функции (т.е. функции, внутри которой ты создаешь структуру).
Например, есть 2 метода одного и того же класса (для упрощения - представим, что все поля этого класса имеют тип int).
В первом есть доступ только к полям +0 и +4, во втором - только к полям +8 и + 12
Если создавать структуру из первого метода, получим структуру
Код: C++
  1. struct A { // sizeof(A) = 0x8
  2.     int _f0;
  3.     int _f4;
  4. };
А если создавать из второй -
Код: C++
  1. struct A { // sizeof(A) = 0x10
  2.     char _gap0[8]; // 'gap' - 'пропасть', неизвестные данные
  3.     int _f8;
  4.     int _fC;
  5. };
Обычно доступ к большинству полей производится именно в конструкторе, поэтому логичнее создавать структуру из функции-конструктора.

Если речь идёт только о размере структуры - то тут есть 2 варианта.

Первый - если память под обьект структуры (класса) выделяется динамически. В таком случае, в коде мы точно увидим размер выделяемой памяти.
В C++ такое создание обьекта выглядит так:
Код: C++
  1. MyObject *object = new MyObject; // C++ вызывает operator new (оператор выделения памяти) и далее конструирует обьект (вызывает конструктор)
Вот примерно так в коде R* выглядело создание транспортного средства:
Код: C++
  1. CAutomobile *automobile = new CAutomobile; // C++ вызывает перегруженный оператор CVehicle::operator new (который ищет и возвращает пустой слот в пуле CVehicle), далее вызывает CAutomobile::CAutomobile (конструктор))
В оператор выделения памяти (operator new) передается параметр - размер выделяемой памяти (не явно), а после этого вызывается конструктор (тоже не явно).
На уровне чуточку "ниже" этот код выглядит так (см. любой вызов CAutomobile::CAutomobile в базе):
Код: C++
  1. // CAutomobile *automobile = new CAutomobile;
  2. CAutomobile *automobile;
  3. CVehicle *data = CVehicle::operator new(0x988); // выделяем память под обьект
  4. if ( data ) // если удачно выделили
  5.     automobile = CAutomobile::CAutomobile(data, modelIndex, createdBy, 1); // конструируем обьект
  6. else
  7.     automobile = 0; // иначе получаем пустой указатель
Тут мы можем увидеть, что размер структуры CAutomobile - 0x988 байт.

Второй вариант - это когда память под обьект выделяется на стеке или в глобальном пространстве.
Тут я бы тоже выделил 3 случая:
1) Обьект выделен на стеке
2) Обьект находится в глобальном пространстве (глобальный обьект или статическая переменная класса)
3) Массив обьектов в глобальном пространстве (глобальный обьект или статическая переменная класса).

По всему этому постараюсь завтра расписать.
« Последнее редактирование: Февраль 01, 2017, 11:06:14 pm от DK »
Plugin-SDK https://github.com/DK22Pac/plugin-sdk

Discord-сервер по plugin-sdk и программированию в GTA
RU https://discord.gg/QEesDGb
ENG https://discord.gg/zaVqFQv

Оффлайн kenking

  • Новичек
  • **
  • Сообщений: 144
  • Репутация: +5/-0
    • Просмотр профиля
Re: Структура Полицейского вертолёта
« Ответ #10 : Февраль 02, 2017, 10:54:54 am »
Как я понимаю, некоторые структуры в gta III идентичны структурам из gta VC, некоторые будут отличаться. Верно?

Оффлайн GeniusZ

  • Призрак
  • Сообщений: 29
  • Репутация: +0/-0
    • Просмотр профиля
Re: Структура Полицейского вертолёта
« Ответ #11 : Февраль 02, 2017, 04:30:04 pm »
Как я понимаю, некоторые структуры в gta III идентичны структурам из gta VC, некоторые будут отличаться. Верно?

Да, верно.

Оффлайн kenking

  • Новичек
  • **
  • Сообщений: 144
  • Репутация: +5/-0
    • Просмотр профиля
Re: Структура Полицейского вертолёта
« Ответ #12 : Февраль 14, 2017, 07:56:12 am »
...Первый - если память под обьект структуры (класса) выделяется динамически. В таком случае, в коде мы точно увидим размер выделяемой памяти.
...
(см. любой вызов CAutomobile::CAutomobile в базе):...
С этим разобрался. Почему-то в псевдокоде не всегда показывается размер выделяемой памяти, показывается вот так:
Код: C++
  1. CVehicle::operator new()

Надо смотреть в асм (пример для VC)
push    5DCh            ; int
call    _ZN8CVehiclenwEj ; CVehicle::operator new(uint)
test    eax, eax
pop     ecx
jz      short loc_42773F
mov     ecx, eax
push    1
push    [esp+1F4h+var_1E0]
call    _ZN11CAutomobileC2Eih ; CAutomobile::CAutomobile(int,uchar)

Второй вариант - это когда память под обьект выделяется на стеке или в глобальном пространстве.
Тут я бы тоже выделил 3 случая:
1) Обьект выделен на стеке
2) Обьект находится в глобальном пространстве (глобальный обьект или статическая переменная класса)
3) Массив обьектов в глобальном пространстве (глобальный обьект или статическая переменная класса).
...По всему этому постараюсь завтра расписать.
Хотелось бы почитать и про второй вариант.  ;)

Оффлайн DK

  • Новичек
  • **
  • Сообщений: 222
  • Репутация: +313/-0
    • dk22pac
    • Просмотр профиля
Re: Структура Полицейского вертолёта
« Ответ #13 : Февраль 14, 2017, 09:58:37 pm »
Как уже говорилось, hex-rays не всегда правильно определяет тип и параметры функции.

Конкретно в этом случае - обьсяняю.
CVehicle::operator new принимает один параметр (размер выделяемой памяти), но внутри этой функции этот параметр не используется* - и hex-rays просто игнорирует его.



Но если "заставить" определить тип функции не в самой функции, а в месте, где она вызывается, он этот параметр увидит (в месте вызова, нажимаем "Y" на функции, удаляем всю строку (очищаем тип функции)):



Теперь, чтобы hex-rays "запомнил" этот, "правильный" тип функции - ещё раз нажимаем "Y" на названии функции и жмём "Enter".

Про стек и глобальные обьекты пока что нет времени написать. На всякий случай оставлю ещё здесь полезную ссылку
https://sannybuilder.com/forums/viewtopic.php?id=845
, там есть об этом.

* "Память" на самом деле выделяется при инициализации пула CVehicle, а operator new просто возвращает свободный элемент в уже выделенном куске памяти. Просто так это работает в C++ - перегруженный operator new в любом случае принимает как параметр размер создаваемого обьекта.
« Последнее редактирование: Февраль 14, 2017, 10:15:08 pm от DK »
Plugin-SDK https://github.com/DK22Pac/plugin-sdk

Discord-сервер по plugin-sdk и программированию в GTA
RU https://discord.gg/QEesDGb
ENG https://discord.gg/zaVqFQv

Оффлайн kenking

  • Новичек
  • **
  • Сообщений: 144
  • Репутация: +5/-0
    • Просмотр профиля
Re: Структура Полицейского вертолёта
« Ответ #14 : Февраль 15, 2017, 07:11:35 am »
Спасибо за пояснения.