#1 06-07-2010 09:16

Den_spb
From: Ленинград
Registered: 23-11-2008
Posts: 941
Website

Вопросы по IDA

Возникло несколько вопросов:
1. Как определить, каким опкодом надо вызывать конкретную функцию: 0AA6, 0AA7 или 0AA8 ?
2. Как определить, сколько параметров передаётся в функцию и сколько возвращается ?
3. В меню программы есть Debugger. Каково его назначение ?
4. Чем адреса rdata отличаются от data ?

Offline

#2 06-07-2010 11:09

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

Re: Вопросы по IDA

1, 2. Для начала, стоит посмотреть вот это: http://sannybuilder.com/forums/viewtopic.php?id=159
Оно недописано, но общие принципы там объясняются.

3. Просто отладчик. Возможность запустить программу непосредственно из-под ida, и помотреть состояние/исполнение с учетом описанных имен и структур.

4. rdata - сегмент констант (read-only data). Не изменяется при работе программы.

Offline

#3 09-07-2010 20:56

Den_spb
From: Ленинград
Registered: 23-11-2008
Posts: 941
Website

Re: Вопросы по IDA

Вроде стало понятно: для __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

#4 10-07-2010 04:20

Alien
Registered: 12-10-2008
Posts: 564

Re: Вопросы по IDA

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

#5 25-03-2011 13:22

kenking
From: Казахстан
Registered: 28-06-2010
Posts: 253

Re: Вопросы по IDA

@ Den_spb
Объясни пожалуйста как ты находил в базе смещения для компонентов модели. Желательно подробнее, а то ничего не понятно. blush

Offline

#6 26-03-2011 02:56

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

Re: Вопросы по IDA

@Den_spb - Про RwFrame (RpClump, RpAtomic и т.д.) лучше почитать доки по RenderWare.

Offline

#7 26-03-2011 16:24

DK22Pac
From: Ukraine
Registered: 26-03-2010
Posts: 447
Website

Re: Вопросы по IDA

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

#8 12-04-2011 20:53

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

Re: Вопросы по IDA

@DK22Pac -
Ну, учитывая, что RwClump - это опечатка, не одно и то же.
В RenderWare, почти все реализовано через плагины. С префиксом Rp идут вещи, которые обрабатываются плагинами.
Поэтому, RpClump и RpAtomic.

RwFrame, в отличие от них, системный объект, поэтому префикс у него Rw.

Плагин можно полностью заменить, а системные объекты - только дополнить, не меняя уже определенной структуры.

Offline

#9 18-04-2011 06:21

kenking
From: Казахстан
Registered: 28-06-2010
Posts: 253

Re: Вопросы по IDA

На сколько правильно я понял из названия, функция возвращает номер стоящей на транспорте экстры.

.text:004C8040     CModelData__getCarVariation1 proc near

Подскажите пожалуйста, как правильно получить это значение?

Offline

#10 18-04-2011 16:58

Den_spb
From: Ленинград
Registered: 23-11-2008
Posts: 941
Website

Re: Вопросы по IDA

В клео-скриптах функции и методы вызываются с помощью опкодов:
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

#11 19-04-2011 07:04

kenking
From: Казахстан
Registered: 28-06-2010
Posts: 253

Re: Вопросы по IDA

Денис, спасибо. Такой вариант я тоже пробывал (хотя может я, что-то неправильно сделал).

{$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

#12 19-04-2011 17:31

Den_spb
From: Ленинград
Registered: 23-11-2008
Posts: 941
Website

Re: Вопросы по IDA

Дело в том, что выводится не номер стоящей на транспорте экстры, а показываются все значения поочерёдно от -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

#13 20-04-2011 06:43

kenking
From: Казахстан
Registered: 28-06-2010
Posts: 253

Re: Вопросы по IDA

Вот это то, что нужно.:^ Большое спасибо.

Offline

#14 23-04-2011 23:43

hack_death
Registered: 15-07-2009
Posts: 10

Re: Вопросы по IDA

Здравствуйте! У меня такой вопрос:
Опкод 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

673028.gif

Offline

#15 24-04-2011 21:59

DK22Pac
From: Ukraine
Registered: 26-03-2010
Posts: 447
Website

Re: Вопросы по IDA

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

.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

#16 23-03-2012 00:23

VintProg_Pro
Registered: 17-06-2010
Posts: 153

Re: Вопросы по IDA

Можно по подробней?

Offline

#17 23-06-2013 12:34

kenking
From: Казахстан
Registered: 28-06-2010
Posts: 253

Re: Вопросы по IDA

Просьба разъяснить передаваемые параметры и их порядок передачи в следующие процедуры

.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

#18 01-08-2013 13:34

DK22Pac
From: Ukraine
Registered: 26-03-2010
Posts: 447
Website

Re: Вопросы по IDA

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

#19 02-08-2013 06:31

kenking
From: Казахстан
Registered: 28-06-2010
Posts: 253

Re: Вопросы по IDA

DK22Pac wrote:

kenking, разве из самого названия функций не понятно, для чего они предназначены?

Вопрос был не в том для чего они предназначены (из названий, действительно, это понятно). Вопрос был:

kenking wrote:

Просьба разъяснить передаваемые параметры и их порядок передачи в следующие процедуры

DK22Pac wrote:

Вот кстати выдержка из справки.

Всю справку, где взять? 

DK22Pac wrote:

по поводу параметров -
axis - вектор, представляющий ось, вокруг которой происходит вращение (например (0.0, 1.0, 0.0) - вращение вокруг Y-оси).
v - вектор.
m - матрица трансформации.
callback - фунция, которая применяется ко всем потомкам фрейма.
data - любая информация, которую надо передать в функцию - коллбэк.
combine - порядок трансформации

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

Offline

#20 02-08-2013 09:52

DK22Pac
From: Ukraine
Registered: 26-03-2010
Posts: 447
Website

Re: Вопросы по IDA

Вот несколько примеров.

{$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

#21 02-08-2013 14:34

kenking
From: Казахстан
Registered: 28-06-2010
Posts: 253

Re: Вопросы по IDA

Спасибо.

Offline

#22 24-12-2017 09:44

kenking
From: Казахстан
Registered: 28-06-2010
Posts: 253

Re: Вопросы по IDA

Подскажите пожалуйста, как сделать, чтобы в коде функции вместо названия констант было бы само значение константы. Например, адрес (GTA3) 

.data:006107AC flt_6107AC      dd 2.0

в коде функции записано так

.text:00585753                 fadd    flt_6107AC

Как сделать, чтоб вместо flt_6107AC показывалось само значение 2.0? Или хотя бы в псевдокоде выводилось само значение?
IDA 6.8 (если это имеет значение)

Offline

#23 12-11-2021 20:20

Den_spb
From: Ленинград
Registered: 23-11-2008
Posts: 941
Website

Re: Вопросы по IDA

Так смысл команды не "прибавить 2.0", а "прибавить значение, хранящееся по адресу 006107AC". Наверное такой опции нет - чтобы дополнительную нагрузку на программу не создавать и пользователя не путать.

Offline

Board footer

Powered by FluxBB