文档章节

ring0下注入DLL

simpower
 simpower
发布于 2019/11/18 10:43
字数 865
阅读 35
收藏 0

最近有在做一个东西,需要在ring0下拦截进程启动并注入DLL(dll用于hook ring3下的API),很多种实现方法,此处采用sudami大神提供的思路,另一位大侠提供的参考代码。虽然这个东西没什么技术含量,但对于我这种刚入门内核的人还是搞了很久才做出来,蓝屏很多,要注意很多细节.

思路:进程创建完时是一个空水壶,里面没有沸腾的热水(threads),于是系统调用NtCreateThread创建其主线程(给空水壶注水 – 凉水),在这个暂停的线程里面折腾了一阵后完事了也厌倦了,于是系统跳了出来,回到进程空间中,调用Kernel32.dll去通知CSRSS.EXE,对它说:“这里有一个新进程出生了,你在你的表里标记一下”。然后就开始加载DLL啦,把系统KnownDLLs中的自己需要的DLL都Map一份到这个大水壶中。接着KiThreadStartup加热水壶中的凉水,于是水就开始沸腾了,此时主线程开始工作。。。

拦截NtCreateThread,取得当前线程上下文,保存它要返回的地址(会回到空水壶中去),劫持为我们自己分配的地址,在其中填充ShellCode来加载目的DLL。至于选择Buffer,思路很多。这里可简单的Attach到当前进程,在充足的虚拟2GB进程地址空间中分配属于你自己的一块小内存,够放ShellCode足矣。示意图如下:

 

代码:写的很丑

NTSTATUS	MyNtCreateThread
(
	OUT		PHANDLE ThreadHandle,
	IN			ACCESS_MASK DesiredAccess,
	IN			POBJECT_ATTRIBUTES ObjectAttributes OPTIONAL,
	IN			HANDLE ProcessHandle,
	OUT		PCLIENT_ID ClientId,
	IN			PCONTEXT ThreadContext,
	IN			PHANDLE InitialTeb,
	IN			BOOLEAN CreateSuspended
)
{
	pfnNtCreateThread  oldNtCreateThread = (pfnNtCreateThread)SystemServiceAddr[ServiceCreateThreadID];
	if(IsHandleExist(ProcessHandle)){

	CHAR				ProcessName[16];
	NTSTATUS		ObjectStatus;
	PRKPROCESS	pProcess;
	POBJECT_TYPE PsProcessType;
	NTSTATUS		ResultStatus;
	DbgPrint(   "CreateThread(%08x,%08x,%08x,%08x,%08x,%08x,%08x,%08x)\n",
		ThreadHandle,
		DesiredAccess,
		ObjectAttributes,
		ProcessHandle,
		ClientId,
		ThreadContext,
		InitialTeb,
		CreateSuspended);
	PsProcessType = NULL;

	///获得EPROCESS对象
	ObjectStatus = ObReferenceObjectByHandle(
		ProcessHandle,
		PROCESS_ALL_ACCESS,
		PsProcessType,
		UserMode,
		(PVOID *)&pProcess,
		NULL);
	if (ObjectStatus ==STATUS_SUCCESS)
	{
		//ProcessName	=	(CHAR*)pProcess+0x174;
		RtlStringCbCopyA(ProcessName,16,(CHAR*)pProcess+0x174);
		_strlwr(ProcessName);//进程名转换为小写 
		if(strstr(ProcessName,Iexplore))
		{
			NTSTATUS AllocStatus;
			UCHAR * BaseAddr;
			SIZE_T RegionSize;
			ULONG Win32StartAddr;
			ULONG LoadLibraryAddr;  
			RegionSize = 100;
			BaseAddr = NULL;
			PsProcessType = NULL;
			KAPC_STATE  apcstate;
			LoadLibraryAddr	=	g_addrinfo.LoadLibraryAddr;
			if(ThreadContext)
			{
				Win32StartAddr = ThreadContext->Eax;

				if (!Win32StartAddr)
				{
					DbgPrint("Win32StartAddr not set\n");
				}
				else
				{
					//切换上下文
					KeDetachProcess();
					KeAttachProcess(pProcess);

					//allocating memory with PAGE_EXECUTE_READWRITE access rights
// 					KeUnstackDetachProcess(&apcstate);
// 					KeStackAttachProcess(pProcess,&apcstate);
					AllocStatus = ZwAllocateVirtualMemory(
						NtCurrentProcess(),
						(PVOID*)&BaseAddr,
						0,
						&RegionSize,
						MEM_COMMIT        ,
						PAGE_EXECUTE_READWRITE);
					if (AllocStatus!=STATUS_SUCCESS)
					{
						DbgPrint("Fail to Allocate memory! AllocStatus = 0x%x\n",AllocStatus);
					}
					else
					{
						ULONG Offset = 0;
						ULONG OffsetStrAddr = 0;

						DbgPrint("Memory allocation OK! BaseAddr = 0x%x\n",BaseAddr);

						BaseAddr[Offset] = 0x68; 						//push	0xXXXXXXXX
						++Offset;
						OffsetStrAddr = Offset;
						Offset += 4;

						BaseAddr[Offset] = 0xbb; 						//mov ebx,LoadLibraryAddr
						++Offset;

						*(ULONG *)(BaseAddr+Offset) = LoadLibraryAddr;
						Offset += 4;

						BaseAddr[Offset] = 0xff; 						//call ebx
						++Offset;
						BaseAddr[Offset] = 0xd3;
						++Offset;

						BaseAddr[Offset] = 0xb8;						//mov eax,Win32StartAddr
						++Offset;
						*(ULONG *)(BaseAddr+Offset) = Win32StartAddr;
						Offset += 4;

						BaseAddr[Offset] = 0x50; 						//push eax
						++Offset;

						BaseAddr[Offset] = 0xc3; 						//ret
						++Offset;

						*(ULONG *)(BaseAddr+OffsetStrAddr) = (ULONG)(BaseAddr + Offset); // parameter for LoadLibrary

						//tSetKey.dll
						//memcpy(BaseAddr+Offset,"tSetKey.dll",strlen("tSetKey.dll")+1);
						memcpy(BaseAddr+Offset,g_addrinfo.DllPath,sizeof(g_addrinfo.DllPath));

						DbgPrint("<EAX:0x%08x>\n",Win32StartAddr);
						Win32StartAddr = (ULONG)BaseAddr;
					}//end ZwAllocateVirtualMemory
					//切换上下文
					KeDetachProcess();
					///设置Win32StartAddr
					ThreadContext->Eax = Win32StartAddr;
				}
			}//end ThreadConext
			ObDereferenceObject(pProcess);
		}//end strstr
		RemoveHandle(ProcessHandle);
	}//end obj
	else
	{
		DbgPrint(("Fail to RefernceObject. Stopping Injecting Technique.\n"));
	}
}//end Ishandleexist;
	return oldNtCreateThread(ThreadHandle,DesiredAccess,ObjectAttributes,ProcessHandle,ClientId,ThreadContext,InitialTeb,CreateSuspended);
}

对于一个进程的多线程环境 ,这里用一个链表来维护进程句柄,同时hook zwcreateprocessex,在里面添加句柄,在createthread里删除.

本文转载自:http://www.voidcn.com/article/p-vmuopivn-vo.html

simpower
粉丝 29
博文 708
码字总数 53502
作品 0
海淀
程序员
私信 提问
加载中

评论(0)

面试遇到这样的人你怎么做,我飞了面试官。

在武汉群光旁边百老汇面试了一家做金Jin融(GuPiao)直播的公司,写字楼挺高级的,三星级,电梯都要刷卡,不过公司是格子间,挤满了10多人。 我是去面试高级PHP的,刚开始和他们的运营老总聊的...

吔宩吖你
2016/09/30
7.6K
45
Ring0和Ring3 HOOK 大检查

1、HOOK SERVICE TABLE:HOOK SSDT 这种方法对于拦截 NATIVE API 来说用的比较多。 SSDT hook,一句话——Windows把需要调用的内核API地址全都存在了 一个表中(System Service Dispatch Tab...

simpower
2018/08/02
43
0
深入理解windows

Windows中的基本概念: 1. Windows的源起 压榨CPU的运算能力,用光他的每一个时钟周期. DOS时代(不支持多任务) 协作式多任务系统: 优点是实现简单;缺点是有进程占住CPU不放(特殊时代的产物) ...

木易火山
2017/07/16
9
0
Dll注入经典方法完整版

 Pnig0s1992:算是复习了,最经典的教科书式的Dll注入。 总结一下基本的注入过程,分注入和卸载 注入Dll: 1,OpenProcess获得要注入进程的句柄 2,VirtualAllocEx在远程进程中开辟出一段...

nothingfinal
2013/12/09
0
0
在Visual Studio中将dll以资源的形式嵌入exe中

一、Dll的优点: 1、扩展应用程序的特性 2、简化项目管理 3、有助于节省内存 4、促进资源的共享 5、促进本地化 6、有助于解决平台间的差异 7、可用于特殊目的 有关于dll及注入相关理论资料,...

Qing-Huan
2019/12/25
0
0

没有更多内容

加载失败,请刷新页面

加载更多

如何在Javascript数组的开头添加新的数组元素?

问题: I have a need to add or prepend elements at the beginning of an array. 我需要在数组的开头添加或添加元素。 For example, if my array looks like below: 例如,如果我的数组如下...

技术盛宴
30分钟前
11
0
利用Python实现SQL自动化

笔者在工作中经常要使用SQL,其不乏存在恼人的细微差异和种种限制,但说到底,它是数据行业的基石。因此,对于每一位数据领域的工作者,SQL都是不可或缺的。精通SQL意义非凡。 SQL是很不错,...

Python圈子
32分钟前
10
0
UI库

ViewUI (推荐) amazeui layUI

四季变幻
39分钟前
21
0
如何实现RSA签名与验签

md5,sha1,sha256等签名方式相信大家已经都非常熟悉了,今天介绍如何使用RSA进行签名。 RSA签名使用起来其实也是非常的简单,无非就是使用私钥进行签名,使用公钥进行验签。使用方法如下。 ...

专业写BUG的程序员
41分钟前
17
0
我的Spring Cloud(十):Zipkin 服务跟踪

一、概述 为什么要有服务跟踪,分布式系统中有很多个服务在相互调用,调用关系是错综复杂的,如果这时出现了问题,我们在进行问题排查的时候,或者在优化架构的时候,工作量就比较大,这时候...

Zing丶
42分钟前
37
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部