Converting an EXE to a DLL
I’ve been doing some crazy experiments on running an EXE as a DLL. Here are some parts of my research.
Case #1
Let’s take a simple example like a MessageBox.
1 2 3 4 5 6 7 8 9 10 |
#include <windows.h> int APIENTRY wWinMain(_In_ HINSTANCE hInstance, _In_opt_ HINSTANCE hPrevInstance, _In_ LPWSTR lpCmdLine, _In_ int nCmdShow) { MessageBox(NULL, L"@OsandaMalith", L"https://osandamalith.com", MB_ICONINFORMATION | MB_OKCANCEL); } |
After compiling to an EXE we have to change the characteristics under NT Header->File Header to a DLL file. I will use the value 0x2000 | 0x2| 0x100 = 0x2102.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
#define IMAGE_FILE_DLL 0x2000 // File is a DLL. #define IMAGE_FILE_EXECUTABLE_IMAGE 0x0002 // File is executable #define IMAGE_FILE_32BIT_MACHINE 0x0100 // 32 bit word machine. typedef struct _IMAGE_NT_HEADERS { DWORD Signature; IMAGE_FILE_HEADER FileHeader; IMAGE_OPTIONAL_HEADER32 OptionalHeader; } IMAGE_NT_HEADERS32, *PIMAGE_NT_HEADERS32; typedef struct _IMAGE_FILE_HEADER { WORD Machine; WORD NumberOfSections; DWORD TimeDateStamp; DWORD PointerToSymbolTable; DWORD NumberOfSymbols; WORD SizeOfOptionalHeader; WORD Characteristics; } IMAGE_FILE_HEADER, *PIMAGE_FILE_HEADER; |