1,https://www.freesion.com/article/39911454630/
主要介绍四种常见的 Windows DLL 注入技术。
分别为全局钩子、远线程钩子、突破 SESSION 0 隔离的远线程注入和 APC 注入。
有代码段。
2,https://oyeah.blog.csdn.net/article/details/120265888
介绍了十种dll注入方式,配有文字说明和图片,没有代码。
3 https://github.com/suvllian/process-inject
有文字说明,有完整代码。
4 https://blog.csdn.net/CodeBowl/article/details/120171458
hook介绍
5,https://github.com/EasyHook/EasyHook
hook 库
6,https://github.com/TsudaKageyu/minhook
关于注入的监控与防护
注入操作,简单来说就是,将本来不属于该进程的代码强行写入该进程的内存空间,并执行。首先,进程句柄的权限控制,一旦获得了进程的内存空间读写权限就可以往进程中写入任意数据。 其次,是可执行代码完整性检查,检测非法模块或可执行内存块。
关于反射式注入(ReflectiveInject)原理及使用
以dll注入为例,相较于创建远程线程,然后直接调用LoadLibrary来加载dll实现注入;反射式注入也是通过创建远程线程,只是后半部分有差异;反射式注入的dll需要在dll中提供一个接口函数(导出或者不导出)被 远程线程调用,这个函数实现的功能相当于LoadLibrary。反射式注入的好处是实现了无文件注入,操作都是在内存中完成,可以在一定的程度上避免被拦截。
关于远程线程创建
通常使用CreateRemoteThread来创建远程线程来执行在另一个进程空间里面的代码,通过创建线程通知函数(PsSetCreateThreadNotifyRoutine)可以发现系统运行时会有大量的远程线程被创建。首先,当一个进程被创建时,该进程的第一个线程是被其父进程创建的;其次,一个进程可以通过CreateRemoteThread api在某个进程中创建线程。 下面是CreateThreadNotifyRoutine的代码:
NTSTATUS MonitorRemoteThread(HANDLE ProcessId, HANDLE ThreadId,BOOLEAN Create)
{
NTSTATUS status = STATUS_SUCCESS;
PKTHREAD Thread = NULL;
PEPROCESS Process = NULL;
HANDLE ParentPid = NULL;
//线程创建通知函数是在执行创建线程的进程上下文下触发的
//PsGetCurrentProcessId()在ProcessId进程中创建了线程ThreadId
HANDLE CreatingProcess=PsGetCurrentProcessId();
if (Create == TRUE&&
CreatingProcess>(HANDLE)4)
{
if (ProcessId && ThreadId)
{
status = PsLookupThreadByThreadId(ThreadId, &Thread);
if (NT_SUCCESS(status))
{
Process = IoThreadToProcess(Thread);
if (Process)
{
//获取父进程pid
ParentPid=PsGetProcessInheritedFromUniqueProcessId(Process);
if (CreatingProcess!=ParentPid&&
CreatingProcess!=ProcessId)//排除本地线程创建
{
DbgPrint("[%s]pid:%d create a suspicious remote thread %d in pid:%d\n",
__FUNCTION__,
CreatingProcess,
ThreadId,
ProcessId);
}
}
//else
//{
// DbgPrint("[%s] IoThreadToProcess fails!\n", __FUNCTION__);
//}
}
else
{
DbgPrint("[%s]PsLookupThreadByThreadId fails,status:0x%x\n", __FUNCTION__, status);
}
}
}
if (Thread)
{
ObDereferenceObject(Thread);
}
return status;
}
运行效果如下图: