Windows DLL注入方式
------(内容摘选至《加密与解密第四版》)
一、通过干预导入表处理过程加载DLL
1.静态修改EXE的导入表目录,新增或修改(微软进程Bound import table需要清空,)
2.进程创建初期修改导入表目录(CreateProcess with suspend)
3.DLL劫持,除了注册表KnownDLLs,dll加载的搜索顺序,exe所在目录高于system目录。可以直接劫持msvcrt.dll等
1.静态修改EXE的导入表目录,新增或修改(微软进程Bound import table需要清空,)
2.进程创建初期修改导入表目录(CreateProcess with suspend)
3.DLL劫持,除了注册表KnownDLLs,dll加载的搜索顺序,exe所在目录高于system目录。可以直接劫持msvcrt.dll等
二、改变程序运行流程主动加载目标DLL
1.CreateRemoteThread
2.RtlCreateUserThread(需要自身调用NtTerminateThread)
3.QueueUserApc/NtQueueAPCThread
4.SetThreadContext修改eip/rip
5.内核通过Hook/Notify修改执行流(修改CONTEXT,Hook ntdll ZwContinue)
6.内核调用KeUserModeCallback(依赖于user32.dll,user32.dll加载时初始化。或者直接填写PEB->KernelCallbackTable,win10 CFG 保护无法使用)
7.WriteProcessMemory劫持关键点(ntdll!KiUserApcDispatch,ntdll!ZwTestAlert以及常用的系统函数)
1.CreateRemoteThread
2.RtlCreateUserThread(需要自身调用NtTerminateThread)
3.QueueUserApc/NtQueueAPCThread
4.SetThreadContext修改eip/rip
5.内核通过Hook/Notify修改执行流(修改CONTEXT,Hook ntdll ZwContinue)
6.内核调用KeUserModeCallback(依赖于user32.dll,user32.dll加载时初始化。或者直接填写PEB->KernelCallbackTable,win10 CFG 保护无法使用)
7.WriteProcessMemory劫持关键点(ntdll!KiUserApcDispatch,ntdll!ZwTestAlert以及常用的系统函数)
三、利用系统机制加载DLL
1.SetWindowsHookEx钩子注入
2.AppInit_DLLs注册表注入(user32.dll加载时会调用LoadAppDLLs,读取注册表项,LoadAppInit_DLLs=1)
3.输入法注入,IMME32.DLL
4.SPI网络过滤器注入,编写LSP DLL并安装到系统网络协议栈
5.ShimEngine注入,劫持Windows兼容模式启动程序
1.SetWindowsHookEx钩子注入
2.AppInit_DLLs注册表注入(user32.dll加载时会调用LoadAppDLLs,读取注册表项,LoadAppInit_DLLs=1)
3.输入法注入,IMME32.DLL
4.SPI网络过滤器注入,编写LSP DLL并安装到系统网络协议栈
5.ShimEngine注入,劫持Windows兼容模式启动程序
6.Explorer Shell 注入,右键菜单,程序默认打开方式等(通过文件图标ShellIconOverlayIdentifiers注入)