You are not logged in.
В указанном файле перечень адресов некоторых процедур и функций 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
У меня есть порядка еще нескольких сотен адресов. Часть из них - точная или почти точная (например, я нашел 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
У меня есть порядка еще нескольких сотен адресов. Часть из них - точная или почти точная
круто. было бы интересно посмотреть.
Для затравки кусочек мэпа
не совсем понял что это за значения, на адреса памяти не похожи...
Еще (это уже не из библиотечного кода, поэтому имена взяты с потолка (часть была в рудиментах отладочной печати)):
ага, есть такие пулы. Процедура InitDataPools их инициализирует. По адресу 0x00B74480 хранятся указатели на них.
Вообще, я замахнулся ни много, ни мало на OpenGTA. (Хочу LCS/VCS на PC (и Bully туда же)
слишком большой размах. Попробуй посчитать сколько времени потратили разработчики GTA:LC, чтобы перенести GTA3 на движок вайса. А ведь там был не один человек, а целая команда. И то они еще не закончили (хотя может я отстал от жизни?).
да и просто так, можно например, размеры пулов объектов увеличить
вроде на гтафорумс уже этим занимались. точно не знаю, но читал когда-то.
В общем, интересно посмотреть на результаты твоих исследований.
Offline
круто. было бы интересно посмотреть
Причешу - выложу. (Блин! Аврал на работе - уже полтора месяца не вылезаю с работы по 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
Самое вкусное в библиотечных функциях - это определения
я так понимаю, что в SDK только графика? Было бы гораздо интереснее получить скриптинговые структуры (CPed, CPlayer, CCar).
ida в .map пишет в формате seg:offset. Т.е. надо прибавлять к смещению базу: 0001:0034E660 = 0074F660
все равно не получается 0x0074F660 в gta-sa.exe указывает на середину процедуры.
Но у меня есть преимущество - я профессионал (и вообще, старый и толстый дядька). Летом будет 15 лет, как у меня в трудовой написано "программист". И дизассемблер я увидел в первый раз почти два десятка лет назад :-)
снимаю шляпу. мой опыт более-менее серьезного программирования составляет около 2-х лет, а иду я взял в руки только прошлой осенью. Хотя для меня это лишь хобби
т.к., с расписыванием полей структур процесс очень сильно ускоряется
точно. помню когда только дизассемблировал ехешник было очень тяжело, сейчас когда основные функции описаны да и часть структур тоже гораздо легче ориентироваться.
Offline
Offline
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
все равно не получается 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
Кстати, может ты сможешь объяснить мне, для чего используются подобные конструкции
Могу.
if (какое-то условие до начала конструкции == 0) esi->_f1C |= 0x20000; else esi->_f1C &= ~0x20000;
Т.е., в зависимости от проверки условия - либо выставляем, либо сбрасываем битовый флаг.
esi->_f1C - поле по смещению 0x1C в структуре, на которую указывает ESI.
Offline
У меня эта процедура по адресу 0x0074F610. Первый хреф совпадает (sub_53BB80).
Могу кинуть базу. (IDA 5.0.0.879). Там все, конечно, в жутком состоянии, но что-то полезное из нее можно получить.
Могу кинуть еще чего-нибудь (RW SDK (160M), только доки и инклюды из нее (~20M) и т.д.). Декомпилированные куски тоже могу кинуть, но в них сейчас без описания разобраться практически нереально. (А описание нужно писать).
пока не надо, сдам экзамены там видно будет сейчас времени совершенно нет.
Если нужно - rapidshare.com подойдет?
если что, зальешь прямо на этот сайт, пароль на фтп дам.
Т.е., в зависимости от проверки условия - либо выставляем, либо сбрасываем битовый флаг.
esi->_f1C - поле по смещению 0x1C в структуре, на которую указывает ESI.
а вы, батенька, я смотрю на сях пишете. у меня как-то не сложилось...
Offline
У меня эта процедура по адресу 0x0074F610.
Ясно. Похоже версии слегка отличаются. (слинковано с немного другой библиотекой).
пока не надо, сдам экзамены там видно будет
Хорошо. Я за это время чуточку разберусь с работой и займусь описанием, систематизацией и приведением в порядок.
а вы, батенька, я смотрю на сях пишете
Эх, на чем я только не пишу...
Да, совсем забыл:
я так понимаю, что в SDK только графика? Было бы гораздо интереснее получить скриптинговые структуры (CPed, CPlayer, CCar).
Да, только графика.
Вообще, там идет так: у меня, по адресу 00748760 находится WinMain. (не точка входа, а непосредственно, основная функция программы). После него - идут библиотеки RW, дальше - libc и, за ней, достаточно много инициализаторов статических переменных и прочих языковых вещей. До WinMain - практически все - код R* (за исключением libjpeg и какой-то маленькой библитечки RW килобайт на 20).
Насчет структуры CCar - не совсем так. Есть объект CVehicle. От него наследуется четыре объекта для разных видов транспорта. Структура данных для всех объектов одинакова и включает все возможные поля (чтобы можно было пользоваться пулом), а методы - разные.
Насчет CPed (есть ли у него сабклассы) - я еще подробно не копался. У меня помечены VMT для всех классов, но, что от чего наследуется - я еще не расписывал.
Еще есть интересный объект CTask, отвечающий за базовое поведение педов (и машин, соответственно). От него наследуется большая куча (несколько десятков) сабклассов (для некоторых классов - два-три уровня насдледования), каждый из которых отвечает за отдельную поведенческую задачу. (идти, бежать, бояться и т.д.) Какой-за что отвечает - я еще не копался. Никакой отладочной инфы на них нет, есть только числовые идентификаторы.
Offline
Есть объект 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
Знаю, что много. Но у меня есть преимущество - я профессионал (и вообще, старый и толстый дядька). Летом будет 15 лет, как у меня в трудовой написано "программист". И дизассемблер я увидел в первый раз почти два десятка лет назад :-) В любом случае, полезной инфы можно будет нарыть много.
Так и у R* профессионалы своего дела, а не дядьки с улицы
Может объяснишь почему: 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
Так и у R* профессионалы своего дела, а не дядьки с улицы
речь шла про команду GTA:LC, там в основном любители.
Выложи на рапиду. Охота посмотреть.
только не на рапиду с нее потом хрен скачаешь, а у меня модем лучше сюда через фтп залить
Offline
речь шла про команду GTA:LC, там в основном любители
Незнал
только не на рапиду с нее потом хрен скачаешь, а у меня модем лучше сюда через фтп залить
Хорошо
Offline
Может объяснишь почему: http://www.sannybuilder.com/forums/view … d=166#p166 (#7 пост)
да, точно, как вызвать call с константой?
Еще может кто-нибудь объяснить, как в IDA поставить бряк с условием? Т.е. я хочу чтобы брейпойнт сработал, только если в адрес X записывается определенное число. Возможно такое?
Offline
вот этого не знал. Есть, кстати, процедура GetCarType, которая возвращает тип машины:
Ага. Понятно. Значит, не четыре, а пять. Видно, упустил и первом просмотре.
За функцию спасибо.
В итоге получается примерно так:
enum VehicleType { None, Car, Bike, Heli, Boat, Plane } VehicleType CVehicle::getVehicleType (); // 0x005710A
В ECX для методов объектов передается this.
ага, находил. Есть интересная процедура
.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
enum VehicleType {
None,
насчет нуля не уверен, возможно есть еще какой-то тип. Хотя больше подходит для none.
В ECX для методов объектов передается this.
о, полезная инфа. this насколько я помню, это как self в дельфи?
У меня? по адресу 0x00821D70? находится векторный конструктор, а в 0x00821E42 - векторый деструктор.
у меня другие адреса
Offline
у меня другие адреса
Нужно для таких случев договориться о каком-то едином exe-шнике.
Между этим: http://www.gtamodding.com/index.php?tit … s_%28SA%29 и своим exe-шником я расхождений не нашел.
Вообще, есть идея, сесть и выкинуть из exe-шника всякий полиморфный мусор (куски между pushf/popf), securom-овские сегменты, да и неинициализированный сегмент туда же. Ручной работы, к сожалению, получается дофига (а автоматизировать все, к сожалению, не получится). Если разберусь, как патченные куски в ida на диск сбрасывать - жить будет гораздо проще.
Offline
Нужно для таких случев договориться о каком-то едином exe-шнике.
Контрольная сумма чистого, не чем не пропатченного, gta_sa.exe. (У меня)
CRC32: ACFF1F28
Offline
2Sanchez:
А как ты ее получил?
Offline
А как ты ее получил?
Есть много способов Я например с помощью PEiD с соответствующим плагином.
Last edited by Sanchez (20-01-2007 11:22)
Offline
У меня 5300E0D7 (размер файла 14 383 616 байт). Считал в Hex Workshop'е
Offline
У меня 5300E0D7
Попробуй этим http://cracklab.ru/download.php?action=get&n=OTA=
-> Plugins -> CRC32
Offline
ACFF1F28
Offline