You are not logged in.
Pages: 1
Возникло несколько вопросов:
1. Как определить, каким опкодом надо вызывать конкретную функцию: 0AA6, 0AA7 или 0AA8 ?
2. Как определить, сколько параметров передаётся в функцию и сколько возвращается ?
3. В меню программы есть Debugger. Каково его назначение ?
4. Чем адреса rdata отличаются от data ?
Offline
1, 2. Для начала, стоит посмотреть вот это: http://sannybuilder.com/forums/viewtopic.php?id=159
Оно недописано, но общие принципы там объясняются.
3. Просто отладчик. Возможность запустить программу непосредственно из-под ida, и помотреть состояние/исполнение с учетом описанных имен и структур.
4. rdata - сегмент констант (read-only data). Не изменяется при работе программы.
Offline
Вроде стало понятно: для __cdecl и __stdcall надо применять опкоды вызова функций 0AA5 / 0AA7, а для __thiscall (методов) применяются опкоды 0AA6 / 0AA8. Если в коде функции используется значение из регистра ECX, но перед этим в него ничего не было записано, то это - признак метода.
Новые вопросы:
1.В начале многих функций описана структура переменных (stack frame). По моим наблюдениям, передаваемые в функцию параметры, находятся в переменных, имеющих положительное смещение от начала структуры. Этот признак выполняется для всех функций?
2.Что значит dd, db ?
3.Куда записывается результат вызова функции при её вызове из другой функции?
Last edited by Den_spb (09-07-2010 21:07)
Offline
1) Правильное наблюдение. Часть локальных переменных функции - та, что была положена на стек до вызова функции, - находятся ниже адреса возврата (параметры). А та часть, что была создана в самой функции - в специально зарезервированном для этого буфере на стеке - выше адреса возврата. Попробуй обратить внимание на инструкцию sub esp, ... в начале функции и add esp, ... в конце.
2) команда ассемблера, выделяющая данные
xmmword - data octaword (double qword) (16 байтов),
dt - data tbyte (10 байтов),
dq - data qword (8 байтов),
dd - data dword (4 байта),
dw - data word (2 байта),
db - data byte (1 байт).
Eсли после этой инструкции стоит знак вопроса, значит эти данные неинициализированные. А если конкретное значение данной ячейки памяти, то инициализированные.
3) Это зависит от типа возвращаемого значения:
Для функций возвращающих int (unsigned int) или любой указатель в 32-битном режиме - в eax,
для функций, возвращающих short (unsigned short) - в ax,
для функций, возвращающих long long (__int64, unsigned long long) или любой указатель в 64-битном режиме - в 32-битном режиме: нижняя часть в eax, верхняя - в edx. В 64-битном режиме - в rax.
для функций, возвращающих char (unsigned char), а также bool - в al.
для функций, возвращающих дробное (float, double, long double) - в st(0).
Last edited by Alien (10-07-2010 04:25)
Offline
@ Den_spb
Объясни пожалуйста как ты находил в базе смещения для компонентов модели. Желательно подробнее, а то ничего не понятно.
Offline
listener, не можешь вкратце рассказать, что такое RpClump? Или это то же, что и RwClump?
Plugin-SDK https://github.com/DK22Pac/plugin-sdk
Discord-сервер по plugin-sdk и программированию в GTA
RU https://discord.gg/QEesDGb
ENG https://discord.gg/zaVqFQv
Offline
@DK22Pac -
Ну, учитывая, что RwClump - это опечатка, не одно и то же.
В RenderWare, почти все реализовано через плагины. С префиксом Rp идут вещи, которые обрабатываются плагинами.
Поэтому, RpClump и RpAtomic.
RwFrame, в отличие от них, системный объект, поэтому префикс у него Rw.
Плагин можно полностью заменить, а системные объекты - только дополнить, не меняя уже определенной структуры.
Offline
На сколько правильно я понял из названия, функция возвращает номер стоящей на транспорте экстры.
.text:004C8040 CModelData__getCarVariation1 proc near
Подскажите пожалуйста, как правильно получить это значение?
Offline
В клео-скриптах функции и методы вызываются с помощью опкодов:
0AA5 - вызов функции.
0AA6 - вызов метода.
0AA7 - вызов функции с записью результирующего значения функции в переменную.
0AA8 - вызов метода с записью результирующего значения метода в переменную.
Рассмотрим функцию 0x4C8040 с учётом изложенного в первых четырёх сообщениях темы:
1.Определяем, является ли функция методом
Смотрим начало кода функции:
.text:004C8040 000 mov al, _carNextVariation1 .text:004C8045 000 sub esp, 1Ch ; Integer Subtraction .text:004C8048 01C push ebx .text:004C8049 020 or ebx, 0FFFFFFFFh ; Logical Inclusive OR .text:004C804C 020 cmp al, 0FEh ; Compare Two Operands .text:004C804E 020 push esi .text:004C804F 024 mov esi, ecx
Команда mov esi, ecx копирует значение из регистра ecx в регистр esi. Перед этим в данной функции в регистр ecx ничего не записывалось. Отсюда делаем вывод, что данная функция является методом (в методах один из параметров - указатель на структуру - передаётся в регистре ecx).
2.Определяем количество передаваемых параметров
Структура переменных состоит из двух переменных var_1C и var_18:
var_1C= dword ptr -1Ch var_18= dword ptr -18h
Так как смещения всех переменных структуры - отрицательные (-0x1C и -0x18), то делаем вывод, что в данную функцию не передаётся параметров (кроме указателя на структуру, передаваемого в регистре ecx).
В скрипте вызов данного метода будет осуществляться так:
0AA8: call_function_method 0x4C8040 struct $CModel num_params 0 pop 0 $Result
Last edited by Den_spb (18-04-2011 17:04)
Offline
Денис, спасибо. Такой вариант я тоже пробывал (хотя может я, что-то неправильно сделал).
{$CLEO .cs} 0000: while true wait 0 if Player.Defined($PLAYER_CHAR) then if Actor.Driving($PLAYER_ACTOR) then 03C0: 0@ = actor $PLAYER_ACTOR car 0A97: 0@ = car 0@ struct 0@ += 0x22 0A8D: 0@ = read_memory 0@ size 2 virtual_protect 0 //model index 0@ *= 4 0@ += 0xA9B0C8 0A8D: 0@ = read_memory 0@ size 4 virtual_protect 0 //CModel 0AA8: call_function_method 0x4C8040 struct 0@ num_params 0 pop 0 1@ 03F0: enable_text_draw 1 045A: draw_text_1number 5.0 20.0 GXT 'NUMBER' number 1@ end end end
Дело в том, что выводится не номер стоящей на транспорте экстры, а показываются все значения поочерёдно от -1 до 5 (если экстр у данной модели 6). Т.е. перебираются все возможные варианты. Значит я неправильно понял назначение данной функции (метода). Есть ещё
.text:004C8120 CModelData__getCarVariation2 proc near
Тут всё время выводится -1.
Может всё же я, что-то не так сделал? А если всё правильно, то как тогда узнать номер стоящей на трастпорте экстры. Может есть способ? Ведь при сохранении транспорта в гараже это (номер экстры) учитывается.
Offline
Дело в том, что выводится не номер стоящей на транспорте экстры, а показываются все значения поочерёдно от -1 до 5 (если экстр у данной модели 6).
Евгений, структура CModel не относится к конкретному транспортному средству - она общая для всех транспортных средств с определённой моделью. Других параметров в данный метод не передаётся - отсюда можно сделать вывод, что вычислить номер экстры конкретной машины этот метод не может.
На самом деле данный метод применяется для определения номера экстры, которая будет установлена на следующем создаваемом транспортном средстве с данной моделью.
А если всё правильно, то как тогда узнать номер стоящей на трастпорте экстры.
Посмотрел процедуры, ссылающиеся на значения _carCurrentVariation1 и _carCurrentVariation2, нашёл такой код:
.text:006D6A40 CVehicle__setModelIndex proc near ; CODE XREF: CAutomobile__setModelIndex+9p .text:006D6A40 ; CAutomobile__constructor+E7p .text:006D6A40 ; CBike__setModelIndex+9p .text:006D6A40 ; CBike__constructor+C2p ... .text:006D6A40 .text:006D6A40 arg_0 = dword ptr 0Ch .text:006D6A40 .text:006D6A40 000 push esi .text:006D6A41 004 push edi .text:006D6A42 008 mov edi, [esp+arg_0] .text:006D6A46 008 push edi .text:006D6A47 00C mov esi, ecx .text:006D6A49 00C call CEntity__setModelIndex ; setModelIndexNoCreate (_a0); createRwObject (); .text:006D6A4E 008 mov eax, _modelPtrs[edi*4] .text:006D6A55 008 push eax .text:006D6A56 00C mov ecx, esi .text:006D6A58 00C call sub_6D10E0 ; Call Procedure .text:006D6A5D 008 mov cl, _carCurrentVariation1 .text:006D6A63 008 mov [esi+438h], cl .text:006D6A69 008 mov dl, _carCurrentVariation2 .text:006D6A6F 008 push edi .text:006D6A70 00C mov [esi+439h], dl
Попробуй прочитать значения, записанные по смещениям 0x438 и 0x439 в структуре машины. Размер чтения в обоих случаях - 1 байт.
Last edited by Den_spb (19-04-2011 17:35)
Offline
Вот это то, что нужно.:^ Большое спасибо.
Offline
Здравствуйте! У меня такой вопрос:
Опкод 0394: play_music %1d%
Где в этом коде определяется, что проиграть нужно именно звук миссии, мобильника и т.д.?
.text:004594EF opcode_0394: .text:004594EF 218 lea eax, [ebp+10h] .text:004594F2 218 mov ecx, ebp .text:004594F4 218 push 1 .text:004594F6 21C push eax .text:004594F7 220 call CScriptThread__getNumberParams .text:004594FC 218 mov ecx, offset _audio .text:00459501 218 push 0 .text:00459503 21C call CAudio__StopMusic .text:00459508 218 mov eax, ds:opcodeParams .text:0045950D 218 mov ecx, offset _audio .text:00459512 218 add eax, 64h .text:00459515 218 push 0 .text:00459517 21C push eax .text:00459518 220 call CAudio__PlayMusic .text:0045951D 218 xor al, al .text:0045951F 218 add esp, 208h .text:00459525 010 pop ebp .text:00459526 00C pop edi .text:00459527 008 pop esi .text:00459528 004 pop ebx .text:00459529 000 retn 4
Offline
Где в этом коде определяется, что проиграть нужно именно звук миссии, мобильника и т.д.?
.text:00459508 218 mov eax, ds:opcodeParams
Здесь, как я думаю, происходить запись параметра опкода (ID звука) в регистр eax. Далее это значение "ложится" на стек, и вызывается метод _PlayMusic.
Plugin-SDK https://github.com/DK22Pac/plugin-sdk
Discord-сервер по plugin-sdk и программированию в GTA
RU https://discord.gg/QEesDGb
ENG https://discord.gg/zaVqFQv
Offline
Offline
Просьба разъяснить передаваемые параметры и их порядок передачи в следующие процедуры
.text:007F1010 ; RwFrame *__cdecl RwFrameRotate(RwFrame *frame, RwV3D *axis, float angle, int combine) .text:007F1010 frame = dword ptr 4 .text:007F1010 axis = dword ptr 8 .text:007F1010 angle = dword ptr 0Ch .text:007F1010 combine = dword ptr 10h .text:007F0ED0 ; RwFrame *__cdecl RwFrameScale(RwFrame *frame, RwV3D *v, int combine) .text:007F0ED0 frame = dword ptr 4 .text:007F0ED0 v = dword ptr 8 .text:007F0ED0 combine = dword ptr 0Ch .text:007F0F70 ; RwFrame *__cdecl RwFrameTransform(RwFrame *frame, RwMatrix *m, int combine) .text:007F0F70 frame = dword ptr 4 .text:007F0F70 m = dword ptr 8 .text:007F0F70 combine = dword ptr 0Ch .text:007F0E30 ; RwFrame *__cdecl RwFrameTranslate(RwFrame *frame, RwV3D *v, int combine) .text:007F0E30 frame = dword ptr 4 .text:007F0E30 v = dword ptr 8 .text:007F0E30 combine = dword ptr 0Ch .text:007F0DC0 ; RwFrame *__cdecl RwFrameForAllChildren(RwFrame *frame, int callback, void *data) .text:007F0DC0 frame = dword ptr 0Ch .text:007F0DC0 callback = dword ptr 10h .text:007F0DC0 data = dword ptr 14h
axis, combine, v, m (матрица? смещение на неё +10 или +50?), callback, data - что это за параметры?
Offline
kenking, разве из самого названия функций не понятно, для чего они предназначены?
Rotate - вращение, scale - масштабирование, transform - трансформация (вроде бы перенос из одной системы координат в другую), translate - перемещение, forAllChildern - для всех потомков (применение функции для всех потомков фрейма).
Вот кстати выдержка из справки.
RwFrame objects contain two matrices. These are the Local Transformation Matrix (or LTM), and the Modeling Matrix. These two matrices can be retrieved using RwFrameGetLTM() and RwFrameGetMatrix(), respectively.
When transformations are performed on a frame (see next paragraph), it is the Modeling Matrix that is affected. (The LTM describes the total transformation from Object Space to World Space.) Unless the Frame
belongs to a hierarchy, the Modeling and Local Transformation Matrices are identical. Otherwise, the Modeling Matrix is relative to the Frame's parent.
Frames can be transformed using RwFrameTranslate(), RwFrameRotate(), RwFrameScale() and RwFrameTransform(). Rotation and scaling is accrued in the top-left 3x3 sub-matrix, while translation is accumulated in the bottom row.
Given a transformation matrix, individual points and vectors (both of type RwV3d) can be transformed using RwV3dTransformPoints() and RwV3dTransformVectors().
Вызываются все как __cdecl, через 0AA5:, по поводу параметров -
axis - вектор, представляющий ось, вокруг которой происходит вращение (например (0.0, 1.0, 0.0) - вращение вокруг Y-оси).
v - вектор.
m - матрица трансформации.
callback - фунция, которая применяется ко всем потомкам фрейма.
data - любая информация, которую надо передать в функцию - коллбэк.
combine - порядок трансформации:
Matrix and frame transformation functions in RenderWare Graphics (for example, RwFrameTransform()and RwMatrixRotate()) take a parameter, combineOp. This parameter is used to control the order in which the transform is applied to the matrix or Frame.
The available combine operators are: replace, pre-concatenate, and postconcatenate.
• rwCOMBINEREPLACE assigns the new transformation to the matrix. The original contents of the matrix are entirely replaced by the new transform. RwMatrixTranslate(M, t, rwCOMBINEREPLACE) builds a new matrix containing only a translation, and stores this matrix in M. Any rotation component in the matrix M is overwritten with a 3x3 identity sub-matrix. This is true for all matrix-transforming functions where
the rwCOMBINEREPLACE flag is used.
• rwCOMBINEPRECONCAT causes the transform matrix to be preconcatenated onto the matrix. This has the effect of applying the transformation before the transformation already in the matrix. Put another way: this operator causes the transformation to be made in object space (or the coordinate space of the matrix).
• rwCOMBINEPOSTCONCAT instructs RenderWare Graphics to postmultiply the transformation into the matrix. The new transformation will take effect after the transform already in the matrix. In other
words, the transformation takes place in world space.
enum RwOpCombineType { rwCOMBINEREPLACE = 0, rwCOMBINEPRECONCAT = 1, rwCOMBINEPOSTCONCAT = 2 };
Last edited by DK22Pac (01-08-2013 13:37)
Plugin-SDK https://github.com/DK22Pac/plugin-sdk
Discord-сервер по plugin-sdk и программированию в GTA
RU https://discord.gg/QEesDGb
ENG https://discord.gg/zaVqFQv
Offline
kenking, разве из самого названия функций не понятно, для чего они предназначены?
Вопрос был не в том для чего они предназначены (из названий, действительно, это понятно). Вопрос был:
Просьба разъяснить передаваемые параметры и их порядок передачи в следующие процедуры
Вот кстати выдержка из справки.
Всю справку, где взять?
по поводу параметров -
axis - вектор, представляющий ось, вокруг которой происходит вращение (например (0.0, 1.0, 0.0) - вращение вокруг Y-оси).
v - вектор.
m - матрица трансформации.
callback - фунция, которая применяется ко всем потомкам фрейма.
data - любая информация, которую надо передать в функцию - коллбэк.
combine - порядок трансформации
Спасибо за пояснения, но, что-то у меня не получается правильно вызвать эти процедуры.
Пример правильного вызова был бы очень кстати.
Offline
Вот несколько примеров.
{$CLEO} // axis 1@ = 0.0 // X 2@ = 0.0 // Y 3@ = 1.0 // Z while true wait 0 {$I forplayercar} 0A97: 0@ = car veh struct 0@ += 0x678 // bump_front_dummy 0A8D: 0@ = read_memory 0@ size 4 virtual_protect 0 if 0@ <> 0 then 0AA5: call {RwFrameRotate} 0x7F1010 num_params 4 pop 4 _combine 2 _angle+= 1.0 _axis 1@v _frame 0@ end {$I for_end} end
{$CLEO} // scale 1@ = 2.0 // X 2@ = 2.0 // Y 3@ = 2.0 // Z while true wait 0 {$I forplayercar} 0A97: 0@ = car veh struct 0@ += 0x678 // bump_front_dummy 0A8D: 0@ = read_memory 0@ size 4 virtual_protect 0 if 0@ <> 0 then 0AA5: call {RwFrameScale} 0x7F0ED0 num_params 3 pop 3 _combine 2 _v 1@v _frame 0@ 0A93: end_custom_thread end {$I for_end} end
Plugin-SDK https://github.com/DK22Pac/plugin-sdk
Discord-сервер по plugin-sdk и программированию в GTA
RU https://discord.gg/QEesDGb
ENG https://discord.gg/zaVqFQv
Offline
Спасибо.
Offline
Подскажите пожалуйста, как сделать, чтобы в коде функции вместо названия констант было бы само значение константы. Например, адрес (GTA3)
.data:006107AC flt_6107AC dd 2.0
в коде функции записано так
.text:00585753 fadd flt_6107AC
Как сделать, чтоб вместо flt_6107AC показывалось само значение 2.0? Или хотя бы в псевдокоде выводилось само значение?
IDA 6.8 (если это имеет значение)
Offline
Pages: 1