(转载)检测远程线程注入DLL

本文介绍了一种检测远程进程注入DLL的方法,通过检测线程创建时的起始地址来判断是否为恶意注入,并提供了具体的实现代码。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

作者:coNgY1

来源:优快云

原文:https://blog.youkuaiyun.com/a893574301/article/details/80950571

参考GitHub上的AntiInject

1,远程进程注入DLL调用CreateRemoteThread这个API进行注入,而这个API会在目标进程中创建一个进程来调用LoadLibrary来加载自己想注入的DLL从而达到注入效果。

2,在一个进程已经加载的DLL中,每当一个Thread创建的时候就会给每一个加载的DLL发送一个消息DLL_THREAD_ATTACH,我们可以在自己的DLL中来截获每一个线程创建时候的消息,然后判断这个线程起始地址是否是LoadLibraryA/W来判断这个线程是否是通过远程线程注入进来的。

实现代码:

void CheckInject(DWORD dwProcessId);
 
BOOL APIENTRY DllMain( HMODULE hModule,
                       DWORD  ul_reason_for_call,
                       LPVOID lpReserved
					 )
{
	switch (ul_reason_for_call)
	{
	case DLL_THREAD_ATTACH:
		CheckInject(GetCurrentProcessId());    //每次新的线程创建时候检测
		break;
	}
	return TRUE;
}
 
DWORD GetThreadStartAddr(DWORD dwThreadId)
{
	HANDLE hThread = OpenThread(THREAD_QUERY_INFORMATION,FALSE,dwThreadId);
	DWORD dwStartAddr,dwReturnLen;
	if (hThread == NULL)
		return 0;
	NtQueryInformationThread(hThread,            //查询线程起始地址
		ThreadQuerySetWin32StartAddress,
		&dwStartAddr,
		4,
		&dwReturnLen);
	return dwStartAddr;
}
 
void Check_StartAddr(DWORD dwStartAddr,DWORD dwThreadId)
{
	DWORD dwAddr_LoadLibraryA = (DWORD)GetProcAddress(GetModuleHandleA("Kernel32.dll"), "LoadLibraryA");
	DWORD dwAddr_LoadLibraryW = (DWORD)GetProcAddress(GetModuleHandleA("Kernel32.dll"), "LoadLibraryW");
 
	if (dwStartAddr == dwAddr_LoadLibraryA || dwStartAddr == dwAddr_LoadLibraryW)
	{
		if (MessageBoxA(0, "发现注入的DLL线程,是否杀掉?", "提示", MB_OKCANCEL) == IDOK)
		{
			TerminateThread(OpenThread(THREAD_ALL_ACCESS,FALSE,dwThreadId),0);
		}
	}
}
 
void CheckInject(DWORD dwProcessId)
{
	HANDLE hSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPTHREAD, dwProcessId);
 
	THREADENTRY32 te32 = { sizeof(te32) };
	Thread32First(hSnapshot, &te32);
	do
	{
		if (te32.th32OwnerProcessID == dwProcessId)
		{
			Check_StartAddr(GetThreadStartAddr(te32.th32ThreadID),te32.th32ThreadID);    //遍历当前进程所有线程的起始地址
		}
	} while (Thread32Next(hSnapshot, &te32));
}

作者:coNgY1
来源:优快云
原文:https://blog.youkuaiyun.com/a893574301/article/details/80950571

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值