#include <TlHelp32.h>
#include <psapi.h>
#pragma comment( lib, "psapi.lib")
char* GetModulePatchByName(HANDLE hProcess, char* module_name)
{
HMODULE hMods[1024];
DWORD cbNeeded;
CHAR szModName[MAX_PATH];
if (K32EnumProcessModules(hProcess, hMods, sizeof(hMods), &cbNeeded))
{
for (int i = 0; i < (cbNeeded / sizeof(HMODULE)); i++)
{
if (K32GetModuleFileNameExA(hProcess, hMods[i], szModName, sizeof(szModName) / sizeof(TCHAR)))
{
if (strstr(szModName, module_name))
{
break;
}
}
}
}
return szModName;
}
bool BlockAPI_mono(HANDLE hProcess, char* api_name)
{
CHAR _asm_ret[] = { 0xC3 };
char* mono_patch = GetModulePatchByName(hProcess, "mono.dll");
if (mono_patch == NULL)
return false;
HMODULE mono_lib = LoadLibraryA(mono_patch);
if (mono_lib == NULL)
return false;
FARPROC func = GetProcAddress(mono_lib, api_name);
if (func == NULL)
return false;
DWORD dwOldProtect = 0;
VirtualProtectEx(hProcess, reinterpret_cast<LPVOID>(func), sizeof(_asm_ret), PAGE_EXECUTE_READWRITE, &dwOldProtect);
bool write = WriteProcessMemory(hProcess, reinterpret_cast<LPVOID>(func), reinterpret_cast<LPCVOID>(_asm_ret), sizeof(_asm_ret), 0);
VirtualProtectEx(hProcess, reinterpret_cast<LPVOID>(func), sizeof(_asm_ret), dwOldProtect, &dwOldProtect);
return write;
}
int main()
{
HANDLE hProcess = GetCurrentProcess();
if (BlockAPI_mono(hProcess, "mono_get_root_domain")
&& BlockAPI_mono(hProcess, "mono_thread_attach")
&& BlockAPI_mono(hProcess, "mono_assembly_open")
&& BlockAPI_mono(hProcess, "mono_assembly_get_image")
&& BlockAPI_mono(hProcess, "mono_class_from_name")
&& BlockAPI_mono(hProcess, "mono_class_get_method_from_name")
&& BlockAPI_mono(hProcess, "mono_runtime_invoke"))
{
printf("mono inject fixed!\n");
}
else
{
printf("no!\n");
}
system("pause");
return 0;
}