Запутанная функция - PullRequest
       20

Запутанная функция

3 голосов
/ 29 июня 2010

Итак, используя IDA для дизассемблирования, я наткнулся на функцию класса:

mov eax, [ecx+4]
mov eax, [eax]
retn

Я знаю, ecx означает this, а eax - возвращаемое значение, но мне не удаетсячтобы понять, что он возвращает.Любая помощь?

Ответы [ 5 ]

3 голосов
/ 29 июня 2010

Эта функция загружает указатель (в eax) со смещением 4 от того, на что указывает ecx.Затем следует этот указатель для загрузки 32-битного значения в eax, которое возвращается из функции.

Это то, что функция делает , но невозможно сказать, что это означает без намного большего контекста.

1 голос
/ 29 июня 2010
class C
{
    int a;
    int *b; // ecx+4

    int get_b()
    {
        return *b;
    }
}

Конечно, фактический тип a и *b неизвестен, но они оба 32-битные типы.a также может быть указателем на VMT, если в классе есть какие-либо виртуальные методы или деструкторы.

0 голосов
/ 29 июня 2010

Это сильно зависит от соглашения о вызовах, используемого оригинальным компилятором. Довольно нормальная настройка, например, для MSVC возвращает 32-битные значения в регистре eax. Ответ @Gregs говорит о том, что он делает, но, как он говорит, смысл зависит от знания дополнительных деталей языка реализации и компилятора.

Если вы хотите разобраться с разборками, попробуйте просмотреть результаты в своем (C / C ++) коде. Это действительно единственный способ почувствовать, что происходит в других DLL.

0 голосов
/ 29 июня 2010

Что за вопрос. Если ecx содержит указатель на структуру «this», вы должны знать, как именно это делается. Первый instr, получает второй dword, другой указатель; что бы это могло быть? Мы не можем знать. Этот указатель теперь содержится в eax, скорее всего, указывает на другую структуру или что-то еще. Первое указанное значение помещается в eax, и это то, что возвращает func.

ecx    ------->    dword dataA   offset 0
                   dword dataB   offset 4

  mov eax, [ecx + 4]

eax = dataB ---->  dword dataC   offset 0

  mov eax, [eax]

eax = dataC

Что такое dataC, зависит от многих вещей, которые мы не можем знать.

0 голосов
/ 29 июня 2010

Моя сборка немного ржавая, но первая инструкция загружает что-то в EAX ... что-то, на что указывает содержимое регистра ECX ... но это смещение слова (4 байта) оттуда.Затем следующая инструкция загружает (перезаписывает) EAX тем, на что указывает EAX.

Эта запись (квадратные скобки, окружающие вторую или "исходные" операции этих инструкций MOV (загрузка), указывает, что косвенныйиспользуются режимы адресации.

Я предполагаю, что это просто способ реализовать своего рода двойное косвенное обращение. Адрес в регистре ECX может указывать на кадр стека или, возможно, на некоторый указатель атрибута C ++«this», на которое вы ссылались. Этот адрес, в свою очередь, содержит адрес возвращаемого значения. Таким образом, этот код перетаскивает адрес в регистр, а затем использует этот адрес в регистре для извлечения значения (попутно втот же регистр.) Этот подход хорош тем, что сохраняет все остальные регистры.

(кстати, большинство парадигм вызова функций x86 - системные вызовы, вызовы функций DOS и т. д. оставляют коды возврата функций илисистемные ошибки ... ошибочно в библиотеках stdlib C, в реестре EAX).

...