首页 > 代码库 > CreateRemoteThread

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;}

CreateRemoteThread