内核中通过给线程插apc注入dll

void ApcLoadDll(PVOID NormalContext, PVOID SystemArgument1, PVOID SystemArgument2);
void ApcLoadDllEnd();
PMDL pMdl = NULL;
void ApcKernelRoutine( IN struct _KAPC *Apc, 
					  IN OUT PKNORMAL_ROUTINE *NormalRoutine, 
					  IN OUT PVOID *NormalContext, 
					  IN OUT PVOID *SystemArgument1, 
					  IN OUT PVOID *SystemArgument2 ) 
{
	if (Apc)
		ExFreePool(Apc);
	if(pMdl)
	{
		MmUnlockPages(pMdl);
		IoFreeMdl (pMdl);
		pMdl = NULL;
	}
	DbgPrint("ApcKernelRoutine called. Memory freed.");
}
VOID AddApcIngectDll(LPSTR DllFullPath, PETHREAD Thread,ULONG pTargetProcess,void *LoadLibraryWAddr)
{
	PRKAPC pApc = NULL; 
	PVOID pMappedAddress = NULL; 
	ULONG dwSize = 0;
	KAPC_STATE ApcState; 
	int *p=NULL;

	NTSTATUS Status = STATUS_UNSUCCESSFUL;
	if ( MmIsAddressValid((PVOID)Thread) == TRUE)
	{
		pApc = ExAllocatePool(NonPagedPool, sizeof(KAPC));
		if (!pApc)
		{
			DbgPrint("Failed to allocate memory for the APC structure");
			return ;
		}
		dwSize = 386;//这个长度是我们写的大片的nop
		pMdl = IoAllocateMdl (ApcLoadDll, dwSize, FALSE,FALSE,NULL);
		if (!pMdl)
		{
			DbgPrint(" Failed to allocate MDL");
			ExFreePool (pApc);
			return STATUS_INSUFFICIENT_RESOURCES;
		}
		__try
		{
			MmProbeAndLockPages (pMdl,KernelMode,IoWriteAccess);
		}
		__except (EXCEPTION_EXECUTE_HANDLER)
		{
			DbgPrint("Exception during MmProbeAndLockPages");
			IoFreeMdl (pMdl);
			ExFreePool (pApc);
			return STATUS_UNSUCCESSFUL;
		}
		KeStackAttachProcess((ULONG *)pTargetProcess,&ApcState);//进入目标进程的上下文
		pMappedAddress = MmMapLockedPagesSpecifyCache (pMdl,UserMode,MmCached,NULL,FALSE,NormalPagePriority);//把分配好的内存映射进目标进程里面
		if (!pMappedAddress)
		{
			DbgPrint("Cannot map address");
			KeUnstackDetachProcess (&ApcState);
			IoFreeMdl (pMdl);
			ExFreePool (pApc);
			return STATUS_UNSUCCESSFUL;
		}
		else 
			DbgPrint("UserMode memory at address: 0x%p",pMappedAddress);
		wcscpy ((unsigned char*)pMappedAddress + 0x16, DllFullPath);//将dll路径拷贝到目标进程空间
		p=(int*)((unsigned char*)pMappedAddress+6);
		*p=(int)((unsigned char*)pMappedAddress + 0x16);
		p=(int*)((unsigned char*)pMappedAddress+1);
		*p=LoadLibraryWAddr;
		KeUnstackDetachProcess (&ApcState); //恢复咱原来的上下文
		//初始化APC,插APC
		KeInitializeApc(pApc,
			(PETHREAD)Thread,
			OriginalApcEnvironment,
			&ApcKernelRoutine,
			NULL,
			(PKNORMAL_ROUTINE)pMappedAddress,
			UserMode,
			(PVOID) NULL);
		if (!KeInsertQueueApc(pApc,0,NULL,0))
		{
			DbgPrint("KernelExec -> Failed to insert APC");
			MmUnlockPages(pMdl);
			IoFreeMdl (pMdl);
			ExFreePool (pApc);
			return STATUS_UNSUCCESSFUL;
		}
		else
		{
			DbgPrint("APC delivered");
		}
		//使线程处于警告状态,注意不同操作系统的ETHREAD
		if(!*(char *)((char *)Thread+0x4a))
		{
			*(char *)((char *)Thread+0x4a) = TRUE;
		}
	}
}

//枚举指定进程的线程
NTSTATUS IngectDll(PEPROCESS Process,LPSTR DllFullPath,void *LoadLibraryWAddr)
{
	ULONG i;
	PETHREAD txtd;
	PEPROCESS txps;
	NTSTATUS st = STATUS_UNSUCCESSFUL;
	for (i=8;i<=65536;i=i+4)
	{
		st = PsLookupThreadByThreadId(i,&txtd);
		if ( NT_SUCCESS(st) )
		{
			txps=IoThreadToProcess(txtd); 
			if ( txps == Process )    
			{
				AddApcIngectDll(DllFullPath, txtd,Process,LoadLibraryWAddr);
				return STATUS_SUCCESS;      //只需要枚举一个线程就够了。因为我们注入dll只需要调用一次

			}
		}
	}
	return STATUS_SUCCESS;
}
__declspec(naked) void ApcLoadDll(PVOID NormalContext, PVOID SystemArgument1, PVOID SystemArgument2)
{
	__asm 
	{       
		mov eax,0xabcdef //LoadLibraryW的地址这是是需要复制到目标进程空间之后再赋值的
			push 0xabcdef //这是是需要复制到目标进程空间之后再赋值的
			call eax
			jmp end
			nop //分配内存
			nop
			nop
			nop
			nop
			nop
			nop
			nop
			nop
			nop
			nop
			nop
			nop
			nop
			nop
			nop
			nop
			nop
			nop
			nop
			nop
			nop
			nop
			nop
			nop
			nop
			nop
			nop
			nop
			nop
			nop
			nop
			nop
			nop
			nop
			nop
			nop
			nop
			nop
			nop
			nop
			nop
			nop
			nop
			nop
			nop
			nop
			nop
			nop
			nop
			nop
			nop
			nop
			nop
			nop
			nop
			nop
			nop
			nop
			nop
			nop
			nop
			nop
			nop
			nop
			nop
			nop
			nop
			nop
			nop
			nop
			nop
			nop
			nop
			nop
			nop
			nop
			nop
			nop
			nop
			nop
			nop
			nop
			nop
			nop
			nop
			nop
			nop
			nop
			nop
			nop
			nop
			nop
			nop
			nop
			nop
			nop
			nop
			nop
			nop
			nop
			nop
			nop
			nop
			nop
			nop
			nop
			nop
			nop
			nop
			nop
			nop
			nop
			nop
			nop
			nop
			nop
			nop
			nop
			nop
			nop
			nop
			nop
			nop
			nop
			nop
			nop
			nop
			nop
			nop
			nop
			nop
			nop
			nop
			nop
			nop
			nop
			nop
			nop
			nop
			nop
			nop
			nop
			nop
			nop
			nop
			nop
			nop
			nop
			nop
			nop
			nop
			nop
			nop
			nop
			nop
			nop
			nop
			nop
			nop
			nop
			nop
			nop
			nop
			nop
			nop
			nop
			nop
			nop
			nop
			nop
			nop
			nop
			nop
			nop
			nop
			nop
			nop
			nop
			nop
			nop
			nop
			nop
			nop
			nop
			nop
			nop
			nop
			nop
			nop
			nop
			nop
			nop
			nop
			nop
			nop
			nop
			nop
			nop
			nop
			nop
			nop
			nop
			nop
			nop
			nop
			nop
			nop
			nop
			nop
			nop
			nop
			nop
			nop
			nop
			nop
			nop
			nop
			nop
			nop
			nop
			nop
			nop
			nop
			nop
			nop
			nop
			nop
			nop
			nop
			nop
			nop
			nop
			nop
			nop
			nop
			nop
			nop
			nop
			nop
			nop
			nop
			nop
			nop
			nop
			nop
			nop
			nop
			nop
			nop
			nop
			nop
			nop
			nop
			nop
			nop
			nop
			nop
			nop
			nop
			nop
			nop
			nop
			nop
			nop
			nop
			nop
			nop
			nop
			nop
			nop
			nop
			nop
			nop
			nop
			nop
			nop
			nop
			nop
			nop
			nop
			nop
			nop
			nop
			nop
			nop
			nop
			nop
			nop
			nop
			nop
			nop
			nop
			nop
			nop
			nop
			nop
			nop
			nop
			nop
			nop
			nop
			nop
			nop
			nop
			nop
			nop
			nop
			nop
			nop
			nop
			nop
			nop
			nop
			nop
			nop
			nop
			nop
			nop
			nop
			nop
			nop
			nop
			nop
			nop
			nop
			nop
			nop
			nop
			nop
			nop
			nop
			nop
			nop
			nop
			nop
			nop
			nop
			nop
			nop
			nop
			nop
			nop
			nop
			nop
			nop
			nop
			nop
			nop
			nop
			nop
			nop
			nop
			nop
			nop
			nop
			nop
			nop
			nop
			nop
			nop
			nop
			nop
			nop
			nop
			nop
			nop
			nop
			nop
			nop
			nop
			nop
			nop
			nop
			nop
			nop
			nop
			nop
			nop
			nop
			nop
			nop
			nop
			nop
			nop
			nop
			nop
			nop
			nop
			nop
			nop
			nop
			nop
			nop
			nop
			nop
			nop
			nop
			nop
			nop
			nop
			nop
			nop
			nop
			nop
			nop
			nop
			nop
			nop
			nop
end:
		ret 0x0c
	}
}


  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
01.漫谈兼容内核之一:Wine的系统结构.pdf 02.漫谈兼容内核之二:关于kernel-win32的对象管理.pdf 03.漫谈兼容内核之三:关于kernel-win32的文件操作.pdf 04.漫谈兼容内核之四:Kernel-win32的进程管理.pdf 05.漫谈兼容内核之五:Kernel-win32的系统调用机制.pdf 06.漫谈兼容内核之六:二进制映像的类型识别.pdf 07.漫谈兼容内核之七:Wine的二进制映像装入和启动.pdf 08.漫谈兼容内核之八:ELF映像的装入(一).pdf 09.漫谈兼容内核之九:ELF映像的装入(二).pdf 10.漫谈兼容内核之十:Windows的进程创建和映像装入.pdf 11.漫谈兼容内核之十一:Windows_DLL的装入和连接.pdf 12.漫谈兼容内核之十二:Windows的APC机制.pdf 13.漫谈兼容内核之十三:关于“进程挂靠”.pdf 14.漫谈兼容内核之十四:Windows的跨进程操作.pdf 15.漫谈兼容内核之十五:Windows线程的等待和唤醒机制.pdf 16.漫谈兼容内核之十六:Windows的进程间通信.pdf 17.漫谈兼容内核之十七:再谈windows的进程创建.pdf 18.漫谈兼容内核之十八:Windows的LPC机制.pdf 19.漫谈兼容内核之十九:Windows线程间的强相互作用.pdf 20.漫谈兼容内核之二十:Windows线程的系统空间堆栈.pdf 21.漫谈兼容内核之二十一:Windows进程的用户空间.pdf 22.漫谈兼容内核之二十二:Windows线程的调度和运行.pdf 23.漫谈兼容内核之二十三:关于TLS.pdf 24.漫谈兼容内核之二十四:Windows的结构化异常处理(一).pdf 25.漫谈兼容内核之二十五:Windows的结构化异常处理(二).pdf 26.漫谈兼容内核之二十六:Windows的结构化异常处理(三).pdf
漫谈兼容内核之一:ReactOS怎样实现系统调用 漫谈兼容内核之二:关于kernel-win32的对象管理 漫谈兼容内核之三:Kernel-win32的文件操作 漫谈兼容内核之四:Kernel-win32的进程管理 漫谈兼容内核之五:Kernel-win32的系统调用机制 漫谈兼容内核之六:二进制映像的类型识别 漫谈兼容内核之七:Wine的二进制映像装入和启动 漫谈兼容内核之八:ELF映像的装入(一) 漫谈兼容内核之九:ELF映像的装入(二) 漫谈兼容内核之十:Windows的进程创建和映像装入 漫谈兼容内核之十一:Windows DLL的装入和连接 漫谈兼容内核之十二:Windows的APC机制 漫谈兼容内核之十三:关于“进程挂靠” 漫谈兼容内核之十四:Windows的跨进程操作 漫谈兼容内核之十五:Windows线程的等待、唤醒机制 漫谈兼容内核之十六:Windows的进程间通信 漫谈兼容内核之十七:再谈Windows的进程创建 漫谈兼容内核之十八:Windows的LPC机制 漫谈兼容内核之十九:Windows线程间的强相互作用 漫谈兼容内核之二十:Windows线程的系统空间堆栈 漫谈兼容内核之二十一:Windows进程的用户空间 漫谈兼容内核之二十二:Windows线程的调度和运行 漫谈兼容内核之二十三:关于TLS 漫谈兼容内核之二十四:Windows的结构化异常处理(一) 漫谈兼容内核之二十五:Windows的结构化异常处理(二) 漫谈兼容内核之二十六:Windows的结构化异常处理(三)
谈兼容内核之一:ReactOS怎样实现系统调用.pdf 漫谈兼容内核之二:关于kernel -win32的对象管理.pdf 漫谈兼容内核之三:关于kernel-win32的文件操作.pdf 漫谈兼容内核之四:Kernel-win32的进程管理.pdf 漫谈兼容内核之五:Kernel-win32的系统调用机制.pdf 漫谈兼容内核之六:二进制映像的类型识别.pdf 漫谈兼容内核之七:Wine的二进制映像装入和启动.pdf 漫谈兼容内核之八:ELF映像的装入_一_.pdf 漫谈兼容内核之九:ELF映像的装入_二_.pdf 漫谈兼容内核之十:Windows的进程创建和映像装入.pdf 漫谈兼容内核之十一:Windows DLL的装入和连接.pdf 漫谈兼容内核之十 二:Windows的APC机制.pdf 漫谈兼容内核之十三:关于“进程挂靠”.pdf 漫谈兼容内核之十四:Windows的跨进程操作.pdf 漫谈兼容内核之十五:Windows线程的等待和唤醒机制.pdf 漫谈兼容内核之十六:Windows的进程间通信.pdf 漫谈兼容内核之十七:再谈Windows的进程创建.pdf 漫谈兼容内核之十八:Windows的LPC机制.pdf 漫谈兼容内核之十九:Windows线程间的强相互作用.pdf 漫谈兼容内核之二十:Windows线程的系统空间堆栈.pdf 漫谈兼容内核之二十一:Windows进程的用户空间.pdf 漫谈兼容内核之二十二:Windows线程的调度和运行.pdf 漫谈兼容内核之二十三:关于TLS.pdf 漫谈兼容内核之二十四:Windows的结构化异常处理(一).pdf 漫谈兼容内核之二十五:Windows的结构化异常处理(二).pdf 漫谈兼容内核之二十六:Windows的结构化异常处理(三).pdf
01.漫谈兼容内核之一:Wine的系统结构.pdf 02.漫谈兼容内核之二:关于kernel-win32的对象管理.pdf 03.漫谈兼容内核之三:关于kernel-win32的文件操作.pdf 04.漫谈兼容内核之四:Kernel-win32的进程管理.pdf 05.漫谈兼容内核之五:Kernel-win32的系统调用机制.pdf 06.漫谈兼容内核之六:二进制映像的类型识别.pdf 07.漫谈兼容内核之七:Wine的二进制映像装入和启动.pdf 08.漫谈兼容内核之八:ELF映像的装入(一).pdf 09.漫谈兼容内核之九:ELF映像的装入(二).pdf 10.漫谈兼容内核之十:Windows的进程创建和映像装入.pdf 11.漫谈兼容内核之十一:Windows_DLL的装入和连接.pdf 12.漫谈兼容内核之十二:Windows的APC机制.pdf 13.漫谈兼容内核之十三:关于“进程挂靠”.pdf 14.漫谈兼容内核之十四:Windows的跨进程操作.pdf 15.漫谈兼容内核之十五:Windows线程的等待和唤醒机制.pdf 16.漫谈兼容内核之十六:Windows的进程间通信.pdf 17.漫谈兼容内核之十七:再谈windows的进程创建.pdf 18.漫谈兼容内核之十八:Windows的LPC机制.pdf 19.漫谈兼容内核之十九:Windows线程间的强相互作用.pdf 20.漫谈兼容内核之二十:Windows线程的系统空间堆栈.pdf 21.漫谈兼容内核之二十一:Windows进程的用户空间.pdf 22.漫谈兼容内核之二十二:Windows线程的调度和运行.pdf 23.漫谈兼容内核之二十三:关于TLS.pdf 24.漫谈兼容内核之二十四:Windows的结构化异常处理(一).pdf 25.漫谈兼容内核之二十五:Windows的结构化异常处理(二).pdf 26.漫谈兼容内核之二十六:Windows的结构化异常处理(三).pd

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值