托管注入深入研究
2008-12-11 13:36:11 来源:WEB开发网之前我是这样实现让宿主调用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;
}
- ››深入理解Android消息处理系统——Looper、Handler...
- ››深入理解SET NAMES和mysql(i)_set_charset的区别
- ››深入理解Mysql字符集设置
- ››深入浅出实战攻防恶意PDF文档
- ››深入剖析防火墙策略的执行过程:ISA2006系列之六
- ››深入JavaScript与.NET Framework中的日期时间(3)...
- ››深入JavaScript与.NET Framework中的日期时间(2)...
- ››深入JavaScript与.NET Framework中的日期时间(1)...
- ››深入理解Javascript闭包
- ››深入学习JavaScript中的函数
- ››深入探讨 Android 传感器
- ››深入CSocket编程之阻塞和非阻塞模式
更多精彩
赞助商链接