2013-06-06 3 views
3

Недавно я разобрал DLL (написанный на c/C++) и заметил, что внутри сегмента кода есть много «прыгающих окурков». Эти заглушки ничего не делают, кроме как перейти к функции внутри DLL.сканирование в файлах PE

например:

jmp foo() 
jmp foo2() 
... 

Почему компилятор (Visual Studio 2012) включают в себя эти функции заглушек внутри двоичного файла?

Спасибо!

ответ

4

Есть ли большой кусок 0xCC байт после всех заглушек? Если это так, вы просматриваете код, который был скомпилирован с включенной инкрементной привязкой (по умолчанию для отладочных сборников).

При компиляции для инкрементной компоновки компилятор создает заглушку для каждой функции и гарантирует, что все вызовы пройдут через заглушку. В случае, если функция должна быть заменена обновленным кодом, новый код может быть добавлен в конец, и нужно только запланировать прыжок thunk - все существующие вызовы будут перенаправлены на новый код. Дополнительные CCs зарезервированы для большего количества заглушек в случае добавления новых функций.

Для получения дополнительной информации, see MSDN.

+0

Да, после этих трюков есть байк размером 0xcc байт. И эти трюки появляются только в выпусках. – user2458855

2

Вот как символы для компоновщика и DLL «размяты вместе». Это гарантирует, что правильный вид смещения используется в таблице символов, который может быть разрешен загрузчиком, который загружает DLL (и, таким образом, обновляет адрес функций в DLL), и этот скомпилированный код может по-прежнему иметь дело, например указатели на функции:

void (*fptr)() = foo; 

Если foo только ссылка на место в DLL, как этот адрес будет решен, будет зависеть от загрузчика. Это гораздо сложнее решить, чем решить проблему «вот точка входа foo(), которая приведет вас к реальному foo».

+0

DLL = общая библиотека. Да, мы говорим о 'foo', являющемся частью' mydll.dll', а не 'myprog.exe'. –

0

DLL переносятся, что означает, что они могут оказаться в любом месте в памяти. Это означает, что все обращения к ним должны быть переписаны. Сохраняя все такие звонки вместе в небольшом переходе, только одна страница должна быть переписана в случае переезда. Это имеет значение, поскольку неизмененная страница кода может быть разделена между процессами, но каждый процесс имеет свою собственную копию измененной страницы.

Смежные вопросы