Probleem: Ik probeer een simpele DLL te maken maar krijg DLLMain niet exported e.g. niet terug te vinden met "Dll Export Viewer" en de foutmelding met rundll32.exe dat DllMain niet gevonden kan worden.
Code:
Ik ben begonnen met de standaard code van Visual Studio 2017:
(nieuw project -> Visual C++, Win Desktop, DLL)
Met deze code wordt DllMain niet geexporteerd in zowel de x86 als x64 builds wanneer ik naar release compile.
Verander ik het naar:
A.
dan is er nog steeds geen DllMain export terug te vinden in zowel de x86 als x64 DLL.
Neem ik de volgende code op:
B.
Dan is in een x64 build DllMain terug te vinden en werkt de DLL (start calc.exe of MsgBox).
Getest door de DLL in een applicatie te injecteren en te laden met "rundll32.exe test.dll DllMain"
Echter in een x86 build is DllMain mangled en geeft _DLLMain@12 als export in "Dll Export Viewer".
De applicatie wil de DLL niet laden en rundll32 geeft de foutmelding "Missing entry: DLLMain" maar start wel calc.exe of de MsgBox.
Waarom werkt DllMain niet "by default" en hoe los ik dit op?
Het zal wel iets simpels zijn maar ik zit er al een week op vast.
Code:
Ik ben begonnen met de standaard code van Visual Studio 2017:
(nieuw project -> Visual C++, Win Desktop, DLL)
Met deze code wordt DllMain niet geexporteerd in zowel de x86 als x64 builds wanneer ik naar release compile.
C++:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
| dllmain.cpp BOOL WINAPI DllMain( HINSTANCEhinstDLL, // handle to DLL module DWORD fdwReason, // reason for calling function LPVOID lpReserved ) // reserved { // Perform actions based on the reason for calling. switch( fdwReason ) { case DLL_PROCESS_ATTACH: // Initialize once for each new process. // Return FALSE to fail DLL load. WinExec("calc", 1); break; case DLL_THREAD_ATTACH: // Do thread-specific initialization. break; case DLL_THREAD_DETACH: // Do thread-specific cleanup. break; case DLL_PROCESS_DETACH: // Perform any necessary cleanup. break; } return TRUE; } |
Verander ik het naar:
A.
C++:
1
| BOOL APIENTRY DllMain of BOOL __stdcall DllMain |
dan is er nog steeds geen DllMain export terug te vinden in zowel de x86 als x64 DLL.
Neem ik de volgende code op:
B.
C++:
1
2
| #define EXTERN_DLL_EXPORT extern "C" __declspec(dllexport) EXTERN_DLL_EXPORT BOOL WINAPI DllMain(HMODULE hModule, DWORD ul_reason_for_call, LPVOID lpReserved) |
Dan is in een x64 build DllMain terug te vinden en werkt de DLL (start calc.exe of MsgBox).
Getest door de DLL in een applicatie te injecteren en te laden met "rundll32.exe test.dll DllMain"
Echter in een x86 build is DllMain mangled en geeft _DLLMain@12 als export in "Dll Export Viewer".
De applicatie wil de DLL niet laden en rundll32 geeft de foutmelding "Missing entry: DLLMain" maar start wel calc.exe of de MsgBox.
Waarom werkt DllMain niet "by default" en hoe los ik dit op?
Het zal wel iets simpels zijn maar ik zit er al een week op vast.

Being a hacker does not say what side you are on. Being a hacker means you know how things actually work and can manipulate the way things actually work for good or for harm.
Come to the dark side. We've got cookies.