一.注册表注入
AppInit_DLLs值在以下注册表项中找到:
HKEY_LOCAL_MACHINE\Software\Microsoft\Windows NT\CurrentVersion\Windows
在此值中指定的所有 Dll 都被加载的每个基于 Windows 的应用程序中。当User32.dll被影射到一个新的进程的时候,会收到DLL_PROCESS_ATTACH通知。User32.dl会取得上述注册表键的值,并调用LOadlibrary 来载入这个字符串中制定的所有DLL。只有加载User32.dll的应用程序才会使用到上述的注册表来注入DLL 。U我们的DLL只会被影射到那些使用了User32.dll的进程中,所有基于GUI的应用程序都使用了User32.dll,但大多数CUI应用程序没有使用User32.dll。
二.使用windows挂钩(hook)注入
调用SetWindowsHookEx函数来安装挂钩:
ex: HHOOK hHook = SetWindowsHookEx(WH_GETMESSAGE,GetMsgProc,hInstDll,0);
第一个参数表示安装挂钩类型:可以参考:
Hook | Scope |
---|---|
WH_CALLWNDPROC | Thread or global |
WH_CALLWNDPROCRET | Thread or global |
WH_CBT | Thread or global |
WH_DEBUG | Thread or global |
WH_FOREGROUNDIDLE | Thread or global |
WH_GETMESSAGE | Thread or global |
WH_JOURNALPLAYBACK | Global only |
WH_JOURNALRECORD | Global only |
WH_KEYBOARD | Thread or global |
WH_KEYBOARD_LL | Global only |
WH_MOUSE | Thread or global |
WH_MOUSE_LL | Global only |
WH_MSGFILTER | Thread or global |
WH_SHELL | Thread or global |
WH_SYSMSGFILTER | Global only |
第二个参数是一个函数的地址,第三个参数标示一个DLL,这个DLL包含这第二个参数指定的函数,第四个参数为线程ID。
例:进程Pa安装了挂钩,当第一个参数为WH_GETMESSAGE,当进程pb中的一个线程准备向一个窗口发送消息会:
- 系统检测该进程是否安装了WH_GETMESSAGE挂钩
- 系统检测GetMsgProc所在的DLL是否被影射到该进程(pb)的地址空间中
- 如果尚未被影射,那么系统会强制将该DLL影射到该进程(pb)中并将该进程中该DLL的锁计数器递增