1DLL 的进入点函数 DllMain
BOOL APIENTRY DllMain( HANDLE hModule,
DWORD ul_reason_for_call,
LPVOID lpReserved
)
{
switch (ul_reason_for_call)
{
case DLL_PROCESS_ATTACH:
case DLL_THREAD_ATTACH:
case DLL_THREAD_DETACH:
case DLL_PROCESS_DETACH:
break;
}
return TRUE;
}
DLL_PROCESS_ATTACH:当 DLL 初次映射到进程的地址空间时,系统将调用 DllMain,
并为 ul_reason_for_call 传递值 DLL_PROCESS_ATTACH。此时 DLL 可以执行任何与进
程相关的初始化。实例,如果我将 DLL 注入到一个新的进程后,如果要自动执行一些任务,
则代码写在 case DLL_PROCESS_ATTACH:后。
DLL_PROCESS_DETACH:当 DLL 从进程的地址空间被卸载后,系统将调用 DllMain,
并为 ul_reason_for_call 传递值 DLL_PROCESS_DETACH。例如调用 FreeLibrary,先调用
DllMain 完成 DLL_PROCESS_DETACH 通知后,才从 FreeLibrary 中返回。
DLL_THREAD_ATTACH:当在一个进程中创建线程时,系统要察看当前映射到该进程的地
址空间中的所有 DLL 文件映像,并调用每个带有 DLL_THREAD_ATTACH 的 DllMain 函数,
此时可以告诉 DLL 执行线程的初始化操作。注意,系统不为进程的主线程调用带有
DLL_THREAD_ATTACH 值的任何 DllMain.进程初次启动进程地址空间的 DLL 接到的是
DLL_PROCESS_ATTACH 通知,而不是 DLL_THREAD_ATTACH 通知。
DLL_THREAD_DETACH:线程终止时调用 ExitThread 来撤销线程,此时先调用带
DLL_THREAD_DETACH 的 DLL 的 DllMain,在撤销线程。
2 DLL 注入
2.1 通过 windows 挂钩消息来注入 DLL
先看下面代码:
HHOOK hHook=SetWindowsHookEx(WH_GETMESSAGE,GetMsgProc,hinstDll,0);
WH_GETMESSAGE:指出钩子的类型,是消息钩子。
GetMsgProc:窗口准备处理消息的时候,系统调用的函数地址??????????
hinstDll:DLL 被映射到的进程的地址空间中的 RVA。
评论0
最新资源