Приветствую, всезнающий Алл. Поиск не смог мне помочь, хотя сильно подозреваю, что ответ прост. Подскажите совсем новичку. Сотворил по уроку Iczelion'а простенькую программу MessageBox, скомпилировал, запустил, все понятно. Открываю в OllyDbg, смотрю на код — все инструкции скомпилировались и успешно декомпилировались Olly. Да вот один момент мне не ясен. Связан он с вызовом API функций. По идее - наPUSHал я в стек своих параметров и делаю CALL. А вызываемая процедура уже разберется, что там к чему. Вроде все понятно, а что это за странные JMPы внизу кода понять не могу. (обвел их красным на прилагаемом скриншоте) Компилировал более сложный пример — там они точно такие же, но их тем больше, чем больше вызываемых API функций. Не могу сообразить, нафига они тут нужны и что значат. Мне казалось, что самого CALLа достаточно. Откуда этот лишний код? Подскажите, кому не жалко, или ткните носом в статью, где это дело описывается.
Код добавляется компилятором автоматически. При компиляции еще не известно, по какому адресу в адресном пространстве твоего процесса будет лежать начало функции MessageBox. А определится этот адрес только в момент загрузки файла в память. И чтобы уже подставить адрес начала функции, загрузчик патчит твой код. Но функции ты можешь вызывать не раз, и не два. Чтобы не патчить их на всей протяженности кода, добавляются такие "переходники" (JMPы), адреса в которых загрузчик и патчит. Статья: __tp://msdn.microsoft.com/en-us/library/ms809762(printer).aspx
Твой аттач никак открыть не могу. Лучше прямо в тему вставь картинку. Эти jmp'ы - это скорее всего переходники на функции. Если компилируешь отладочную версию, то Visual C++ обращается jmp'ам к переходникам, а уж они вызывают сами функции.
Да, компилил MASM32. У мя и так голова кругом идет от асама. Нюансов огромная куча. Но дико прикольно, как код на асаме транслируется в машинный код. Не, FASM пока не готов начать смотреть, с MASMом хочу чуть-чуть разобраться. Почитав предложенную тут ветку понял, что раз гуру сломали не одно копье о данную тему, мне пока в нее лезть рано. Принял факт CALLов на JMPы как данность и продолжил читать мануалы. Хотя все равно не приятно, что код лишний добавляется без моего ведома...
Замени стандартные инклюды на эти и будет тебе счастье, это взято из инструменталки wasma и откорректировано под пакеты масм32 v>=9 (в инструменталке только для v7), хотя наверно имеет смысл добавить и эти. Код (Text): ; Стандарное подключение либов: include \masm32\include\windows.inc include \masm32\include\user32.inc include \masm32\include\kernel32.inc include \masm32\include\comdlg32.inc includelib \masm32\lib\user32.lib includelib \masm32\lib\kernel32.lib includelib \masm32\lib\comdlg32.lib ; Продвинутое подключение либов (устраняет call на jmp[..] при вызове api): ; Качаем из инструменталки wasm http://www.wasm.ru/tools/7/win32.zip для MASM32 v7 ; чтобы работало в v9 заменяем __imp__ на _imp__ (оптом во всех файлах :) ; и если нужно меняем includelib на includelib \masm32\lib\ (тоже оптом ;) ; include \masm32\include\windows.inc ; include \masm32\win32\kernel32.inc ; include \masm32\win32\user32.inc ; include \masm32\win32\comdlg32.inc