CreateRemoteThread

/************************************************************************/
/* 通过CreateRemoteThread注入进程
/* 参数:进程ID,dll路径
/************************************************************************/
BOOL InjectModuleToProcessByRT(DWORD dwProcessId, LPWSTR lpDllPath) 
{
	BOOL bRet = FALSE;
	HANDLE hProcess = NULL, hThread = NULL;
	LPWSTR lpRemoteDllName = NULL;
	WCHAR szBuf[MAX_PATH] = {0};
	DWORD dwSmss = GetProcessIdByName(L"smss.exe");
	DWORD dwCsrss = GetProcessIdByName(L"csrss.exe");
	if( (dwProcessId == 0)||(dwProcessId == 4)||(dwProcessId == dwSmss)||(dwProcessId == dwCsrss))
	{
		return bRet;
	}
	__try
	{
		//获取目标进程句柄
		hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, dwProcessId);
		if (hProcess == NULL)
		{
			wsprintf(szBuf,L"[error]OpenProcess(%d)",GetLastError());
			OutputDebugString(szBuf);
			__leave;
		}

		// 计算dll路径所需要的字节数
		int cch = 1 + lstrlenW(lpDllPath);
		int cb  = cch * sizeof(wchar_t);

		// 为远程线程的路径分配空间
		lpRemoteDllName = (LPWSTR) VirtualAllocEx(hProcess, NULL, cb, MEM_COMMIT, PAGE_READWRITE);
		if (lpRemoteDllName == NULL)
		{
			wsprintf(szBuf,L"[error]VirtualAllocEx(%d)",GetLastError());
			OutputDebugString(szBuf);
			__leave;
		}

		//将dll路径写入远程线程空间
		if (!WriteProcessMemory(hProcess, lpRemoteDllName, (PVOID) lpDllPath, cb, NULL))
		{
			wsprintf(szBuf,L"[error]WriteProcessMemory(%d)",GetLastError());
			OutputDebugString(szBuf);
			__leave;
		}

		// 获取LoadLibraryW在Kernel32.dll中的地址
		PTHREAD_START_ROUTINE pfnThreadRtn = (PTHREAD_START_ROUTINE)
			GetProcAddress(GetModuleHandle(L"Kernel32"), "LoadLibraryW");
		if (pfnThreadRtn == NULL)
		{
			OutputDebugString(L"[error]Get LoadLibraryW Address Fail");
			__leave;
		}

		// 创建远程线程
		hThread = CreateRemoteThread(hProcess, NULL, 0, pfnThreadRtn, lpRemoteDllName, 0, NULL);
		//hThread = LibCreateRemoteThread(hProcess, pfnThreadRtn, lpRemoteDllName, 0, NULL);
		if (hThread == NULL)
		{
			wsprintf(szBuf,L"[error]CreateRemoteThread(%d)",GetLastError());
			OutputDebugString(szBuf);
			__leave;
		}

		// 等待远程线程结束
		WaitForSingleObject(hThread, INFINITE);

		bRet = TRUE;
	}
	__finally 
	{ 
		if (lpRemoteDllName != NULL) 
			VirtualFreeEx(hProcess, lpRemoteDllName, 0, MEM_RELEASE);

		if (hThread  != NULL) 
			CloseHandle(hThread);

		if (hProcess != NULL) 
			CloseHandle(hProcess);
	}

	return bRet;
}

转载于:https://www.cnblogs.com/15157737693zsp/p/4149136.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值