Лекция 7
ОБМЕН ДАННЫМИ МЕЖДУ ПРОЦЕССАМИ
I. Реализация памяти общего доступа с помощью DLL.
1. Технология создания библиотек динамической компоновки
Библиотеки статической компоновки (библиотеки объектных модулей) и библиотеки динамической компоновки.
Компилятор gcc, платформа LINUX
Компоновка библиотеки:
double a=3.1415;
int sh_fun(int i){
return i*i;
}
//gcc -shared -fPIC 1d.c -o lib1d.so
|
|
Компилятор cl (Microsoft VS)
Компоновка библиотеки:
|
Компоновка библиотеки с помощью .def-файла:
|
|||
|
|||
Неявное связывание: Явное связывание:
|
||||
|
||||
Упражнение 1: создайте библиотеку динамической компоновки, экспортирующую данные (объявите и инициализируйте некоторую переменную, простую, массив или структуру). Создайте приложение/-ия, загружающее/-ие эту библиотеку и модифицирующее/-ие данные. Создайте несколько экземпляров приложения/-ий. Ответьте на вопрос: меняются ли экспортируемые данные?
(Необязательное задание – выполните это задание также в C++ Builder’е. Будет ли тот же результат?)
2. Исполняемые файлы (PE – файлы /Portable Executable File/).
Исполняемые файлы (.exe, .dll, .ocx и т.д.) - файлы образа задачи (image file) компонуются из объектных файлов (.obj) - COFF (Common Object File Format) – файлов.
Отображение исполняемого файла на адресное пространство – загрузка исполняемого модуля, происходит по базовому адресу (если возможно, то по базовому адресу по умолчанию). Объектный код содержит относительные адреса – смещения по отношению к базовому адресу. При компоновке относительные адреса заменяются на абсолютные адреса с использованием базового адреса по умолчанию.
Структура PE-файла
Разделы
Раздел текста: исполняемый код данного файла, обозначается .text
Разделы данных: .bss содержит неинициализированные данные, .rdata – данные только для чтения (символьные строки, константы), .data содержит все остальные переменные.
Раздел ресурсов: содержит информацию о ресурсах, обозначается .rsrc.
Раздел перемещения: хранит таблицу адресных записей с адресными привязками к реальному адресу загрузки, обозначается .reloc.
Раздел экспорта: содержит информацию об экспортируемых функциях и глобальных переменных, обозначается .edata.
Раздел импорта: содержит информацию об импортируемых функциях, обозначается .idata.
Получение информации о PE-файле
//Объявления функций и определение структур из библиотеки IMAGEHLP.DLL,
//заголовочный файл imagehlp.h, библиотека импорта imagehlp.lib
BOOL MapAndLoad(
PSTR ImageName,
PSTR DllPath,
PLOADED_IMAGE LoadedImage,
BOOL DotDll,
BOOL ReadOnly
);
PVOID ImageRvaToVa(
PIMAGE_NT_HEADERS NtHeaders,
PVOID Base,
ULONG Rva,
PIMAGE_SECTION_HEADER* LastRvaSection
);
typedef struct _LOADED_IMAGE {
PSTR ModuleName;
HANDLE hFile;
PUCHAR MappedAddress;
PIMAGE_NT_HEADERS32 FileHeader;
PIMAGE_SECTION_HEADER LastRvaSection;
ULONG NumberOfSections;
PIMAGE_SECTION_HEADER Sections;
ULONG Characteristics;
BOOLEAN fSystemImage;
BOOLEAN fDOSImage;
LIST_ENTRY Links;
ULONG SizeOfImage; }
LOADED_IMAGE, *PLOADED_IMAGE;
typedef struct _IMAGE_EXPORT_DIRECTORY
{
DWORD Characteristics;
DWORD TimeDateStamp;
WORD MajorVersion;
WORD MinorVersion;
DWORD Name;
DWORD Base;
DWORD NumberOfFunctions;
DWORD NumberOfNames;
DWORD AddressOfFunctions;
DWORD AddressOfNames;
DWORD AddressOfNameOrdinals;
} IMAGE_EXPORT_DIRECTORY, *PIMAGE_EXPORT_DIRECTORY;
КОМПИЛЯЦИЯ
> cl 1.c imagehlp.lib
OUTPUT
> 1 td1.dll
0x20000 - Base Address
0x9a50 -RVA
0x29a50 -VA
Name of PEF: td1.dll
Exported data:
a
f
g
Упражнение 2:
a. получите список экспортируемых функций библиотеки kernel32.dll;
b. получите список экспортируемых функций модулей процесса notepad.exe.
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.