windows 各种inject/hook学习材料(自用)/监控远程线程创建

1,https://www.freesion.com/article/39911454630/

   主要介绍四种常见的 Windows DLL 注入技术。

    分别为全局钩子、远线程钩子、突破 SESSION 0 隔离的远线程注入和 APC 注入。

   有代码段。

2,https://oyeah.blog.csdn.net/article/details/120265888

  介绍了十种dll注入方式,配有文字说明和图片,没有代码。

https://github.com/suvllian/process-inject

      有文字说明,有完整代码。

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;
}

运行效果如下图:

 

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值