код инъекции < /p>
Код: Выделить всё
MonoDomain* mDomain = mFunctions.MonoGetRootDomain();
if (mDomain == nullptr) {
printf("[ DllMain ] Failed to get Mono root domain!\n");
return false;
}
MonoThread* mThread = mFunctions.MonoThreadAttach(mDomain);
if (mThread == nullptr) {
printf("[ DllMain ] Failed to attach thread to Mono domain!\n");
return false;
}
MonoImageOpenStatus imageStatus;
MonoImage* mRawImage = mFunctions.MonoOpenAssemblyFromData((char*)data.data(), data.size(), true, &imageStatus);
if (imageStatus != MONO_IMAGE_OK) {
printf("[ DllMain ] Failed to load Mono assembly from data.\n");
return false;
}
printf("[ DllMain ] Assembly loaded successfully.\n");
MonoImageOpenStatus status;
MonoAssembly* mAssembly = mFunctions.MonoLoadAssemblyFromData(mRawImage, ("\0"), &status, false);
if (mAssembly == nullptr) {
printf("[ DllMain ] Failed to load Mono assembly from image.\n");
return false;
}
if (status == MONO_IMAGE_OK)
{
printf("[ DllMain ] Image is ok.\n");
}
else if (status == MONO_IMAGE_IMAGE_INVALID)
{
printf("[ DllMain ] Image is not ok.\n");
}
< /code>
mono function инициализация < /p>
typedef struct MonoFunctions {
mono_thread_attach MonoThreadAttach;
mono_get_root_domain MonoGetRootDomain;
mono_image_open_from_data MonoOpenAssemblyFromData;
mono_assembly_load_from_full MonoLoadAssemblyFromData;
mono_assembly_get_image MonoAssemblyGetImage;
mono_class_from_name MonoGetClassFromName;
mono_class_get_method_from_name MonoGetMethodFromClass;
mono_runtime_invoke MonoRuntimeInvoke;
mono_string_new MonoStringNew;
} MonoFunctions;
void SetupMonoFunctions(const HMODULE& mHandle, MonoFunctions& mFunctions) {
mFunctions.MonoThreadAttach = (mono_thread_attach)GetProcAddress(mHandle, xorstr_("mono_thread_attach"));
mFunctions.MonoGetRootDomain = (mono_get_root_domain)GetProcAddress(mHandle, xorstr_("mono_get_root_domain"));
mFunctions.MonoOpenAssemblyFromData = (mono_image_open_from_data)GetProcAddress(mHandle, xorstr_("mono_image_open_from_data"));
mFunctions.MonoLoadAssemblyFromData = (mono_assembly_load_from_full)GetProcAddress(mHandle, xorstr_("mono_assembly_load_from_full"));
mFunctions.MonoAssemblyGetImage = (mono_assembly_get_image)GetProcAddress(mHandle, xorstr_("mono_assembly_get_image"));
mFunctions.MonoGetClassFromName = (mono_class_from_name)GetProcAddress(mHandle, xorstr_("mono_class_from_name"));
mFunctions.MonoGetMethodFromClass = (mono_class_get_method_from_name)GetProcAddress(mHandle, xorstr_("mono_class_get_method_from_name"));
mFunctions.MonoRuntimeInvoke = (mono_runtime_invoke)GetProcAddress(mHandle, xorstr_("mono_runtime_invoke"));
mFunctions.MonoStringNew = (mono_string_new)GetProcAddress(mHandle, xorstr_("mono_string_new"));
}
Подробнее здесь: https://stackoverflow.com/questions/794 ... in-assembl