RE - смещение функции поиска IDA

Я только начинаю заниматься реверс-инжинирингом.

Я создал небольшое консольное приложение С++ и пытаюсь вызвать NewFunction через внедренную DLL.

void NewFunction()
{
    DWORD dwImageBase = (DWORD)GetModuleHandle(NULL);

    std::cout << "ImageBase: " << ToHex(dwImageBase) << std::endl;
    std::cout << "NewFunction: " << ToHex((DWORD)&NewFunction) << std::endl;
    std::cout << "Offset: " << ToHex((DWORD)&NewFunction - dwImageBase) << std::endl;
}

Пример вывода:

ImageBase: F90000
NewFunction: FA111D
Offset: 1111D

Теперь, когда я вызываю 0xFA111D с моей внедренной DLL, она работает, как и ожидалось, и печатает ее снова и снова. (DLL вызывает ImageBase + Offset)

Чего я не могу понять, так это того, как получить адрес NewFunction с помощью IDA Pro...

В ИДА:

  • функция находится по адресу: 0x4133F0
  • База изображений: 0x400000
  • Расчетное смещение: 0x133F0

Разве хотя бы смещение не должно быть одинаковым? Я пропустил что-то важное здесь?


person Dennis Utzinger    schedule 31.01.2014    source источник
comment
Вы смотрите на отладочную сборку?   -  person Igor Skochinsky    schedule 31.01.2014
comment
Да... в этом была проблема! Время провести небольшое исследование.   -  person Dennis Utzinger    schedule 31.01.2014


Ответы (1)


Настройки по умолчанию для отладочной сборки в Visual Studio включают в себя включение добавочного связывания. Результатом этого является то, что в скомпилированном двоичном файле каждый вызов функции проходит через переходную заглушку (это облегчает компоновщику обновление двоичного файла новым кодом без повторного выполнения всего шага компоновки).

&NewFunction возвращает адрес этой заглушки, а не фактическую реализацию функции.

person Igor Skochinsky    schedule 31.01.2014