RE - Отместване на функцията за намиране на IDA

Току що започвам с обратното инженерство.

Създадох малко C++ ConsoleApplication и се опитвам да извикам 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...

В IDA:

  • функцията се намира на: 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