-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathdllmain.cpp
More file actions
69 lines (55 loc) · 2.62 KB
/
dllmain.cpp
File metadata and controls
69 lines (55 loc) · 2.62 KB
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
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
#include <windows.h>
#include <thread>
#include "proxy.h"
#include <string>
typedef void MonoDomain;
typedef void MonoAssembly;
typedef void MonoImage;
typedef void MonoClass;
typedef void MonoMethod;
typedef MonoDomain* (__cdecl* t_mono_get_root_domain)(void);
typedef void(__cdecl* t_mono_thread_attach)(MonoDomain*);
typedef MonoAssembly* (__cdecl* t_mono_assembly_open)(const char*, void*);
typedef MonoImage* (__cdecl* t_mono_assembly_get_image)(MonoAssembly*);
typedef MonoClass* (__cdecl* t_mono_class_from_name)(MonoImage*, const char*, const char*);
typedef MonoMethod* (__cdecl* t_mono_class_get_method_from_name)(MonoClass*, const char*, int);
typedef void* (__cdecl* t_mono_runtime_invoke)(MonoMethod*, void*, void**, void**);
void MainThread(HMODULE hModule) {
const char* mono_name = "mono-2.0-bdwgc.dll";
HMODULE hMono = nullptr;
while ((hMono = GetModuleHandleA(mono_name)) == nullptr) {
Sleep(100);
}
auto fnGetRootDomain = (t_mono_get_root_domain)GetProcAddress(hMono, "mono_get_root_domain");
auto fnThreadAttach = (t_mono_thread_attach)GetProcAddress(hMono, "mono_thread_attach");
auto fnAssemblyOpen = (t_mono_assembly_open)GetProcAddress(hMono, "mono_assembly_open");
auto fnAssemblyGetImage = (t_mono_assembly_get_image)GetProcAddress(hMono, "mono_assembly_get_image");
auto fnClassFromName = (t_mono_class_from_name)GetProcAddress(hMono, "mono_class_from_name");
auto fnMethodFromName = (t_mono_class_get_method_from_name)GetProcAddress(hMono, "mono_class_get_method_from_name");
auto fnRuntimeInvoke = (t_mono_runtime_invoke)GetProcAddress(hMono, "mono_runtime_invoke");
MonoDomain* domain = fnGetRootDomain();
fnThreadAttach(domain);
char path[MAX_PATH];
GetModuleFileNameA(hModule, path, MAX_PATH);
std::string assemblyPath = path;
assemblyPath = assemblyPath.substr(0, assemblyPath.find_last_of("\\/")) + "\\Doki.dll";
MonoAssembly* assembly = fnAssemblyOpen(assemblyPath.c_str(), NULL);
if (!assembly) return;
MonoImage* image = fnAssemblyGetImage(assembly);
MonoClass* klass = fnClassFromName(image, "Doki", "BootLoader");
if (!klass) return;
MonoMethod* method = fnMethodFromName(klass, "Load", 0);
if (!method) return;
fnRuntimeInvoke(method, NULL, NULL, NULL);
}
BOOL APIENTRY DllMain(HMODULE hModule, DWORD ul_reason_for_call, LPVOID lpReserved) {
switch (ul_reason_for_call) {
case DLL_PROCESS_ATTACH:
DisableThreadLibraryCalls(hModule);
CreateThread(nullptr, 0, (LPTHREAD_START_ROUTINE)MainThread, hModule, 0, nullptr);
break;
case DLL_PROCESS_DETACH:
break;
}
return TRUE;
}