我正在尝试从注入的dll加载程序集(c ++),
首先我挂钩:
pMono1 = (Mono1Fn)DetourFunction((PBYTE)GetProcAddress(addr,"mono_assembly_load_from_full"), (PBYTE)Mono1);
pMono2 = (Mono2Fn)GetProcAddress(addr, "mono_image_open_full");
mono_jit_exec_ = (mono_jit_exec_t)GetProcAddress(addr,"mono_jit_exec");
pMonoDomainGet = (mono_domain_get_t)GetProcAddress(addr,"mono_domain_get");
(我已经检查过addr是否正确)
然后我做的是
MonoAssembly* __cdecl Mono1(MonoImage *image, const char*fname, MonoImageOpenStatus *status, gboolean refonly)
{
if(!Loaded)
{
Loaded = true;
OpenAssembly();
}
return pMono1(image,fname,status,refonly);
}
所以,我要做的是:
当目标进程打开一个程序集时,我打开我的原始程序集并加载
但问题是:打开的程序集不会运行。
这是方法OpenAssembly():
void OpenAssembly()
{
MonoImageOpenStatus status = MONO_IMAGE_ERROR_ERRNO;
MonoImage *Image = (MonoImage*)pMono2("B:\\AsmTest.dll",&status,FALSE);
MonoAssembly *Assm = (MonoAssembly*)Mono1(Image,"B:\\AsmTest.dll",&status,FALSE);
char* in[] = {"B:\\AsmTest.dll" };
cout << "In[0] : " << in[0] << endl;
mono_jit_exec_((MonoDomain*)pMonoDomainGet(),Assm,0,in);
}
在嵌入式单声道教程中,他们说mono_jit_exec
调用Main方法,
但它没有,(这导致我认为错误在我的装配中),
这里是简单汇编的代码:
public class AssemblyTest
{
static void Main()
{
MessageBox.Show("I do WORK :d");
}
}
就像我之前说的那样,我的问题是Main()
方法永远不会在进程中调用。(因为MessageBox没有显示)
供您参考:我已将程序集放入B盘。
我认为我的问题很简单,但我找不到原因。
先谢谢,我希望你明白我的意思:)。