Обмен данными между процессами

Страницы работы

Содержание работы

Лекция 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 

#include <stdio.h>

#include <stdlib.h>

extern double a;

int sh_fun(int);

int main(int argc, char* argv[]){

  if(argc>1)

     a=atof(argv[1]);

  printf("%g\n",a); 

  printf("%i\n", sh_fun(3));

 return 0;

}

//gcc 1.c -L. -l1d -o 1

//3.1415

//9

 

#include <stdio.h>

#include <stdlib.h>

#include <dlfcn.h>

typedef  int (*fun)(int);

extern double a;

int main(int argc, char* argv[]){

  fun f;

  printf("Dynamic library test\n");

  void* h=dlopen("lib1d.so",RTLD_LAZY);

  printf("%g\n",a);

  f=(fun)dlsym(h,"sh_fun");

  printf("%i\n", f(5));

  //int (*f)(int)=dlsym(h,"sh_fun");

  //printf("%i\n", (*f)(3));

  dlclose(h);

 return 0;

}

//gcc 2.c -L. -l1d -ldl -o 2

//3.1415

//25

 
Неявное связывание:                                                    Явное связывание:

Компилятор cl (Microsoft VS)

Компоновка библиотеки:

#include <windows.h>

extern  __declspec(dllexport)  int a=23;

__declspec(dllexport) int f(int b){

  return b*b;

}

__declspec(dllexport) int g(int b){

  return b*b*b;

}

BOOL WINAPI DllMain(HANDLE hModule,

                            DWORD  dwReason,

                            LPVOID  lpReserved){

 return  TRUE;

}

//cl /c td1.c

//link /DLL  td1.obj

 
 


Компоновка библиотеки с помощью .def-файла:

#include <windows.h>

int a=29;

int f(int b){

  return b*b*b;

}

int g(int b){

  return b*b*b*b;

}

BOOL WINAPI DllMain(HANDLE hModule,

                            DWORD  dwReason,

                            LPVOID  lpReserved){

 return  TRUE;

}

//cl /c td2.c

//link /DLL  /DEF:td2.def td2.obj

 

LIBRARY  td2

EXPORTS

            a  @1

            f  @2

            g  @3

 
 


Неявное связывание:                                            Явное связывание:

#include <windows.h>

typedef  int (*fun)(int);

int main(){

HINSTANCE hInst;

fun pf,pg;

int* pa;

            hInst=LoadLibrary("td2.dll");//("td1.dll");

            pa=(int*)GetProcAddress(hInst, "a");

            pf=(fun)GetProcAddress(hInst, "f");

            pg=(fun)GetProcAddress(hInst, "g");

            printf("%i %i %i\n",*pa,pf(3),pg(3));

            FreeLibrary(hInst);

            return 0;

}

//cl t2.c kernel32.lib

 

#include <windows.h>

extern __declspec(dllimport) int a;

int f(int);

int g(int);

int main(){

 printf("%i %i %i\n",a,f(3),g(3));

 return 0;

}

//cl t1.c td1.lib

 
 


Упражнение 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.

Похожие материалы

Информация о работе