Section '.code' code readable executable 


Мы поможем в написании ваших работ!



ЗНАЕТЕ ЛИ ВЫ?

Section '.code' code readable executable



 

Proc DllEntryPoint hinstDLL, fdwReason, lpvReserved

   cmp  [fdwReason], DLL_PROCESS_ATTACH

   je.start

   cmp  [fdwReason], DLL_PROCESS_DETACH

     je.stop

   cmp  [fdwReason], DLL_THREAD_ATTACH

   je.start

   cmp  [fdwReason], DLl_THREAD_DETACH

  je.stop

  jmp.stp

.start:

  invoke MessageBox, 0, DllStart, DllState, MB_OK

  jmp   .stp

 .stop:

  invoke MessageBox, 0, DllStop, DllState, MB_OK

    jmp.stp

  .stp:

   mov eax, TRUE

   ret

Endp

 

Proc ShowMessage hWnd

local Buffer:DWORD

   lea eax,[Buffer]

   invoke MessageBox, [hWnd], [Buffer], NULL, MB_OK

   ret

Endp

 

Section '.idata' import data readable writeable

library user,'USER32.DLL'

import user, MessageBox,'MessageBoxA'

 

Section '.edata' export data readable

 

export 'MSG.DLL',\

    ShowMessage,'ShowMessage',

Section '.reloc' fixups data readable discardable

 

Что касается кода функций (процедур), составляющих DLL -библиотеку, то для их написания используются стандартные правила разработки программ. Описание данных также ничем не отличается от обычной программы ассемблера. Ведь в конечном итоге код и данные процедур DLL -библиотеки оказываются в адресном пространстве процесса наравне с его кодом и данными.

Вызов функций из DLL

Существует два способа загрузки DLL:

а) неявная;

б) явная;

Рассмотрим неявную загрузку DLL. Для построения приложения, рассчитанного на неявную загрузку DLL, необходимы ссылки на импортируемые идентификаторы. Компоновщик (линкер, редактор связей) формирует загрузочный EXE – модуль. В этом модуле компоновщик помещает также раздел импорта, где перечисляются имена всех необходимых DLL -модулей. Для каждой DLL в разделе импорта указывается, на какие имена функций и переменных встречаются ссылки в коде исполняемого файла. Эти сведения будет использовать загрузчик операционной системы. После запуска EXE -модуля загрузчик операционной системы выполняет следующие операции: 1. Создает виртуальное адресное пространство для нового процесса и проецирует на него исполняемый модуль;

2. Анализирует раздел импорта, определяя все необходимые DLL -модули и тоже проецирует их на адресное пространство процесса.

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

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

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

В случае явной загрузки процесс работы с DLL происходит в три этапа:

1. Загрузка DLL с помощью функции LoadLibrary (или ее расширенного аналога LoadLibraryEx). В случае успешной загрузки функция возвращает дескриптор hLib типа HMODULE, что позволяет в дальнейшем обращаться к этой DLL.

2. Вызовы функции GetProcAddress для получения указателей на требуемые функции или другие объекты. В качестве первого параметра функция GetProcAddress получает дескриптор hLib, в качестве второго параметра –адрес строки с именем импортируемой функции. Далее полученный указатель используется клиентом. Например, если это указатель на функцию, то осуществляется вызов нужной функции.

3. Когда загруженная динамическая библиотека больше не нужна, рекомендуется ее освободить, вызвав функцию FreeLibrary. Освобождение библиотеки не означает, что операционная система немедленно удалит ее из памяти. Задержка выгрузки предусмотрена на тотслучай, когда эта же DLL через некоторое время вновь понадобится какому-то процессу. Но если возникнут проблемы с оперативной памятью, Windows в первую очередь удаляет из памяти освобожденные библиотеки.

Пример текста DLL:

Format PE GUI 6.0 DLL

Entry DllEntryPoint

include 'C:\Users\work\Desktop\fasmw17121\INCLUDE\win32a.inc'

 



Поделиться:


Последнее изменение этой страницы: 2021-07-18; просмотров: 42; Нарушение авторского права страницы; Мы поможем в написании вашей работы!

infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 18.224.44.108 (0.006 с.)