Я только начинаю с обратного проектирования.
Я создал небольшое 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 …
Не должно ли хотя бы смещение быть таким же?
Я что-то упустил здесь?
Параметры по умолчанию для сборки отладки в Visual Studio включают включение инкрементное связывание. Эффект этого состоит в том, что в скомпилированном двоичном файле каждый вызов функции проходит через заглушку перехода (это позволяет компоновщику обновлять двоичный файл новым кодом без повторного выполнения шага полной ссылки).
&NewFunction
возвращает адрес этой заглушки, а не фактическую реализацию функции.
Других решений пока нет …