C++实现远程线程注入

10 篇文章 0 订阅

以下是360百科对远程线程注入的解释:

在一个进程中,调用CreateThread或CreateRemoteThreadEx函数,在另一个进程内创建一个线程(因为不在同一个进程中,所以叫做远程线程)。创建的线程一般为Windows API函数LoadLibrary,来加载一个动态链接库(DLL),从而达到在另一个进程中运行自己所希望运行的代码的目的。

 那么,该怎么去实现呢?

首先,我们需要提权。这里我们使用令牌来提权。

bool DebugPrivilege() {
	HANDLE hToken;//令牌句柄
	LUID sedebugnameValue;
	TOKEN_PRIVILEGES tkp;
	if (!OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hToken))//获得当前进程权限令牌
	{
		return FALSE;
	}
	if (!LookupPrivilegeValue(NULL, SE_DEBUG_NAME, &sedebugnameValue))//获得当前权限值
	{
		CloseHandle(hToken);
		return false;
	}
	tkp.PrivilegeCount = 1;//设置权限数量为1
	tkp.Privileges[0].Luid = sedebugnameValue;
	tkp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;//设置第一个权限类型为调试
	if (!AdjustTokenPrivileges(hToken, FALSE, &tkp, sizeof(tkp), NULL, NULL))//修改令牌
	{
		CloseHandle(hToken);
		return false;
	}
	return true;
}

以上是提权。

然后是初始化部分。

if (!DebugPrivilege()) {
		MessageBox("进程提权失败,可能会无法注入某些进程");
	}

再就是关键的注入部分。

void InjectDll(int pid, char *szDllName) {
	if (pid == 0 || lstrlen(szDllName) == 0) {
		return;
	}
	char *pFunName = "LoadLibraryA";
	HANDLE hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, pid);
	if (hProcess == NULL) {
		return;
	}
	int nDllLen = lstrlen(szDllName) + sizeof(char);
	PVOID pDllAddr = VirtualAllocEx(hProcess, NULL, nDllLen, MEM_COMMIT, PAGE_READWRITE);
	if (pDllAddr == NULL) {
		CloseHandle(hProcess);
		return;
	}
	size_t dwWriteNum = 0;
	WriteProcessMemory(hProcess, pDllAddr, szDllName, nDllLen, &dwWriteNum);
	FARPROC pFunAddr = GetProcAddress(GetModuleHandle("kernel32.dll"), pFunName);
	HANDLE hThread = CreateRemoteThread(hProcess, NULL, 0, (LPTHREAD_START_ROUTINE)pFunAddr, pDllAddr, 0, NULL);
	//WaitForSingleObject(hThread, INFINITE);
	CloseHandle(hThread);

	CloseHandle(hProcess);
}

  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

爱编程的叶一笑

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值