Форум программистов, компьютерный форум, киберфорум
Наши страницы
Assembler, MASM, TASM
Войти
Регистрация
Восстановить пароль
 
Kadet89
2 / 2 / 0
Регистрация: 18.09.2009
Сообщений: 107
1

Получить указатель на строку из ассемблерного кода

09.11.2013, 20:20. Просмотров 392. Ответов 0
Метки нет (Все метки)

Имеется dll библиотека без исходников, только отдельные куски кода от ее старой версии. В библиотеке вызывается функция и я ее хукаю. Код, который меня интересует приблизительно выглядит так (исходник старой версии):
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
void CollisionBSPData_LoadDispInfo( CCollisionBSPData *pBSPData )
{
......
        if( pTex->texdata >= 0 )
        {
            IMaterial *pMaterial = materialSystemInterface->FindMaterial( pBSPData->map_surfaces[pTex->texdata].name, &bFound, true );
            if ( bFound )
            {
                IMaterialVar *pVar;
                bool bVarFound;
                pVar = pMaterial->FindVar( "$surfaceprop", &bVarFound, false );
                if ( bVarFound )
                {
                    const char *pProps = pVar->GetStringValue();
                    pDispTree->SetSurfaceProps( physprop->GetSurfaceIndex( pProps ) );
                }
 
                pVar = pMaterial->FindVar( "$surfaceprop2", &bVarFound, false );
                if ( bVarFound )
                {
                    const char *pProps = pVar->GetStringValue();
                    pDispTree->SetSurfaceProps2( physprop->GetSurfaceIndex( pProps ) );
                }
            }
        }
    }
}
При вызове этой функции мне необходимо получить указатель pVar или pProps. Хук происходит на строке с "$surfaceprop2" (.text:10123195).

Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
.text:10123148 68 C4 26 32 10                          push    offset aSurfaceprop ; "$surfaceprop"
.text:1012314D 8B CF                                   mov     ecx, edi
.text:1012314F FF D2                                   call    edx
.text:10123151 80 7D FF 00                             cmp     [ebp+var_1], 0
.text:10123155 74 33                                   jz      short loc_1012318A
.text:10123157 8B 10                                   mov     edx, [eax]
.text:10123159 8B C8                                   mov     ecx, eax
.text:1012315B 8B 42 18                                mov     eax, [edx+18h]
.text:1012315E FF D0                                   call    eax
.text:10123160 8B 0D B0 70 61 10                       mov     ecx, dword_106170B0
.text:10123166 8B 11                                   mov     edx, [ecx]
.text:10123168 89 45 D8                                mov     [ebp+var_28], eax
.text:1012316B 50                                      push    eax
.text:1012316C 8B 42 0C                                mov     eax, [edx+0Ch]
.text:1012316F FF D0                                   call    eax
.text:10123171 66 89 46 6C                             mov     [esi+6Ch], ax
.text:10123175 8B 0D B0 70 61 10                       mov     ecx, dword_106170B0
.text:1012317B 8B 11                                   mov     edx, [ecx]
.text:1012317D 8B 45 D8                                mov     eax, [ebp+var_28]
.text:10123180 8B 52 0C                                mov     edx, [edx+0Ch]
.text:10123183 50                                      push    eax
.text:10123184 FF D2                                   call    edx
.text:10123186 66 89 46 6E                             mov     [esi+6Eh], ax
.text:1012318A
.text:1012318A                         loc_1012318A:                           ; CODE XREF: sub_10122A50+705j
.text:1012318A 8B 07                                   mov     eax, [edi]
.text:1012318C 8B 50 2C                                mov     edx, [eax+2Ch]
.text:1012318F 6A 00                                   push    0
.text:10123191 8D 4D FF                                lea     ecx, [ebp+var_1]
.text:10123194 51                                      push    ecx
.text:10123195 68 9C 29 32 10                          push    offset aSurfaceprop2 ; "$surfaceprop2"
Также имеется псевдокод:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
                    if ( !(unsigned __int8)(*(int (__thiscall **)(int))(*(_DWORD *)v63 + 168))(v63) )
                    {
                      v64 = (*(int (__thiscall **)(int, _DWORD, char *, _DWORD))(*(_DWORD *)v63 + 44))(v63,"$surfaceprop",&v140,0);
                      if ( v140 )
                      {
                         v65 = (*(int (__thiscall **)(int))(*(_DWORD *)v64 + 24))(v64);
                         v66 = *(_DWORD *)dword_106170B0; //physprop
                         v131 = v65;
                         *(_WORD *)(v54 + 108) = (*(int (__stdcall **)(int))(v66 + 12))(v65);
                         *(_WORD *)(v54 + 110) = (*(int (__stdcall **)(int))(v66 + 12))(v131); //v131 == v65;
                      }
                      v67 = (*(int (__thiscall **)(int, _DWORD, char *, _DWORD))(*(_DWORD *)v63 + 44))(v63,"$surfaceprop2",&v140,0);
                      if ( v140 )
                      {
                         v68 = (*(int (__thiscall **)(int))(*(_DWORD *)v67 + 24))(v67);
                         *(_WORD *)(v54 + 110) = (*(int (__stdcall **)(int))(*(_DWORD *)dword_106170B0 + 12))(v68); // physprop == *(_DWORD *)dword_106170B0  
                      }
                    }
Как я понимаю, мне нужно получить содержимое переменной v64 или v65. Как мне понять в ассемблерном коде где хранятся данные переменных v64 или v65?

Добавлено через 1 час 10 минут
Я разобрался как получать значения из регистров, осталось определить в каких регистрах хранятся данные и на какой строке мне лучше хукать. Если тут есть разбирающиеся в ассемблере люди, подскажите пожалуйся в каком регистре храняться v64 и v65 и на каких строчка происходит занесение в них данных.
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
09.11.2013, 20:20
Ответы с готовыми решениями:

Быстродействие ассемблерного кода
Кое-где прочитал что сейчас некоторые компиляторы генерируют код работающий...

Вставка ассемблерного кода в код С++
С ++ (100% работает): #include <stdio.h> int i,m; int main(){ int A; m=0;...

Вызов функции СИ из ассемблерного кода. Компиляция из MakeFile.
Здравствуйте. 1. Не могли бы вы привести простой пример программы на...

Каким образом IDE захватывает из консоли сообщения об ошибках при компиляции ассемблерного кода?
Каким образом IDE захватывает из консоли сообщения об ошибках при компиляции...

Как получить указатель на таблицу секций
как получить на неё указатель? Добавлено через 8 минут по моему надо к к...

0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
09.11.2013, 20:20

Вставка ассемблерного кода
Код: #include <stdio.h> int main() { __asm{ _start:

Вставка ассемблерного кода в Си-программу
Пытаюсь написать hello world используя 2 языка(извращение имхо)... Не могу...

Запуск ассемблерного кода на выполнение из main()
Добрый день. Подскажите, если есть готовый файл на ассемблерном коде, то как...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
1
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru