WEB开发网
开发学院网络安全安全技术 托管注入深入研究 阅读

托管注入深入研究

 2008-12-11 13:36:11 来源:WEB开发网   
核心提示: 之前我是这样实现让宿主调用dll中的一个特定函数的: 在dll被注入之后,我在DllMain函数里将这个特定函数的地址写到共享内存中(这时DllMain里没有调用托管代码,托管注入深入研究(3),所以可以执行),然后主程序读取共享内存中的值, 我非常兴奋,马上进行了验证,再通过远程线程迫使

之前我是这样实现让宿主调用dll中的一个特定函数的:

在dll被注入之后,我在DllMain函数里将这个特定函数的地址写到共享内存中(这时DllMain里没有调用托管代码,所以可以执行),然后主程序读取共享内存中的值,再通过远程线程迫使宿主调用这个特定函数。

于是我又想,既然可以在主程序中用远程线程迫使宿主调用dll中的特定函数,为什么不直接在dll中用相同的方法去调用呢?

我还没有来得及验证,马上又想到:dll跟宿主是一个进程,即使用远程线程,传给CreateRomoteThread函数的第一个参数也是-1(GetCurrentProcess()返回-1),为什么不直接用“近程”线程CreateThread呢?

需要着重强调地是:我当时用CreateThread的目的只是让它调用一个特定函数,而不是要去创建一个线程,虽然最终的确创建了一个线程,不过对于此目的,貌似只是一个副作用。

我非常兴奋,马上进行了验证,成功了!

现在我来总结一下托管代码注入的过程:

首先定义一个线程回调函数,可以在其中调用托管代码:

DWORD CALLBACK ThreadProc(LPVOID lp)
{
//可以在此调用托管代码
return 0;
}
然后在dll的入口函数DllMain里调用CreateThread函数:
BOOL APIENTRY DllMain( HMODULE hModule,
DWORD ul_reason_for_call,
LPVOID lpReserved
)
{
switch (ul_reason_for_call)
{
case DLL_PROCESS_ATTACH:
CreateThread(0,0,ThreadProc,0,0,0);
break;
case DLL_THREAD_ATTACH:
break;
case DLL_THREAD_DETACH:
break;
case DLL_PROCESS_DETACH:
break;
}
return TRUE;
}

上一页  1 2 3 4 5  下一页

Tags:托管 注入 深入

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接