Возможно ли в IDA Pro сделать смещение структурного поля в vtable, которое определено в сегменте .data? - PullRequest
5 голосов
/ 09 мая 2011

Вот чего я хочу достичь.Я идентифицировал класс, который я определил как структуру для хранения данных класса.Один из методов класса использует поле класса как указатель на vtable.

int __thiscall SignOn(struc_4 *this)
{
  v1 = this;
  if ( !v1->vtable_40194AE0 )
    return E_UNEXPECTED;
  v1->field_3E8 = 0;
  if ( !sub_686F7193(v1) )
    return (*(*v1->vtable_40194AE0 + 12))(v1->vtable_40194AE0, 0, 0); // sub_40128EEE
}

Как вы можете видеть, он вызывает третью функцию из vtable.Во время выполнения я обнаружил, что vtable_40194AE0 указывает на массив в разделе .data, который выглядит так-код будет выглядеть так:

return vtable_40194AE0->sub_40128EEE(v1->vtable_40194AE0, 0, 0);

?

Я пытался установить vtable_40194AE0 структуры как "определяемое пользователем смещение", но это не помогает: (

Большое спасибо!

Ответы [ 3 ]

4 голосов
/ 26 ноября 2011

Конечно, это возможно!

Откройте окно «Структуры», найдите структуру вашего класса ( struc_4 в вашем случае) и откройте ее (если она была свернута). Выберите поле vtable (оно должно быть на первом месте), нажмите Y и введите объявление типа в качестве указателя на структуру vtable в открывшемся окне ( vtable_40194AE0 * в вашем случае). Вот и все.

1 голос
/ 11 ноября 2013

Вы можете создать структуру, представляющую vtable, объявить типы C ее полей с помощью Y (быть указателями на типизированные функции) и сделать смещение в call [ecx+12] смещением этой структуры с помощью T. Таким образом, IDA распознает аргументы вызова.

В структуре, представляющей класс, установите тип поля vtable в качестве указателя на структуру vtable, тогда, если вам повезет, декомпилятор соберет все вместе и поместит имя поля структуры vtable в вызов вместо смещение.

0 голосов
/ 14 мая 2011

Насколько мне известно, нет.Структуры IDA просто предназначены для упрощения процесса визуализации разобранных данных.Максимум, что вы можете сделать, это прокомментировать сайт вызова, чтобы определить действительную виртуальную функцию, которая вызывается.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...