#1 18-12-2006 15:16

Seemann
Registered: 07-08-2006
Posts: 2,156

Адреса и функции gta_sa.exe 1.0

В указанном файле перечень адресов некоторых процедур и функций gta-sa.exe 1.0. Надеюсь, что это пригодится вам при исследовании движка игры и написании ассемблерных вставок в main.scm.

Обновлено: 29.07.2007
http://sannybuilder.com/dev/research/sa10funcs.txt
http://sannybuilder.com/dev/research/sa … 070416.txt

Расписанные базы gta_sa.exe для IDA5

Полезные ссылки:
Документация по адресам памяти на GTAModding.com
Документация по адресам памяти на GTAModding.ru

Last edited by Seemann (10-09-2007 16:06)

Offline

#2 09-01-2007 13:43

listener
From: Vice City
Registered: 09-11-2006
Posts: 616
Website

Re: Адреса и функции gta_sa.exe 1.0

У меня есть порядка еще нескольких сотен адресов. Часть из них - точная или почти точная (например, я нашел Renderware SDK (правда, более новой версии) и хорошенько посидел и посравнивал). Если интересно, я могу попробовать привести это к более-менее нормальной форме и закинуть. Для затравки кусочек мэпа:

 0001:0034E660       _RpWorldDestroy
 0001:0034E780       _RpWorldSetSectorRenderCallBack
 0001:0034E7A0       _RpWorldGetSectorRenderCallBack
 0001:0034E7B0       _RpWorldCreate
 0001:0034EBD0       _RpWorldForAllClumps
 0001:0034EC10       _RpWorldForAllMaterials
 0001:0034EC50       _RpWorldForAllLights
 0001:0034ECC0       _RpWorldForAllWorldSectors
 0001:0034ED20       _RpWorldRegisterPlugin
 0001:0034ED50       _RpWorldRegisterPluginStream
 0001:0034ED80       _RpWorldSetStreamAlwaysCallBack
 0001:0034EDA0       _RpWorldSetStreamRightsCallBack
 0001:0034EDC0       _RpWorldGetPluginOffset
 0001:0034EDE0       _RpWorldValidatePlugins
 0001:0034EDF0       _RpWorldPluginAttach
 0001:0034EEE0       _WorldClose
 0001:0034EF30       _WorldOpen

Еще (это уже не из библиотечного кода, поэтому имена взяты с потолка (часть была в рудиментах отладочной печати)):

 0001:0014F890       CPool<CTask>::constructor
 0001:0014F8F0       CPool<CTask>::destructor
 0001:0014F940       CPool<CTask>::allocatedCount
 0001:0014F960       CPool<CEvent>::constructor
 0001:0014F9C0       CPool<CEvent>::destructor
 0001:0014FA10       CPool<CEvent>::allocatedCount
 0001:0014FA30       CPool<CPointRoute>::constructor
 0001:0014FA90       CPool<CPointRoute>::destructor
 0001:0014FAE0       CPool<CPointRoute>::allocatedCount
 0001:0014FB00       CPool<CPatrolRoute>::constructor
 0001:0014FB60       CPool<CPatrolRoute>::destructor
 0001:0014FBB0       CPool<CPatrolRoute>::allocatedCount

Вообще, я замахнулся ни много, ни мало на OpenGTA. (Хочу LCS/VCS на PC (и Bully туда же), а то на приставке - и тяжело, и по графике/объектам не то). Ну, а если не хватит времени/сил, "не догоню, так согреюсь" - опробую несколько своих идей из теории компиляции/декомпиляции (да и просто так, можно например, размеры пулов объектов увеличить).

Offline

#3 09-01-2007 14:15

Seemann
Registered: 07-08-2006
Posts: 2,156

Re: Адреса и функции gta_sa.exe 1.0

У меня есть порядка еще нескольких сотен адресов. Часть из них - точная или почти точная

круто. было бы интересно посмотреть.

Для затравки кусочек мэпа

не совсем понял что это за значения, на адреса памяти не похожи...

Еще (это уже не из библиотечного кода, поэтому имена взяты с потолка (часть была в рудиментах отладочной печати)):

ага, есть такие пулы. Процедура InitDataPools их инициализирует. По адресу 0x00B74480 хранятся указатели на них.

Вообще, я замахнулся ни много, ни мало на OpenGTA. (Хочу LCS/VCS на PC (и Bully туда же)

слишком большой размах. Попробуй посчитать сколько времени потратили разработчики GTA:LC, чтобы перенести GTA3 на движок вайса. А ведь там был не один человек, а целая команда. И то они еще не закончили (хотя может я отстал от жизни?).

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

вроде на гтафорумс уже этим занимались. точно не знаю, но читал когда-то.

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

Offline

#4 09-01-2007 14:46

listener
From: Vice City
Registered: 09-11-2006
Posts: 616
Website

Re: Адреса и функции gta_sa.exe 1.0

круто. было бы интересно посмотреть

Причешу - выложу. (Блин! Аврал на работе - уже полтора месяца не вылезаю с работы по 12 часов, а то и больше)

Самое вкусное в библиотечных функциях - это определения:

extern RpWorld     *RpWorldCreate(RwBBox * boundingBox);

struct RpWorld {
    RwObject            object;
    RwUInt32            flags;
    RpWorldRenderOrder  renderOrder;
    /* Materials */
    RpMaterialList      matList;
    /* The world stored as a BSP tree */
    RpSector           *rootSector;
    /* The number of texture coordinate sets in each sector */
    RwInt32             numTexCoordSets;
    /* Render frame used when last rendered */
    RwInt32             numClumpsInWorld;
    RwLLLink           *currentClumpLink;
    /* All the clumps in the world */
    RwLinkList          clumpList;
    /* All of the lights in the world */
    RwLinkList          lightList;
    /* Directional lights in the world */
    RwLinkList          directionalLightList;
    /* The worlds origin offset */
    RwV3d               worldOrigin;
    /* Bounding box around the whole world */
    RwBBox              boundingBox;
    /* The callbacks functions */
    RpWorldSectorCallBackRender renderCallBack;
    RxPipeline         *pipeline;
};

и так для всего.

не совсем понял что это за значения, на адреса памяти не похожи

ida в .map пишет в формате seg:offset. Т.е. надо прибавлять к смещению базу: 0001:0034E660 = 0074F660.

Попробуй посчитать сколько времени потратили разработчики GTA:LC, чтобы перенести GTA3 на движок вайса

Знаю, что много. Но у меня есть преимущество - я профессионал (и вообще, старый и толстый дядька). Летом будет 15 лет, как у меня в трудовой написано "программист". И дизассемблер я увидел в первый раз почти два десятка лет назад :-) В любом случае, полезной инфы можно будет нарыть много.

На имеющиеся на текущий момент примерно три тысячи адресов (из них 600-800 не библиотечные) + декомпилирование ~5% кода - ушло порядка месяца. Дальше - пойдет быстрее (т.к., с расписыванием полей структур процесс очень сильно ускоряется).

Offline

#5 09-01-2007 15:13

Seemann
Registered: 07-08-2006
Posts: 2,156

Re: Адреса и функции gta_sa.exe 1.0

Самое вкусное в библиотечных функциях - это определения

я так понимаю, что в SDK только графика? Было бы гораздо интереснее получить скриптинговые структуры (CPed, CPlayer, CCar).

ida в .map пишет в формате seg:offset. Т.е. надо прибавлять к смещению базу: 0001:0034E660 = 0074F660

все равно не получается sad 0x0074F660 в gta-sa.exe указывает на середину процедуры.

Но у меня есть преимущество - я профессионал (и вообще, старый и толстый дядька). Летом будет 15 лет, как у меня в трудовой написано "программист". И дизассемблер я увидел в первый раз почти два десятка лет назад :-)

снимаю шляпу. мой опыт более-менее серьезного программирования составляет около 2-х лет, а иду я взял в руки только прошлой осенью. Хотя для меня это лишь хобби smile

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

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

Offline

#6 09-01-2007 15:14

Seemann
Registered: 07-08-2006
Posts: 2,156

Offline

#7 09-01-2007 15:31

Seemann
Registered: 07-08-2006
Posts: 2,156

Re: Адреса и функции gta_sa.exe 1.0

2listener:
Кстати, может ты сможешь объяснить мне, для чего используются подобные конструкции:

.text:00535F58 xor     edx, edx                                            ; Logical Exclusive OR
.text:00535F5A test    al, al                                              ; Logical Compare
.text:00535F5C mov     eax, [esi+1Ch]
.text:00535F5F setz    dl                                                  ; Set Byte if Zero (ZF=1)
.text:00535F62 shl     edx, 11h                                            ; Shift Logical Left
.text:00535F65 xor     edx, eax                                            ; Logical Exclusive OR
.text:00535F67 and     edx, 20000h                                         ; Logical AND
.text:00535F6D xor     eax, edx                                            ; Logical Exclusive OR
.text:00535F6F mov     [esi+1Ch], eax

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

Offline

#8 09-01-2007 16:23

listener
From: Vice City
Registered: 09-11-2006
Posts: 616
Website

Re: Адреса и функции gta_sa.exe 1.0

все равно не получается  0x0074F660 в gta-sa.exe указывает на середину процедуры

Странно. Может exe-шники разные? Вроде бы у меня все правильно, US, 1.0. Адреса в файлике из начального поста - тоже соответствуют.
Возможен вариант, что что-то продизассемблировалось неправильно (там достаточно много в результатах начального анализа пришлось править руками).

.text:0074F5E0     ; [00000076 BYTES: COLLAPSED FUNCTION _WorldSectorRender. PRESS KEYPAD "+" TO EXPAND]
.text:0074F656                     align 10h
.text:0074F660
.text:0074F660     ; --------------- S U B R O U T I N E ---------------------------------------
.text:0074F660
.text:0074F660     ; Attributes: library function
.text:0074F660
.text:0074F660     _RpWorldDestroy proc near               ; CODE XREF: sub_53BB80+7Ap
.text:0074F660                                             ; .text:00762C5Fp
.text:0074F660                                             ; .text:00762CA0p
.text:0074F660                                             ; .text:00762CD8p ...
.text:0074F660
.text:0074F660     var_100         = dword ptr -100h
.text:0074F660     arg_0           = dword ptr  4
.text:0074F660
.text:0074F660 000                 mov     eax, ds:_RwEngineInstance
.text:0074F665 000                 mov     ecx, dword ptr ds:unk_C9254C
.text:0074F66B 000                 sub     esp, 100h
.text:0074F671 100                 lea     edx, [ecx+eax+4]
.text:0074F675 100                 push    ebx
.text:0074F676 104                 mov     ebx, [esp+104h+arg_0]
.text:0074F67D 104                 mov     eax, [edx]
.text:0074F67F 104                 push    esi
.text:0074F680 108                 cmp     eax, edx
.text:0074F682 108                 jz      short loc_74F6C0
.text:0074F684
.text:0074F684     loc_74F684:                             ; CODE XREF: _RpWorldDestroy+32j
.text:0074F684 108                 mov     esi, [eax-8]
.text:0074F687 108                 lea     ecx, [eax-8]
.text:0074F68A 108                 cmp     esi, ebx
.text:0074F68C 108                 jz      short loc_74F696
.text:0074F68E 108                 mov     eax, [eax]
.text:0074F690 108                 cmp     eax, edx
.text:0074F692 108                 jnz     short loc_74F684
.text:0074F694 108                 jmp     short loc_74F6C0
......

Могу кинуть базу. (IDA 5.0.0.879). Там все, конечно, в жутком состоянии, но что-то полезное  из нее можно получить.
Могу кинуть еще чего-нибудь (RW SDK (160M), только доки и инклюды из нее (~20M) и т.д.). Декомпилированные куски тоже могу кинуть, но в них сейчас без описания разобраться практически нереально. (А описание нужно писать).

Если нужно - rapidshare.com подойдет?

За ссылочки спасибо, посмотрю (по внешнему виду - похоже, кто-то раздобыл либы нужной версии и прогнал через FLAIR).

Last edited by listener (09-01-2007 16:24)

Offline

#9 09-01-2007 16:28

listener
From: Vice City
Registered: 09-11-2006
Posts: 616
Website

Re: Адреса и функции gta_sa.exe 1.0

Кстати, может ты сможешь объяснить мне, для чего используются подобные конструкции

Могу.

if (какое-то условие до начала конструкции == 0)
  esi->_f1C |= 0x20000;
else
  esi->_f1C &= ~0x20000;

Т.е., в зависимости от проверки условия - либо выставляем, либо сбрасываем битовый флаг.
esi->_f1C - поле по смещению 0x1C в структуре, на которую указывает ESI.

Offline

#10 09-01-2007 17:23

Seemann
Registered: 07-08-2006
Posts: 2,156

Re: Адреса и функции gta_sa.exe 1.0

У меня эта процедура по адресу 0x0074F610. Первый хреф совпадает (sub_53BB80).

Могу кинуть базу. (IDA 5.0.0.879). Там все, конечно, в жутком состоянии, но что-то полезное  из нее можно получить.
Могу кинуть еще чего-нибудь (RW SDK (160M), только доки и инклюды из нее (~20M) и т.д.). Декомпилированные куски тоже могу кинуть, но в них сейчас без описания разобраться практически нереально. (А описание нужно писать).

пока не надо, сдам экзамены там видно будет smile сейчас времени совершенно нет.

Если нужно - rapidshare.com подойдет?

если что, зальешь прямо на этот сайт, пароль на фтп дам.

Т.е., в зависимости от проверки условия - либо выставляем, либо сбрасываем битовый флаг.
esi->_f1C - поле по смещению 0x1C в структуре, на которую указывает ESI.

а вы, батенька, я смотрю на сях пишете. у меня как-то не сложилось...

Offline

#11 09-01-2007 19:20

listener
From: Vice City
Registered: 09-11-2006
Posts: 616
Website

Re: Адреса и функции gta_sa.exe 1.0

У меня эта процедура по адресу 0x0074F610.

Ясно. Похоже версии слегка отличаются. (слинковано с немного другой библиотекой).

пока не надо, сдам экзамены там видно будет

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

а вы, батенька, я смотрю на сях пишете

Эх, на чем я только не пишу...

Да, совсем забыл:

я так понимаю, что в SDK только графика? Было бы гораздо интереснее получить скриптинговые структуры (CPed, CPlayer, CCar).

Да, только графика.

Вообще, там идет так: у меня, по адресу 00748760 находится WinMain. (не точка входа, а непосредственно, основная функция программы). После него - идут библиотеки RW, дальше - libc и, за ней, достаточно много инициализаторов статических переменных и прочих языковых вещей. До WinMain - практически все - код R* (за исключением libjpeg и какой-то маленькой библитечки RW килобайт на 20).

Насчет структуры CCar - не совсем так. Есть объект CVehicle. От него наследуется четыре объекта для разных видов транспорта. Структура данных для всех объектов одинакова и включает все возможные поля (чтобы можно было пользоваться пулом), а методы - разные.

Насчет CPed (есть ли у него сабклассы) - я еще подробно не копался. У меня помечены VMT для всех классов, но, что от чего наследуется - я еще не расписывал.

Еще есть интересный объект CTask, отвечающий за базовое поведение педов (и машин, соответственно). От него наследуется большая куча (несколько десятков) сабклассов (для некоторых классов - два-три уровня насдледования), каждый из которых отвечает за отдельную поведенческую задачу. (идти, бежать, бояться и т.д.) Какой-за что отвечает - я еще не копался. Никакой отладочной инфы на них нет, есть только числовые идентификаторы.

Offline

#12 09-01-2007 20:15

Seemann
Registered: 07-08-2006
Posts: 2,156

Re: Адреса и функции gta_sa.exe 1.0

Есть объект CVehicle. От него наследуется четыре объекта для разных видов транспорта

вот этого не знал. Есть, кстати, процедура GetCarType, которая возвращает тип машины:

.text:005710A8                     call GetCarType                 ; ecx = @carstruct;
.text:005710A8                                                             ; result:
.text:005710A8                                                             ; 0
.text:005710A8                                                             ; 1 car
.text:005710A8                                                             ; 2 bike
.text:005710A8                                                             ; 3 heli
.text:005710A8                                                             ; 4 boat
.text:005710A8                                                             ; 5 plane

достаточно много инициализаторов статических переменных

ага, находил. Есть интересная процедура

.text:00821E02 ; int __stdcall AllocPoolMemory_unk(int PoolStart,int PoolSize,int PoolCount,int UnkProc)

она что-то делает с массивами, возможно чистит память, точно не уверен. Есть посмотреть хрефы на нее, можно получить все статические пулы в игре (CGarages, CScripts, CTextDrawers). оффсеты, размер передаются как параметры в нее.

Еще есть интересный объект CTask, отвечающий за базовое поведение педов (и машин, соответственно). От него наследуется большая куча (несколько десятков) сабклассов (для некоторых классов - два-три уровня насдледования), каждый из которых отвечает за отдельную поведенческую задачу. (идти, бежать, бояться и т.д.) Какой-за что отвечает - я еще не копался. Никакой отладочной инфы на них нет, есть только числовые идентификаторы

да, что-то подобное находил. Если от адреса 0x0086C0A8 поехать вниз там будет несколько сотен процедур, связанных с различными действиями (событиями). Я там обнаружил опкод player.climbing

Offline

#13 10-01-2007 09:36

Sanchez
Registered: 18-08-2006
Posts: 280

Re: Адреса и функции gta_sa.exe 1.0

listener wrote:

Знаю, что много. Но у меня есть преимущество - я профессионал (и вообще, старый и толстый дядька). Летом будет 15 лет, как у меня в трудовой написано "программист". И дизассемблер я увидел в первый раз почти два десятка лет назад :-) В любом случае, полезной инфы можно будет нарыть много.

Так и у R* профессионалы своего дела, а не дядьки с улицы smile
Может объяснишь почему: http://www.sannybuilder.com/forums/view … d=166#p166 (#7 пост)

Могу кинуть базу. (IDA 5.0.0.879).

Выложи на рапиду. Охота посмотреть.

Last edited by Sanchez (10-01-2007 09:56)

Offline

#14 10-01-2007 10:21

Seemann
Registered: 07-08-2006
Posts: 2,156

Re: Адреса и функции gta_sa.exe 1.0

Sanchez wrote:

Так и у R* профессионалы своего дела, а не дядьки с улицы

речь шла про команду GTA:LC, там в основном любители.

Выложи на рапиду. Охота посмотреть.

только не на рапиду smile с нее потом хрен скачаешь, а у меня модем wink лучше сюда через фтп залить

Offline

#15 10-01-2007 10:30

Sanchez
Registered: 18-08-2006
Posts: 280

Re: Адреса и функции gta_sa.exe 1.0

речь шла про команду GTA:LC, там в основном любители

Незнал

только не на рапиду с нее потом хрен скачаешь, а у меня модем  лучше сюда через фтп залить

Хорошо

Offline

#16 10-01-2007 12:30

Seemann
Registered: 07-08-2006
Posts: 2,156

Re: Адреса и функции gta_sa.exe 1.0

Может объяснишь почему: http://www.sannybuilder.com/forums/view … d=166#p166 (#7 пост)

да, точно, как вызвать call с константой?

Еще может кто-нибудь объяснить, как в IDA поставить бряк с условием? Т.е. я хочу чтобы брейпойнт сработал, только если в адрес X записывается определенное число. Возможно такое?

Offline

#17 10-01-2007 16:21

listener
From: Vice City
Registered: 09-11-2006
Posts: 616
Website

Re: Адреса и функции gta_sa.exe 1.0

Seemann wrote:

вот этого не знал. Есть, кстати, процедура GetCarType, которая возвращает тип машины:

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

За функцию спасибо.

В итоге получается примерно так:

enum VehicleType {
  None,
  Car,
  Bike,
  Heli,
  Boat,
  Plane
}

VehicleType CVehicle::getVehicleType (); // 0x005710A

В ECX для методов объектов передается this.

Seemann wrote:

ага, находил. Есть интересная процедура

.text:00821E02 ; int __stdcall AllocPoolMemory_unk(int PoolStart,int PoolSize,int PoolCount,int UnkProc)

она что-то делает с массивами, возможно чистит память, точно не уверен. Есть посмотреть хрефы на нее, можно получить все статические пулы в игре (CGarages, CScripts, CTextDrawers). оффсеты, размер передаются как параметры в нее.

Что она делает, понято верно, но, в глобальном плане, все немного не так.
Не утверждения собственной правоты ради, а ясности для:
пулом принято называть структру, предназначенну для того, чтобы при частом выделении/освобождении объектов фиксированного размера не дергать heap manager. Как правило, это какой-то, в меру примитивный, collection. Основная характеристика пула - элементы могут в нем заниматься в произвольном порядке.
Если же речь идет о непрерывном блоке памяти, в котором заняты либо все элементы, либо непрерывная область от начала - это, обычно, называется не пулом, а массивом. (array либо vector).

Если выделяется массив объектов, то для каждого элемента массива нужно вызвать конструктор, а, при освобождении - деструктор. Упомянутая функция, это, как раз, векторный конструктор из стандартной библиотеки.

У меня? по адресу 0x00821D70? находится векторный конструктор, а в 0x00821E42 -  векторый деструктор.

Offline

#18 10-01-2007 16:48

Seemann
Registered: 07-08-2006
Posts: 2,156

Re: Адреса и функции gta_sa.exe 1.0

enum VehicleType {
  None,

насчет нуля не уверен, возможно есть еще какой-то тип. Хотя больше подходит для none.

В ECX для методов объектов передается this.

о, полезная инфа. this насколько я помню, это как self в дельфи?

У меня? по адресу 0x00821D70? находится векторный конструктор, а в 0x00821E42 -  векторый деструктор.

у меня другие адреса sad

Offline

#19 11-01-2007 22:33

listener
From: Vice City
Registered: 09-11-2006
Posts: 616
Website

Re: Адреса и функции gta_sa.exe 1.0

у меня другие адреса

Нужно для таких случев договориться о каком-то едином exe-шнике.
Между этим: http://www.gtamodding.com/index.php?tit … s_%28SA%29 и своим exe-шником я расхождений не нашел.

Вообще, есть идея, сесть и выкинуть из exe-шника всякий полиморфный мусор (куски между pushf/popf), securom-овские сегменты, да и неинициализированный сегмент туда же. Ручной работы, к сожалению, получается дофига (а автоматизировать все, к сожалению, не получится). Если разберусь, как патченные куски в ida на диск сбрасывать - жить будет гораздо проще.

Offline

#20 20-01-2007 11:09

Sanchez
Registered: 18-08-2006
Posts: 280

Re: Адреса и функции gta_sa.exe 1.0

Нужно для таких случев договориться о каком-то едином exe-шнике.

Контрольная сумма чистого, не чем не пропатченного, gta_sa.exe. (У меня)

CRC32: ACFF1F28

Offline

#21 20-01-2007 11:10

Seemann
Registered: 07-08-2006
Posts: 2,156

Re: Адреса и функции gta_sa.exe 1.0

2Sanchez:
А как ты ее получил?

Offline

#22 20-01-2007 11:21

Sanchez
Registered: 18-08-2006
Posts: 280

Re: Адреса и функции gta_sa.exe 1.0

А как ты ее получил?

Есть много способов wink Я например с помощью PEiD с соответствующим плагином.

Last edited by Sanchez (20-01-2007 11:22)

Offline

#23 20-01-2007 11:25

Seemann
Registered: 07-08-2006
Posts: 2,156

Re: Адреса и функции gta_sa.exe 1.0

У меня 5300E0D7 (размер файла 14 383 616 байт). Считал в Hex Workshop'е

Offline

#24 20-01-2007 11:29

Sanchez
Registered: 18-08-2006
Posts: 280

Re: Адреса и функции gta_sa.exe 1.0

У меня 5300E0D7

Попробуй этим http://cracklab.ru/download.php?action=get&n=OTA=
-> Plugins -> CRC32

Offline

#25 20-01-2007 11:38

Seemann
Registered: 07-08-2006
Posts: 2,156

Re: Адреса и функции gta_sa.exe 1.0

ACFF1F28 wink

Offline

Board footer

Powered by FluxBB