You are not logged in.
надеюсь в той теме пишу:
пытался разобраться как делается программа - Car Spawner, так не вышло.
Может кто знает ?
Обьясните плиз мне.
Offline
Программа встраивается в процесс игры, устанавливает хук на нажатие определенной клавиши и по мере необходимости вызывает функцию
.text:0043A0B6 ; int __cdecl SpawnCheatCar(int ModelID)
эта же функция использована в игре при вызове некоторых чит-кодов, типа спауна танка, ромеро и т.п.
Насчет встраивания в процесс точно сказать не могу, в разных программах по-разному. Может быть сделано в виде dll, которая подгружается игрой при запуске (как CLEO3), или через CreateRemoteThread (ну или что-то в этом духе).
Offline
я так понял что я должен по адресу 0х43A0B6 внешнего процесса игры записывать ID той машины,
которую хочу спанить ?
не работает.
я что-то недопонимаю ?
Offline
Это функция, а не переменная.
С помощью CLEO:
0AA5: call 0x43A0B6 num_params 1 pop 1 541
541 - ID машины
Offline
2007-11-19: свежая база, свежий набор исходников.
изменений мало. Практически полностью разобрана структура моделей в памяти и инициализация.
После разбора моделей, мне стало понятнее многое из 3D-части, так что, к следующему разу, будет большая чистка как по именам, так и по структурам.
Что касается исходников. Прямо сейчас, их слишком мало, чтобы от них была какая-то практическая польза.
С другой стороны, если хочется разобраться, откуда изначально берутся модели, как читается .ide и прочие подобные мелочи - копаться даже в такой несортированной куче - сильно проще, чем в ассемблере. На текущий момент, все, что подключется вместо оригинального кода, работает нормально, за исключением TransFender (предположительно, пропущена обработка какого-то флага в CModelCars::preprocessHierarchy).
Если, вдруг, кому-нибудь захочется собрать что-то из этих исходников, проект там под 9-й MSVC (VS2008). Чтобы скомпилировать в восьмом MSVC (и младше), нужно создать проект типа Windows DLL и тупо добавить туда все .cpp и .h файлы. Возможно, понадобится несколько хэдеров из DirectX SDK (я использую D3DVECTOR вместо RwV3D).
Еще, в ogText.cpp сейчас жестко прописана переменная gamePath - ее нужно поправить или заменить на обращение к соответствующей функции. Остальное, вроде бы, должно быть в порядке.
Буду очень благодарен за ссылочку на расшифровку флагов компонентов (в структуре по адресу 0x8A6468 и ей подобных).
Offline
И, вдогонку, несколько иллюстраций к этому клятому preprocessHierarchy.
При разборе был потерян один флаг: что из этого получилось
http://pics.livejournal.com/the__listener/pic/00002607/
http://pics.livejournal.com/the__listener/pic/00003dx4/
http://pics.livejournal.com/the__listener/pic/00004cex/
Offline
Буду очень благодарен за ссылочку на расшифровку флагов компонентов (в структуре по адресу 0x8A6468 и ей подобных).
это надо уже у моделлеров спрашивать мне на ум приходит только этот топик.
Offline
может кто знает:
есть адрес угла поворота по оси Z для педа:
CPed +0x558 = Z angle [float]
но я не нахожу аналогичного адреса для Т.С.
а спрошлим вопросом, к сожалению, не разобрался.
С функцией CreateRemoteThread никогда не работал.
При попытке создания дистанционного потока в игре происходит вылет самой игры.
Может Seemann или кто еще дадут пример ?
Можно Delphi или C++.
Или даже на Visual Basic.
Offline
2user1:
Идея с CreateRemoteThread - достаточно плоха: GTA использует только два потока (один - сама игра, и второй - чтение стримов).
Если добавить свой поток - есть большой шанс получить что-то нехорошее.
Идеальный вариант - ASI и вставка своей функции в CGame::Update (0x53BEE0, в старом списке - processGame). Там есть неиспользуемые вызовы, например по адресу 0x53BFA9, вместо которых можно подсунуть свою функцию. Еще можно сделать хук вместо любой другой функции update (например, вставить свой cheat-processor).
Что касается Zangle - а того, что в XYZ (CEntity +0x14) - не достаточно?
Offline
Я прекрасно делал через CreateRemoteThread , вставлял дополнительный асмемблированный код , в котором был call процедуры спавна тачки )
2listner : как тебе такое предложение - до конца разобраться с меню в игре ?
Cаму структуру таблицы меню(8CE008h) , откуда берутся все данные о положении строк итп .. , я разобрал давно , у Seemann'a в базе оно есть .
У строки меню есть такое свойство , как функция , сам список номеров функций я составил , но вот разобратся с тем , где идет присванивание этим условным номерам реальных функций в ехе - я не нашел , а это достаточно важно )
Last edited by Alexander (30-11-2007 20:30)
Offline
Там есть неиспользуемые вызовы, например по адресу 0x53BFA9, вместо которых можно подсунуть свою функцию.
Зачем менять код, когда можно поставить хук на нажатие клавишы ( SetWindowsHookEx(WH_KEYBOARD...) )?
Зачем вообще нужен ASI, когда можно написать такой же CLEO-скрипт (быстрее и менее затратно)?
Ну и кстати говоря, scm-based CarSpawner был написан уже давно
http://www.gtaforums.com/index.php?showtopic=258016
Offline
Не в спавнере дело , я просто привел к примеру , что я делал через CreateRemoteThread .
Offline
2Alexander:
Я и не говорил, что оно не будет работать. Я говорил, что можно огрести с этого дела кучу мелких гадостей. (Например, если машина будет спавниться в момент, когда добавляется или удаляется какая-то другая машина в игре, vehicle pool рассыпется). Учитывая частоту использования спавнера, этим можно пренебречь, но, вообще-то, лучше использовать другие методы.
А меню - займусь. (Как раз, немного рабочие задачки разгреб)
Offline
А меню - займусь. (Как раз, немного рабочие задачки разгреб)
Спасибо.
Если что , то вот структура таблицы меню :
Начиная от 8CE008h 44 таблицы по 226 байт каждая .
Одна таблица :
Head (1 сигнатура) -Gxt ключ имени ; 8 байт -Unknown ; 1 байт -Unknown ; 1 байт Строка меню (12 подярд идущих сигнатур) -Фунция ; 1 байт -GXT ключ имени ; 8 байт -Unknown ; 1 байт -Ведет в меню ; 1 байт ; номер -Константа = $00 ; 1 байт -X ; int 2 байта ; смещение на экране по X . -Y ; int 2 байта ; смещение на экране по Y . -PosType ; int 2 байта ; центрирование строки (центр,лево,право)
Offline
Обновленная иерархия 3D-объектов:
CPlaceable (vmt=0x863C40, size=0x18):
CCamera (vmt=0x8630E8)
CEntity (vmt=0x863928, size=0x38):
CBuilding (vmt=0x8585C8, size=0x38)
CTreadable (vmt=0x8639B0, size=0x38)
CDummy (vmt=0x8638C0, size=0x38)
CDummyObject (size=0x38)
CDummy_86C198 (unused)
CPhysical (vmt=0x863BA0, size=0x138)
CObject (vmt=0x866F60, size=0x17C)
CHand (vmt=0x866EE0, size=0x18C)
CProjectile (vmt=0x867030, size=0x17C)
CCutsceneObject (vmt=0x868A60, size=0x19C)
CPed (vmt=0x86C358)
CCivilianPed (vmt=0x86C0A8, size=0x79C)
CCopPed (vmt=0x86C120, size=0x7C4)
CEmergencyPed (vmt=0x86C200, size=0x79C)
CPlayerPed (vmt=0x86D168, size=0x7A4)
CVehicle (vmt=0x871E80)
CAutomobile (vmt=0x871120, size=0x988)
CHeli (vmt=0x871680, size=0xA18)
CMtruck (vmt=0x8717D8, size=0x99C)
CPlane (vmt=0x871948, size=0xA04)
CQuad (vmt=0x871AE8, size=0x9BC)
CTrailer (vmt=0x871C28, size=0x9F4)
CBike (vmt=0x871360, size=0x814)
CBmx (vmt=0x871528, size=0x838)
CBoat (size=0x8721A0, size=0x7E8)
CTrain (vmt=0x872370, size=0x6AC)
Немного пояснений:
CPlaceable - объект, у которого есть только позиция в пространстве и ничего больше. Размер нулевой, сам ничего не умеет
CEntity - базовый объект. Не подчиняется физическим законам. У него есть форма, но сам он либо нематериален (не имеет массы, не оказывает влияния на остальные объекты, неразрушаем), либо, наоборот, имеет бесконенечную массу, непреодолим для "нормальных" объектов и, по прежнему, неразрушаем.
CPhysical - объект, на который действует игровая физика. Для него обрабатываются коллизии, упругие соударения и т.д. Имеет массу и инерцию. Разрушаем.
CBuilding - типичный пример неизменяемого объекта
CTreadable - пока не разобрался. Так он называется в GTA3. Точно будет понятно, после окончания разборок с IPL.
CHand - объект с ID в диапазоне 394..397
CCutsceneObject - объект с ID в диапазоне 300..319
CProjectile - ракеты, запускаемые SAM-site. (По крайней мере, других мест, где он создается, я пока не нашел).
Остальное должно быть очевидно.
Last edited by listener (08-12-2007 17:42)
Offline
диапазоны VMT и некоторые методы (все числа - шестнадцатиричные, смещения - от начала VMT)
CPlaceable: (0..3) // 0..3 - т.е., первые четыре байта VMT CPlacement и любого его потомка.
+0 - destructor
CEntity: (4..57)
+0C - remove
+14 - setModelIndex
+18 - setModelIndexNoCreate
+1C - createRwObject
+20 - deleteRwObject
+24 - getBoundRect
+28 - processControl
+38 - teleport
+44 - preRender (не уверен точно, но очень похоже)
+48 - render
CPhysical: (58..5B)
CPed: (5C..67)
CVehicle: (5C..107)
+60 - processControlInput
+64 - getComponentWorldPosition
+68 - isComponentPresent
+A4 - blowUp
CAutomobile: (108..11B)
CBike: (108..10B)
Пример:
0x871360: __vt__CBike
0x871360+0xA4: указатель на CBike::blowUp
0x6BEA10: CBike::blowUp (CEntity * who, int);
Last edited by listener (09-12-2007 07:45)
Offline
Адреса Motion Blur
0x8D5104 - главный коэфициент блура (1 byte) .
0x8D5190 - Стпень блура №1
0x8D51A0 - Стпень блура №2
0x8D51B0 - Стпень блура №3
0x8D51C0 - Стпень блура №4
0x8D51D0 - Стпень блура №5
0x8D51E0 - Стпень блура №6
Структура `степени` :
Размер 16 bytes (0x10h) .
PlayerSpeed - (float, 4 bytes), скорость , которую должень достчиь игрок , чтобы параметры `степени` вступили в силу.
Stage Params:
Warp - (int, 4 bytes), искажение изображения
ObjectLoop - (int, 4 bytes), шлейф игровых объектов
CamShake - (int, 4 bytes), встряска камеры
Недоступность блура на самолетах , вертолетах , катерах итп
(player car struct+594h = car type) :00704DD1 8B8694050000 mov eax, dword ptr [esi+00000594] :00704DD7 83F804 cmp eax, 00000004 :00704DDA 0F8417010000 je 00704EF7 :00704DE0 83F803 cmp eax, 00000003 :00704DE3 0F840E010000 je 00704EF7 :00704DE9 83F805 cmp eax, 00000005 :00704DEC 0F8405010000 je 00704EF7 :00704DF2 83F806 cmp eax, 00000006 :00704DF5 0F84FC000000 je 00704EF7
San Andreas Motion Blur Advanced Tool :
топик на гтафорумс
http://www.gtaforums.com/index.php?showtopic=305432
Offline
Пара функций:
sub_56E580 - set_player_wasted sub_56E5D0 - set_player_busted
Устанавливают состояние переменной wasted_busted в структуре игрока (wasted = 1, busted = 2).
edit:
Функция
sub_52CD90 -> init_game_time
устанавливает текущее игровое время/дату как Четверг, 01 Января 12:00:00
несколько переменных:
byte_B70144 -> _isTimeSaved byte_B7014D -> _savedMonth byte_B7014C -> _savedMonthDay word_B70148 -> _savedSeconds byte_B7014E -> _currentWeekDay
edit2:
Функция
sub_55C0C0 -> init_stats
инициализирует статистику (задает начальные значения, читает AR_STATS.DAT , STATDISP.DAT)
8-байтовый буфер
dword_B78A00 -> _gxtLastMissionPassed dword_B78A04 -> _gxtLastMissionPassed_2nd_part
хранит gxt-ключ имени последней пройденной миссии
Last edited by AleX AciD (23-01-2008 09:34)
[large][acronym=Завтра, завтра, постоянно завтра, так проходит жизнь]Cras, cras, semper cras, sic evadit aetas[/acronym][/large]
Offline
Кто-нибудь может подсказать , где при создании машины идет привязка к ней хандлинга ? Я пишу на замену своему глючному Handling Adder'у новый Car Handling Hook ))
Хук ставил тут : 6B0BA2h, 6F2A2Bh, 6BF524h , не вышло , видимо есть еще какие-то адреса .
Offline
устанавливает текущее игровое время/дату как Четверг, 01 Января 12:00:00
.text:0052CDCA mov ds:Weekday, 4
вообще-то 4 - это среда 1 января 1992 года было средой (время начала игры). Кстати, внутриигровой год тоже високосный (в феврале 29 дней, см. 008CCF24 MonthsDays).
Offline
Кто-нибудь может подсказать , где при создании машины идет привязка к ней хандлинга ? Я пишу на замену своему глючному Handling Adder'у новый Car Handling Hook ))
Хук ставил тут : 6B0BA2h, 6F2A2Bh, 6BF524h , не вышло , видимо есть еще какие-то адреса .
0x6B0A90: CAutomobile::CAutomobile(short modelIndex, BYTE _a4, BYTE _a8);
получаем индекс в handlingData по индексу модели:
.text:006B0B22 0C8 mov ebp, _modelPtrs[eax*4] .text:006B0B29 0C8 movsx ecx, [ebp+CModelCars.handlingIndex] .text:006B0B2D 0C8 mov [esp+0C8h+id], ecx
и, дальше ...
.text:006B0B97 0D0 movzx eax, byte ptr [esp+0D0h+id] .text:006B0B9C 0D0 imul eax, 0E0h .text:006B0BA2 0D0 lea eax, handlingData.vehicleHandling.index[eax] ;; Устанавливаем ссылку на handling ... .text:006B0BA8 0D0 mov [esi+384h], eax .text:006B0BAE 0D0 mov eax, [eax+CHandlingVehicle.handlingFlags] .text:006B0BB4 0D0 add esp, 8 .text:006B0BB7 0C8 test eax, 10000h ;; ... флаги из handling ... .text:006B0BBC 0C8 mov [esi+38Ch], eax ;; ... проверяем, есть ли у машины гидравлика (сама проверка: .text:006B0BB7) ... .text:006B0BC2 0C8 jz short loc_6B0BDC .text:006B0BC4 0C8 call _rand .text:006B0BC9 0C8 test al, 3 .text:006B0BCB 0C8 jnz short loc_6B0BDC .text:006B0BCD 0C8 movzx ecx, _miHydralics .text:006B0BD4 0C8 push ecx .text:006B0BD5 0CC mov ecx, esi .text:006B0BD7 0CC call sub_6E3290 .text:006B0BDC loc_6B0BDC: ; CODE XREF: CAutomobile__constructor+132j .text:006B0BDC ; CAutomobile__constructor+13Bj ;; ... Пытаемся установить блок handling для летательного аппарата ;; (если этот кролик не предназначен для полетов, CHandlingData::getFlyingHandling просто вернет NULL) .text:006B0BDC 0C8 mov edx, [esp+0C8h+id] .text:006B0BE0 0C8 push edx ; id .text:006B0BE1 0CC mov ecx, offset handlingData .text:006B0BE6 0CC call CHandlingData__getFlyingHandling .text:006B0BEB 0C8 push 1 .text:006B0BED 0CC mov [esi+388h], eax
Аналогичные конструкции есть, в конструкторах CBike, CBoat и CPlane.
Искать по ссылкам на: .data:00C2B9C8 handlingData CHandlingData <?>
плюс, есть несколько (3..10) отдельных проверок для "гибридов" типа skimmer, которые обращаются напрямую в handlingData
Last edited by listener (24-01-2008 11:18)
Offline
вообще-то 4 - это среда 1 января 1992 года было средой (время начала игры). Кстати, внутриигровой год тоже високосный (в феврале 29 дней, см. 008CCF24 MonthsDays).
Точно, у них же неделя начинается с воскресенья
Несколько функций:
sub_50BD40 -> camera_set_behind_player // поставить камеру за игроком sub_50BD70 -> camera_set_before_player // поставить камеру перед игроком sub_4414C0 -> time_increase_by_minutes // добавить X минут к текущему времени
PS:
Мне кажется, или это жестко запрограммированый "вылет" из игры?
.text:00484BD6 xor eax, eax .text:00484BD8 or byte ptr [eax+1Eh], 4
[large][acronym=Завтра, завтра, постоянно завтра, так проходит жизнь]Cras, cras, semper cras, sic evadit aetas[/acronym][/large]
Offline
2AleX AciD:
Кажется. Вернее, почти кажется.
Если посмотреть на конструкцию в целом, видим следующее:
.text:00484BC0 168 test eax, eax .text:00484BC2 168 jz short loc_484BD6 .text:00484BC4 168 mov eax, [eax] .text:00484BC6 168 or byte ptr [eax+1Eh], 4 .text:00484BCA 168 call sub_566C10 .text:00484BCF 168 xor al, al .text:00484BD1 168 jmp loc_48569B .text:00484BD6 ; --------------------------------------------------------------------------- .text:00484BD6 .text:00484BD6 loc_484BD6: ; CODE XREF: _opcode_handler_09+FF2j .text:00484BD6 168 xor eax, eax .text:00484BD8 168 or byte ptr [eax+1Eh], 4 .text:00484BDC 168 call sub_566C10 .text:00484BE1 168 xor al, al .text:00484BE3 168 jmp loc_48569B
Т.е., две идентичные конструкции, в одной из которых eax принудительно обнуляется.
Что же произойдет, если мы войдем в начало всей этой конструкции, имея eax равный нулю?
Посмотрим на начало функции:
text:00483BD0 000 push 0FFFFFFFFh .text:00483BD2 004 mov eax, large fs:0 .text:00483BD8 004 push offset _eh_handler_483bd0 .text:00483BDD 008 push eax .text:00483BDE 00C mov eax, [esp+0Ch+arg_0] .text:00483BE2 00C mov large fs:0, esp
вполне предсказуемо, что в начале функции устанавливается обработчик исключения. Опуская все EHINFO, которые в нем описаны, при выполнении команды в 0x484BD8 выполнится что-то вроде (я не смотрел, какой именно хэндлер соответствует указанному адресу, а их там восемь штук)
.text:008383DC 000 mov eax, [ebp-144h] .text:008383E2 000 push eax .text:008383E3 004 call VehiclePool__release .text:008383E8 004 pop ecx
после чего управление перейдет ка обработчику исключения в функции уровнем выше. В какой-то момент, скорее всего, мы вернемся обратно в игру (в конкретном случае - остановив thread, в котором произошла ошибка).
Т.е., подводя итог, так в коде выглядит __throw.
Last edited by listener (26-01-2008 00:46)
Offline
Мои 2 цента:
0x514970 - метода класса СViewport (0xB6F028), который записывает в буфер координаты площади прицеливания.
.text:00514970 ; int __cdecl CViewport__gettargetarea(float targetrange,float x,float y,float z,int* ll_corner,int* ur_corner)
1 параметр - максимальное расстояние до точки прицеливания (см. weapon.dat).
2, 3, 4 - координаты точки отуда ведется прицеливание (позиция актера/игрока)
5 - указатель на буфер, в который будут записаны координаты нижнего левого угла площади прицеливания
6 - указатель на буфер, в который будут записаны координаты верхнего правого угла площади прицеливания
Грубо говоря, линия между этими двумя углами - это траектория полета пули. Длина траектории равна 1 параметру. Координаты в первом буфере - место вылета пули. Координаты во втором буфере - это примерная точка, куда она попадет (туда же направлен и прицел).
Буфер должен быть размером в 12 байтов, чтобы хранить 3 переменные XYZ.
Вот как можно применить это в коде:
029B: 28@ = init_object 1224 at 2480.562 -1666.865 12.8757 // создаем ящик while true wait 0 00A0: store_actor $PLAYER_ACTOR position_to 0@ 1@ 2@ // записываем начальные координаты // {$13-$15} {$16-$18} {z} {y} {x} {target range} 0AA6: call_method 0x514970 struct 0xB6F028 num_params 6 pop 0 0xA49994 0xA499A0 2@ 1@ 0@ 20.0 // вызываем метод. буфер - это группы глоб. переменных 01BC: put_object 28@ at $13 $14 $15 // перемещаем ящик в точку прицеливания end
Есть еще другая, не менее интересная процедура
0056BA00
Она среди параметров принимает указанные выше 2 буфера и проверяет, есть ли на линии прицеливания прохожий. Если да, то результат функции = True, а первый параметр содержит указатель на этого прохожего (над ним рисуется зеленый треугольник).
Сама функция имеет кучу параметров, и я подозреваю, что проверять на прицеливание можно не только актеров, но и другие виды объектов.
Offline
listner написал :
0x6B0A90: CAutomobile::CAutomobile(short modelIndex, BYTE _a4, BYTE _a8);
получаем индекс в handlingData по индексу модели:
Код:
.text:006B0B22 0C8 mov ebp, _modelPtrs[eax*4]
.text:006B0B29 0C8 movsx ecx, [ebp+CModelCars.handlingIndex]
.text:006B0B2D 0C8 mov [esp+0C8h+id], ecx
и, дальше ...
Код:
.text:006B0B97 0D0 movzx eax, byte ptr [esp+0D0h+id]
.text:006B0B9C 0D0 imul eax, 0E0h
.text:006B0BA2 0D0 lea eax, handlingData.vehicleHandling.index[eax]
;; Устанавливаем ссылку на handling ...
.text:006B0BA8 0D0 mov [esi+384h], eax
.text:006B0BAE 0D0 mov eax, [eax+CHandlingVehicle.handlingFlags]
.text:006B0BB4 0D0 add esp, 8
.text:006B0BB7 0C8 test eax, 10000h
;; ... флаги из handling ...
.text:006B0BBC 0C8 mov [esi+38Ch], eax
;; ... проверяем, есть ли у машины гидравлика (сама проверка: .text:006B0BB7) ...
.text:006B0BC2 0C8 jz short loc_6B0BDC
.text:006B0BC4 0C8 call _rand
.text:006B0BC9 0C8 test al, 3
.text:006B0BCB 0C8 jnz short loc_6B0BDC
.text:006B0BCD 0C8 movzx ecx, _miHydralics
.text:006B0BD4 0C8 push ecx
.text:006B0BD5 0CC mov ecx, esi
.text:006B0BD7 0CC call sub_6E3290
.text:006B0BDC loc_6B0BDC: ; CODE XREF: CAutomobile__constructor+132j
.text:006B0BDC ; CAutomobile__constructor+13Bj
;; ... Пытаемся установить блок handling для летательного аппарата
;; (если этот кролик не предназначен для полетов, CHandlingData::getFlyingHandling просто вернет NULL)
.text:006B0BDC 0C8 mov edx, [esp+0C8h+id]
.text:006B0BE0 0C8 push edx ; id
.text:006B0BE1 0CC mov ecx, offset handlingData
.text:006B0BE6 0CC call CHandlingData__getFlyingHandling
.text:006B0BEB 0C8 push 1
.text:006B0BED 0CC mov [esi+388h], eax
Аналогичные конструкции есть, в конструкторах CBike, CBoat и CPlane.
Искать по ссылкам на: .data:00C2B9C8 handlingData CHandlingData <?>плюс, есть несколько (3..10) отдельных проверок для "гибридов" типа skimmer, которые обращаются напрямую в handlingData
Тоесть получается , что для изменения хандлинга автомобиля на свой достаточно в
.text:006B0BA8 0D0 mov [esi+384h], eax
вместо eax подать указатель на свою структуру хандлинга ?
Last edited by Alexander (28-01-2008 14:09)
Offline