In this article, I will talk about the creation of a DLL using Assembly (MASM) and the creation of a program that invokes that sample DLL.
Creation of the DLL
First of all, you need to do some things. Define the normal things (.386 and the includes), then you will need to declare the main procedure of a DLL (LibMain), the next will be all the other procedures of the DLL. In this tutorial, I will use only one (PrintMess), but you can use however many you need.
Here is the code of the sample DLL:
.386 option casemap :none ; case sensitive include \masm32\include\masm32rt.inc .code LibMain proc instance:dword,reason:dword,unused:dword mov eax,1 ret LibMain endp PrintMess proc print "Test", 10 ; message that will be printed by another program inkey ; like pause command in batch exit ; exits the program PrintMess endp End LibMain
Very Brief Description
In the PrintMess procedure, I'm using print to show a message in the screen, that 10 after will move the cursor to a new line for the inkey function. Now let's go to the program that will use this DLL.
Creation of the Program
First of all, you need to do some things. Define the normal things (.386, .model and the includes), then you will declare some variables (hLib and hProc), the next will be the main program by using the DLL.
Here is the code of the sample program:
.386 .model stdcall,flat include \masm32\include\kernel32.inc includelib \masm32\lib\kernel32.lib .data hLib dword ? hProc dword ? .data lib byte "testdll.dll", 0 function byte "PrintMess", 0 .code start: push offset lib call LoadLibrary; will load the dll mov hLib, eax push offset function push hLib call GetProcAddress; will get the procedure to execute mov hProc, eax call hProc; will call your function in your DLL push hLib call FreeLibrary; free the resource ret end start
Now let's explain the code very quickly. I've declared a variable called lib that will store where the DLL is to open it and another variable called function that will store what procedure the program will execute (remember that you can create many other variables to other procedures), then the program will load the DLL using LoadLibrary that is stored in hLib variable. Next, the GetProcAddress will get the address of the procedure (PrintMess). After this, we need to call the function that is in hProc and to end we need to free the DLL using the FreeLibrary function.