Чайниковский вопрос по HelloWord и OllyDbg

Тема в разделе "WASM.BEGINNERS", создана пользователем lazy, 27 дек 2008.

  1. lazy

    lazy New Member

    Публикаций:
    0
    Регистрация:
    26 дек 2008
    Сообщения:
    7
    Приветствую, всезнающий Алл.

    Поиск не смог мне помочь, хотя сильно подозреваю, что ответ прост. Подскажите совсем новичку. Сотворил по уроку Iczelion'а простенькую программу MessageBox, скомпилировал, запустил, все понятно. Открываю в OllyDbg, смотрю на код — все инструкции скомпилировались и успешно декомпилировались Olly. Да вот один момент мне не ясен. Связан он с вызовом API функций. По идее - наPUSHал я в стек своих параметров и делаю CALL. А вызываемая процедура уже разберется, что там к чему. Вроде все понятно, а что это за странные JMPы внизу кода понять не могу. (обвел их красным на прилагаемом скриншоте) Компилировал более сложный пример — там они точно такие же, но их тем больше, чем больше вызываемых API функций. Не могу сообразить, нафига они тут нужны и что значат. Мне казалось, что самого CALLа достаточно. Откуда этот лишний код? Подскажите, кому не жалко, или ткните носом в статью, где это дело описывается.
     
  2. gh05t

    gh05t New Member

    Публикаций:
    0
    Регистрация:
    17 июл 2008
    Сообщения:
    34
    Код добавляется компилятором автоматически. При компиляции еще не известно, по какому адресу в адресном пространстве твоего процесса будет лежать начало функции MessageBox. А определится этот адрес только в момент загрузки файла в память. И чтобы уже подставить адрес начала функции, загрузчик патчит твой код. Но функции ты можешь вызывать не раз, и не два. Чтобы не патчить их на всей протяженности кода, добавляются такие "переходники" (JMPы), адреса в которых загрузчик и патчит.
    Статья: __tp://msdn.microsoft.com/en-us/library/ms809762(printer).aspx
     
  3. AndreyMust19

    AndreyMust19 New Member

    Публикаций:
    0
    Регистрация:
    20 окт 2008
    Сообщения:
    714
    Твой аттач никак открыть не могу. Лучше прямо в тему вставь картинку.
    Эти jmp'ы - это скорее всего переходники на функции. Если компилируешь отладочную версию, то Visual C++ обращается jmp'ам к переходникам, а уж они вызывают сами функции.
     
  4. K10

    K10 New Member

    Публикаций:
    0
    Регистрация:
    3 окт 2008
    Сообщения:
    1.590
    Это импорт.
     
  5. Y_Mur

    Y_Mur Active Member

    Публикаций:
    0
    Регистрация:
    6 сен 2006
    Сообщения:
    2.494
    http://www.wasm.ru/forum/viewtopic.php?id=17356
     
  6. gh05t

    gh05t New Member

    Публикаций:
    0
    Регистрация:
    17 июл 2008
    Сообщения:
    34
    AndreyMust19
    А в релизной версии?
     
  7. lazy

    lazy New Member

    Публикаций:
    0
    Регистрация:
    26 дек 2008
    Сообщения:
    7
    Все, сориентировался.

    Всем большое спасибо за отклик!

    Пойду дальше курить мануалы...
     
  8. AsmGuru62

    AsmGuru62 Member

    Публикаций:
    0
    Регистрация:
    12 сен 2002
    Сообщения:
    689
    Адрес:
    Toronto
    Насколько помню - такие JMP-ы пристроены MASM-ом. FASM не строит этого дополнительного кода.
     
  9. lazy

    lazy New Member

    Публикаций:
    0
    Регистрация:
    26 дек 2008
    Сообщения:
    7
    Да, компилил MASM32. У мя и так голова кругом идет от асама. Нюансов огромная куча. Но дико прикольно, как код на асаме транслируется в машинный код. Не, FASM пока не готов начать смотреть, с MASMом хочу чуть-чуть разобраться. Почитав предложенную тут ветку понял, что раз гуру сломали не одно копье о данную тему, мне пока в нее лезть рано. Принял факт CALLов на JMPы как данность и продолжил читать мануалы. Хотя все равно не приятно, что код лишний добавляется без моего ведома...
     
  10. Y_Mur

    Y_Mur Active Member

    Публикаций:
    0
    Регистрация:
    6 сен 2006
    Сообщения:
    2.494
    Замени стандартные инклюды на эти и будет тебе счастье, это взято из инструменталки wasma и откорректировано под пакеты масм32 v>=9 (в инструменталке только для v7), хотя наверно имеет смысл добавить и эти.
    Код (Text):
    1. ; Стандарное подключение либов:
    2.     include     \masm32\include\windows.inc
    3.     include     \masm32\include\user32.inc
    4.     include     \masm32\include\kernel32.inc
    5.     include     \masm32\include\comdlg32.inc
    6.     includelib  \masm32\lib\user32.lib
    7.     includelib  \masm32\lib\kernel32.lib
    8.     includelib  \masm32\lib\comdlg32.lib
    9. ; Продвинутое подключение либов (устраняет call на jmp[..] при вызове api):
    10. ; Качаем из инструменталки wasm http://www.wasm.ru/tools/7/win32.zip для MASM32 v7
    11. ; чтобы работало в v9 заменяем __imp__ на _imp__ (оптом во всех файлах :)
    12. ; и если нужно меняем includelib на includelib \masm32\lib\ (тоже оптом ;)
    13. ;   include     \masm32\include\windows.inc
    14. ;   include     \masm32\win32\kernel32.inc
    15. ;   include     \masm32\win32\user32.inc
    16. ;   include     \masm32\win32\comdlg32.inc
     
  11. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    Y_Mur
    От стандартного виндоз.инк счастья не будет, нужно нтдлл.инк подключать (прим.).
     
  12. Y_Mur

    Y_Mur Active Member

    Публикаций:
    0
    Регистрация:
    6 сен 2006
    Сообщения:
    2.494
    Clerk
    У всех свои - представления о счастье :))) - с новым годом!