Краткие сведения о DLL
DLL (англ. dynamic-link library — «библиотека динамической компоновки», «динамически подключаемая библиотека») — понятие операционных систем Microsoft Windows и IBM OS/2, динамическая библиотека, позволяющая многократное использование различными программными приложениями. K DLL относятся также элементы управления ActiveX и драйверы. Формат файлов DLL придерживается тех же соглашений, что и формат исполняемых файлов, сочетая код, таблицы и ресурсы, отличаясь лишь интерпретацией некоторых полей. Аналогично защите основного кода программы, Sentinel HASP API позволяет защитить и DLL библиотеку. Это подразумевает под собой внедрение функций HASP API в код динамических библиотек. При этом разработчик программного обеспечения имеет возможность пользоваться всеми доступными функциями (рассмотрены в работе 2). 1. Программа, как и в лабораторной работе 2, должна проверять доступность аппаратного ключа HASP и в случае успешной проверки вычислять определенный интеграл функции на заданном интервале. Различие состоит в том, что теперь функция вычисления интеграла вынесена в отдельную DLL библиотеку и будет импортирована из нее в процессе работы. Поскольку в эту библиотеку будет устанавливаться встроенная защита, то необходимо добавить в папку с проектом вспомогательные файлы, выполнив пункт 1 задания к лабораторной работе 2.
2. Далее необходимо запустить программу Borland Delphi и создать новый объект DLL Wizard, File-> New-> DLL Wizard, как показано на рисунке 49.
Рисунок 49 – создание DLL библиотеки
3. После сохранения проекта, следует приступить к добавлению в программный модуль необходимых функций. В данном случае это процедура integral, которая будет в дальнейшем будет вызываться из DLL библиотеки, и функция f. Исходный код программного модуля: library Project1; uses SysUtils, Classes, hasp_unit; {$R *.res} {$I hasp_vcode.inc } function f(x, m: real): real; begin f: =x*x; end; procedure integral(a, b, e: real; n: integer; var s: real; var status: hasp_status_t); const SCOPE_VIEW_MAXSIZE = (1024 * 128); var handle: hasp_handle_t; handle2: hasp_handle_t; fsize: hasp_size_t; time: hasp_time_t; info: pchar; feature, i: integer; day, month, year, hour, minute, second: cardinal; scope: Array[0..SCOPE_VIEW_MAXSIZE-1] of char; view: Array[0..SCOPE_VIEW_MAXSIZE-1] of char; s1, d, m, raz: real; begin feature: = 50; status: = hasp_login(feature, @vendor_code[1], handle); if status = HASP_STATUS_OK then begin s1: =0; s: =200; raz: =100; m: =b-1; d: =(b-a)/n; while raz> e do begin for i: =0 to n do S1: =S1+d*(F(a + I*d, m) + F(a + (I+1)*d, m))/2; raz: =abs(s-s1); s: =s1; s1: =0; n: =n*2; d: =(b-a)/n; end; end; end; exports integral; begin end. 4. Необходимо обратить внимание, что экспортируется только процедура integral. Также можно увидеть в коде DLL библиотеки вызов функции hasp_login, что позволит проверить наличие подлинного ключа защиты. Теперь необходимо сформировать DLL-библиотеку, выполнив действия Project-> Build All Projects. В папке с проектом появится файл Project1.dll, который нужно скопировать в папку основной программы и переименовать в HASP_INT.dll. 5. Далее следует приступить к формированию основной программы. Интерфейс пользователя не изменился, он представлен на рисунке 48. Однако код программы теперь выглядит иначе, поскольку были вынесены необходимые математические функции в отдельную DLL-библиотеку. Содержание программного модуля unit1.pas: unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, hasp_unit; type TForm1 = class(TForm) Button1: TButton; Edit1: TEdit; Edit2: TEdit; Memo1: TMemo; Edit3: TEdit; Label1: TLabel; Label2: TLabel; Label3: TLabel; Edit4: TEdit; Label4: TLabel; procedure FormCreate(Sender: TObject); procedure Button1Click(Sender: TObject); private { Private declarations } public { Public declarations } end; const AES_MIN_DATA_LEN = 16; { минимальная длина данных для AES шифрования } MAX_MEMORY = 128; { Макс. размер памяти, который будет обрабатываться } CUSTOM_FEATURE = 42; DEMO_MEMBUFFER_SIZE = 8; SCOPE_VIEW_MAXSIZE = (1024 * 128); var Form1: TForm1; a, b, s, d, e: real; n: integer; status: hasp_status_t; integral: procedure(a, b, e: real; n: integer; var s: real; var status: hasp_status_t); LibHandle: THandle; data: array[0..16] of byte = ($74, $65, $73, $74, $20, $73, $74, $72, $69, $6e, $67, $20, $31, $32, $33, $34, 0); membuffer: array [0..DEMO_MEMBUFFER_SIZE] of byte; datalen: hasp_size_t; implementation {$R *.dfm} {$I hasp_vcode.inc } procedure TForm1.FormCreate(Sender: TObject); begin Memo1.Clear(); end; procedure TForm1.Button1Click(Sender: TObject); begin @integral: = nil; LibHandle: = LoadLibrary('HASP_INT.dll'); if LibHandle > = 32 then begin @integral: = GetProcAddress(LibHandle, 'integral'); if @integral < > nil then Memo1.Clear(); n: =100; a: =StrToFloat(Edit1.Text); b: =StrToFloat(Edit2.Text); e: =StrToFloat(Edit4.Text); integral(a, b, e, n, s, status); if status = HASP_STATUS_OK then begin Memo1.Lines.Add(FloatToStr(s)); end else if status = HASP_FEATURE_NOT_FOUND then Showmessage('Невозможно подключиться к feature') else if status = HASP_CONTAINER_NOT_FOUND then Showmessage('HASP ключ с данным кодом не найден') else if status = HASP_OLD_DRIVER then Showmessage('Устаревшая версия драйвера аппаратного ключа защиты') else if status = HASP_NO_DRIVER then Showmessage('Драйвер ключа не установлен') else if status = HASP_INV_VCODE then Showmessage('Ошибка в коде ключа') else Showmessage('Подключение к feature закончилось неудачей'); end; FreeLibrary(LibHandle); end; end. 5. Важно обратить внимание на то, что в коде основной программы нет вызова функций Sentinel HASP API, а также присутствует механизм импорта функций из DLL библиотеки HASP_INT.dll 6. Теперь необходимо скомпилировать программу и проверить ее работоспособность при подключенном и отсутствующем ключе HASP HL. Результаты описать в выводе к отчету.
Контрольные вопросы 1. Объясните принцип работы DLL библиотек? 2. Какие преимущества дает использование DLL библиотек? Есть ли недостатки и если есть, то какие? 3. Опишите процесс создания динамически подключаемых библиотек в среде Borland Delphi? 4. Возможно ли использование нескольких DLL библиотек одной программой?
|