Сейчас на форуме: _MBK_ (+6 невидимых)

 eXeL@B —› Вопросы новичков —› установка типа переменной в IDA Pro
Посл.ответ Сообщение

Ранг: 0.7 (гость)
Активность: 0=0
Статус: Участник

Создано: 10 марта 2011 23:28
· Личное сообщение · #1

всем привет.

Заранее извиняюсь, если вопрос тривиальный или глупый. Касается он работы с IDA Pro. (сразу скажу что в асме чайник поэтому под правой рукой лежит зубков). Задача стоит дезассемблировать несколько библиотек (если точнее штук 10, но я никуда не тороплюсь). IDA осваиваю методом проб и ошибок.

Вопрос вот в чём, почему при установке типа переменной IDA выдаёт ошибку. В частности вот код выданный hex-rays

void *v2; // esi@1
int v3; // eax@3
void (__thiscall *v4)(_DWORD, _DWORD, _DWORD, _DWORD); // eax@3
int v5; // esi@5
int v6; // eax@6
int v7; // eax@8
int v8; // [sp+14h] [bp-84h]@3
int v9; // [sp+18h] [bp-80h]@3
int v10; // [sp+1Ch] [bp-7Ch]@3
int v11; // [sp+20h] [bp-78h]@3
int v12; // [sp+24h] [bp-74h]@3
int v13; // [sp+28h] [bp-70h]@3
char v14; // [sp+2Ch] [bp-6Ch]@3
int v15; // [sp+30h] [bp-68h]@3
int v16; // [sp+34h] [bp-64h]@4

v2 = this;
if ( *((_DWORD *)this + 2) )
{
if ( (*(int (**)(void))(*(_DWORD *)this + 8))() )
{
v4 = *(void (__thiscall **)(_DWORD, _DWORD, _DWORD, _DWORD))(*(_DWORD *)v2 + 4);
v13 = 0;
v12 = 0;
v11 = 0;
v10 = 0;
v9 = 0;
v8 = 0;
v4(v2, l_hdc, &v8, &v10);
ImageDevice__ImageDevice(&v14, l_hdc, 0);
v3 = GdipSetPageUnit(v15, 2);
if ( v3 )
v16 = v3;
v5 = *((_DWORD *)v2 + 25);
if ( v5 )
v6 = *(_DWORD *)(v5 + 4);
else
v6 = 0;
v7 = GdipDrawImagePointRectI(v15, v6, v8, v9, v10, v11, v12, v13, 2);
if ( v7 )
v16 = v7;
ImageDevice___ImageDevice(&v14);
}
}


к примеру я чётко понимаю что в методе GdipSetPageUnit первым параметром идёт указатель на GpGraphics, но при попытке установить тип для этой переменой IDA пишет - bad declaration ?

Ещё почему IDA подцепила часть методов GDI+, а вот структуры описания нет ?

Заранее всем спасибо за терпение.



Ранг: 0.7 (гость)
Активность: 0=0
Статус: Участник

Создано: 11 марта 2011 13:53
· Личное сообщение · #2

Может тогда кто-нибудь подскажет как делать реверс C++ кода ? Возможно ли как-либо дать понять IDA что текущая переменная определённого класса (пусть для неё это будет структура) ? Буду благодарен если кто-нибудь подкинет туториалы как делать реверс именно С++ кода



Ранг: 37.1 (посетитель), 11thx
Активность: 0.030
Статус: Участник

Создано: 17 марта 2011 17:36
· Личное сообщение · #3

К. Касперский - Искусство дизассемблирования. Там есть всё.

Кстати, при компилировании структуры расщепляются на составляющие их переменные, поэтому точно сказать что это - переменные или структура невозможно. А возможно только если это известная библиотечная структура, тогда можно опознать структуру по коду, который её обрабатывает.
А вообще на низком уровне структура и несколько переменных - одно и то же.



Ранг: 37.1 (посетитель), 11thx
Активность: 0.030
Статус: Участник

Создано: 17 марта 2011 17:41
· Личное сообщение · #4

С классом всё тоже самое... Его можно определить косвенным методом - найти конструктор, деструктор, указатель на таблице виртуальных функций, а главное - он выявляется наличием указателя this в функциях-членах. Причём на ассемблере всё это выглядит как набор переменных и вызовов функций. Поэтому IDA не ошиблась


 eXeL@B —› Вопросы новичков —› установка типа переменной в IDA Pro
:: Ваш ответ
Жирный  Курсив  Подчеркнутый  Перечеркнутый  {mpf5}  Код  Вставить ссылку 
:s1: :s2: :s3: :s4: :s5: :s6: :s7: :s8: :s9: :s10: :s11: :s12: :s13: :s14: :s15: :s16:


Максимальный размер аттача: 500KB.
Ваш логин: german1505 » Выход » ЛС
   Для печати Для печати