Добро пожаловать! Это — архивная версия форумов на «Хакер.Ru». Она работает в режиме read-only.
 

DLL на Flat Assembler

Пользователи, просматривающие топик: none

Зашли как: Guest
Все форумы >> [Прочее] >> DLL на Flat Assembler
Имя
Сообщение << Старые топики   Новые топики >>
DLL на Flat Assembler - 2009-11-20 17:37:54.710000   
sepo

Сообщений: 434
Оценки: 10
Присоединился: 2009-01-13 21:19:09.150000
В этой статье я напишу пример создания DLL на фасме. В длл запишем процедуру которая может складывать и вычитать числа. ДЛЛ напишем на фасме, а программу которая будет вызывать функцию из длл напишем на дельфи.
Эта статья для тех кто хотя-бы знает что такое DLL. Почитать можно здесь - http://ru.wikipedia.org/wiki/DLL

Код DLL библиотеки:
[font=verdana]format PE GUI 4.0 DLL ;формат исполняемого файла PE GUI 4.0 DLL entry DllEntryPoint ;Инициализация DLL. Функция DllEntryPoint include 'INCLUDE\win32ax.inc' ;Инклуид файл section '.data' data readable writable ;дата секция formats db "%d",0 result db 256 dup(?) section '.code' code readable executable ;секция кода proc DllEntryPoint hinstDLL,fdwReason,lpvReserved ;функция инициализации DLL mov&nbsp;&nbsp;&nbsp;&nbsp; eax,TRUE ; перемещаем в регистр eax значение True т.е Истина. Если сюда поставить False (ложь), то DLL не ;запустится ret ;выходим из этой функции endp proc Calc TypeCalc,Number1,Number2 ;процедура Calc mov eax,[TypeCalc] ;премещаем в eax значение TypeCalc .if eax = 0 ;если значение eax равно 0, то... mov edx,[Number1] ;перемещаем в edx значение Number1 mov ebx,[Number2] ;перемещаем в ebx значение Number2 sub edx,ebx ;вычитаем edx из ebx и сохраняем результат в edx .endif .if eax = 1 ;если значение eax равно 1, то... mov edx,[Number1] ;перемещаем в edx значение Number1 mov ebx,[Number2] ;перемещаем в ebx значение Number2 add edx,ebx ; складываем edx и ebx .endif invoke wsprintf,result,formats,edx ;конвернтируем число (значение edx) в строку, для того чтобы вывести на экран invoke MessageBox,0,result,'Result',MB_OK ;выводим результат на экран ret ;выходим из процедуры endp section '.idata' import data readable writeable library kernel32,'KERNEL32.DLL',\ user32,'USER32.DLL' include '..\INCLUDE\api\kernel32.inc' include '..\INCLUDE\api\user32.inc' section '.edata' export data readable [/font][font=verdana]export 'Calc.dll',\ ;разрешаем экспорт процедуры Calc Calc, 'Calc' section '.reloc' fixups data discardable[/font]  
Сохраните этот код в файле Calc.asm и скомпилируйте код.
Всё. С длл разобрались. Теперь напишем программу которая будет использовать эту длл.
Напишем эту программу на дельфи.
Код:
[font=verdana][b][color=#010101]unit[/color][/b] Unit1; [b][color=#010101]interface[/color][/b] [b][color=#010101]uses[/color][/b] Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls; [b][color=#010101]type[/color][/b] TForm1 [/font][font=verdana]= [b][color=#010101]class[/color][/b](TForm) Edit1: TEdit; Edit2: TEdit; Button1: TButton; Button2: TButton; [b][color=#010101]procedure[/color][/b] Button2Click(Sender: TObject); [b][color=#010101]procedure[/color][/b] Button1Click(Sender: TObject); [b][color=#010101]private[/color][/b] [i][color=#808080]{ Private declarations }[/color][/i] [b][color=#010101]public[/color][/b] [i][color=#808080]{ Public declarations }[/color][/i] [b][color=#010101]end[/color][/b]; [b][color=#010101]var[/color][/b] Form1: TForm1; [b][color=#010101]implementation[/color][/b] [i][color=#808080]{$R *.dfm}[/color][/i] [b][color=#010101]procedure[/color][/b] Calc(TypeCalc,Number1,Number2 : cardinal); [b][color=#010101]stdcall[/color][/b]; [b][color=#010101]external[/color][/b] [b][color=#008000]'Calc.dll'[/color][/b]; [i][color=#808080]//статический вызов длл Calc.dll[/color][/i] [b][color=#010101]procedure[/color][/b] TForm1.Button2Click(Sender: TObject); [b][color=#010101]begin[/color][/b] Calc(53[color=#0000ff]54,StrToInt(Edit1.Text),StrToInt(Edit2.Text)); [i][color=#808080]//с помощью функции Calc вычитаем содержимое Edit2 из Edit1[/color][/i] [b][color=#010101]end[/color][/b]; [b][color=#010101]procedure[/color][/b] TForm1.Button1Click(Sender: TObject); [b][color=#010101]begin[/color][/b] Calc(63[/color]64,StrToInt(Edit1.Text),StrToInt(Edit2.Text)); [i][color=#808080]//с помощью функции Calc складываем содержимое Edit1 с Edit2[/color][/i] [b][color=#010101]end[/color][/b]; [b][color=#010101]end[/color][/b].[/font]  
Всё. Надеюсь кому-то пригодится. Если что не так сильно бить не надо, писал на быструю руку[sm=peace.gif]
 
 
Post #: 1
Страниц:  [1]
Все форумы >> [Прочее] >> DLL на Flat Assembler







Связаться:
Вопросы по сайту / xakep@glc.ru

Предупреждение: использование полученных знаний в противозаконных целях преследуется по закону.