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;
- }
运行效果如下图: