1. Вы находитесь в архивной версии форума xaker.name. Здесь собраны темы с 2007 по 2012 год, большинство инструкций и мануалов уже неактуальны.
    Скрыть объявление

Импортирование функций dll по её ординалу.

Тема в разделе "Assembler", создана пользователем Anvil, 17 июл 2008.

  1. Anvil

    Anvil Мягкий и пушистый! ..::V.I.P::..

    Регистрация:
    5 авг 2007
    Сообщения:
    194
    Симпатии:
    79
    Баллы:
    0
    В этой статье я расскажу, как это использовать, а где и когда вам использовать это, решать вам.
    Для начала давайте разберёмся, как же происходит импортирование из dll не по ординалу.
    Как известно, win32-приложению выделяют так называемое виртуальное адресное пространство. При загрузке dll всё необходимое содержимое проецируется в область памяти нашей программы (системные dll мы не берём). После чего наша программа может свободно обращаться к любым данным dll как к своим собственным. Ну а теперь отличия импорта по ординалу. При обычном импорте (по имени) программа указывает имена всех импортируемых функций в таблице импорта:

    Здесь сразу видно, что из user32.dll импортируется функция MessageBox, а из kernel32.dll - ExitProcess. Это и есть загрузка по имени. Теперь давайте рассмотрим загрузку не по имени:

    Как видите, стандартная функция MessageBox импортируется из user32.dll по имени, а вот, какие функции импортируются из нашего opit.dll, мы не видим. Для того, чтоб вы не подумали, что я вас обманул, давайте посмотрим исходник. Вот исходник dll:
    Код:
            .486
            .model    flat, stdcall
            option    casemap: none
    include        windows.inc
            .code
    opit        proc
            fld1
            fchs
            ret
    opit        endp
    simp        proc
            fstp    st(0)
            ret
    simp        endp
    
    dll        proc    h: dword, p: dword, q: dword
            xor    eax, eax
            inc    eax
            ret
    dll        endp
            end    dll
    
    ! Данный код не имеет существенного значения, и то, что он делает, нас не интересует; с таким же успехом можно было воспользоваться и NOP'ами.
    Чтобы сделать возможным импорт по ординалу, в .def файле записываются строки, присваивающие выбранные нами ординалы (1 и 3) экспортируемым функциям:
    Код:
    LIBRARY opit
    EXPORTS simp @1
        opit @3
    
    Теперь давайте рассмотрим код exe:
    Код:
            .486
            .model    flat, stdcall
            option    casemap: none
    include        windows.inc
    include        user32.inc
    includelib    user32.lib
    includelib    opit.lib
    
    
    opit proto import
    simp proto import
            .code
    ok        db        'ok', 0
    good        db        'Good', 0
    @:        call    opit
            call    simp
            call    opit
            invoke    MessageBox, 0, offset ok, offset good, MB_OK
            ret
            end    @
    
    Как видите, мы подгружаем dll, как и всегда. Но если сравните рисунки 1 и 2, то разница видна.
    Ну и ещё давайте посмотрим, что происходит в Олли:

    Как видно, программа импортирует функцию по ординалу.
    Напоследок хочу сказать, что этот способ предпочтительнее, а как и для чего его использовать, решайте сами.
    P.S. На написание меня натолкнули объяснения JAPH, за что ему большое спасибо.
    (c) Anvil
     
    Последнее редактирование модератором: 4 янв 2017
    3 пользователям это понравилось.

Поделиться этой страницей