c/c++ windows 远程线程注入

博客介绍了常用的注入手段,包括远程dll注入和远程代码注入。重点讲解了远程线程注入,其核心是Windows API函数CreateRemoteThread,可在另一进程中注入线程并执行,还提及了注入线程的参数设置、内存释放及线程句柄关闭等内容。

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

常用的注入手段有两种:一种是远程的dll的注入,另一种是远程代码的注入;

远程线程注入——其主要核心在于一个Windows API函数CreateRemoteThread,通过它可以在另外一个进程中注入一个线程并执行。

被注入进程A, 注入 进程B  

HMODULE WINAPI LoadLibrary( _In_ LPCTSTR lpFileName);  以它为远程线程的回调;

它的参数是我们B进程的, 但是真正执行的是在A进程,怎么样才能把B进程的字符串地址放到A进程中呢?

if(!EnablePrivilege(GetCurrentProcess()))//提升进程权限
{
    return;
}
HANDLE hProcess = OpenProcess(PROCESS_ALL_ACCESS,NULL,dwPID);
void *pRemoteAdrr = VirtualAllocEx(hProcess,NULL,strlen(pDllPathBuf)+1,MEM_COMMIT,PAGE_READWRITE);
WriteProcessMemory(hProcess,pRemoteAdrr,pDllPathBuf,strlen(pDllPathBuf)+1,NULL);

注入线程并执行

HANDLE WINAPI CreateRemoteThread(
  __in          HANDLE hProcess,
  __in          LPSECURITY_ATTRIBUTES lpThreadAttributes,
  __in          SIZE_T dwStackSize,
  __in          LPTHREAD_START_ROUTINE lpStartAddress,
  __in          LPVOID lpParameter,
  __in          DWORD dwCreationFlags,
  __out         LPDWORD lpThreadId
);

最关心的两个参数是lpStartAddress和lpParameter,它们分别代表线程函数的入口和参数,其他参数一般设置为0即可。

DWORD dwTID = 0;
HANDLE hThread = CreateRemoteThread(hProcess,NULL,0,(LPTHREAD_START_ROUTINE)GetProcAddress(LoadLibrary("Kernel32.dll"),"LoadLibraryA"),\
                                        pRemoteAdrr,\ //线程参数, 即loadlibraryA的参数
                                        0,&dwTID);
WaitForSingleObject(hThread,INFINITE);
GetExitCodeThread(hThread,(LPDWORD)&g_dwhMod); //线程退出码,即为g_dwhMod,它也是loadlibraryA的返回值, 模块句柄;
//此时我们的dll已经执行在进程A中了

释放掉我们在A进程中申请的内存, 并关闭线程句柄

VirtualFreeEx(hProcess,pRemoteAdrr,strlen(pDllPathBuf)+1,MEM_DECOMMIT);
CloseHandle(hProcess);

/////////////////////////////////////////////////////////////////////////////////////////////以上是线程注入部分(load之后也应有free嘛),卸载部分

HANDLE hProcess = OpenProcess(PROCESS_ALL_ACCESS,NULL,dwPID);
	DWORD dwTID = 0;
	HANDLE hThread = CreateRemoteThread(hProcess,NULL,0,(LPTHREAD_START_ROUTINE)GetProcAddress(LoadLibrary("Kernel32.dll"),"FreeLibrary"),\
                                        g_dwhMod,\
                                        0,&dwTID);
    WaitForSingleObject(hThread,INFINITE);
    CloseHandle(hProcess);

到此完事

附加:


//提升进程权限
BOOL EnablePrivilege(HANDLE hProcess)
{
	HANDLE hToken = NULL;
	if (!OpenProcessToken(hProcess, TOKEN_ADJUST_PRIVILEGES, &hToken))
	{
		//printf("LINE: %u  Error_Code: %u\n", __LINE__,GetLastError());
		return FALSE;
	}
	LUID luid = { 0 };
	if (!LookupPrivilegeValue(NULL, SE_DEBUG_NAME, &luid))
	{
		//printf("LINE: %u  Error_Code: %u\n", __LINE__, GetLastError());
		return FALSE;
	};
	TOKEN_PRIVILEGES token_privelege = { 1 };
	token_privelege.Privileges[0].Luid = luid;
	token_privelege.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
	if (!AdjustTokenPrivileges(hToken, FALSE, &token_privelege, sizeof(TOKEN_PRIVILEGES), NULL, NULL))
	{
		//printf("AdjustTokenPrivileges LINE: %u  Error_Code: %u\n", __LINE__, GetLastError());
		return FALSE;
	};
	CloseHandle(hToken);
	return TRUE;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值