【DLL注入技术】远程线程注入

#include "stdafx.h"
#include "RemoteTHreadInjectDLL.h"
#include <tlhelp32.h>


CRemoteTHreadInjectDLL::CRemoteTHreadInjectDLL()
{
}


CRemoteTHreadInjectDLL::~CRemoteTHreadInjectDLL()
{
}

int CRemoteTHreadInjectDLL::Inject(DWORD dwProcessId, TCHAR * szDllName)
{
	if (szDllName[0] == NULL)
	{
		return -1;
	}

	// 提高权限相关操作
	EnablePrivilege(TRUE);

	// 1. 打开进程
	HANDLE hProcess = OpenProcess(
		PROCESS_ALL_ACCESS,  // 打开进程权限
		FALSE,				 // 是否可继承
		dwProcessId);		 // 进程ID

	if (hProcess == INVALID_HANDLE_VALUE)
	{
		return -1;
	}

	// 2. 在远程进程中申请空间
	LPVOID pszDllName = VirtualAllocEx(
		hProcess,					// 远程进程句柄
		NULL,						// 建议开始地址
		4096,						// 分配空间大小
		MEM_COMMIT,					// 空间初始化全0
		PAGE_EXECUTE_READWRITE		// 控件权限
		);

	if (pszDllName == NULL)
	{
		return -1;
	}

	// 3. 向远程进程中写入数据
	BOOL bRet = WriteProcessMemory(hProcess, pszDllName, szDllName, MAX_PATH, NULL);
	if (bRet == NULL)
	{
		return -1;
	}

	// 4. 在远程进程中创建远程线程
	HANDLE m_hInjectThread = CreateRemoteThread(
		hProcess,								// 远程进程句柄
		NULL,									// 安全属性
		0,										// 栈大小
		(LPTHREAD_START_ROUTINE)LoadLibrary,	// 进程处理
		pszDllName,								// 传入参数
		NULL,									// 默认创建后的状态
		NULL									// 线程ID
		);

	if (m_hInjectThread == NULL)
	{
		DWORD dwErr = GetLastError();
		return -1;
	}

	// 5. 等待线程结束返回
	DWORD dw = WaitForSingleObject(m_hInjectThread, -1);

	// 6. 获取线程退出码,即LoadLibrary的返回值,即DLL的首地址
	DWORD dwExitCode;
	GetExitCodeThread(m_hInjectThread,&dwExitCode);
	HMODULE m_hMod = (HMODULE)dwExitCode;

	// 7. 释放空间
	bool bReturn = VirtualFreeEx(hProcess,pszDllName,4096,MEM_DECOMMIT);

	if (bReturn == NULL)
	{
		return -1;
	}

	CloseHandle(hProcess);
	hProcess = nullptr;

	// 恢复权限相关操作
	EnablePrivilege(FALSE);

	return 0;
}

bool CRemoteTHreadInjectDLL::EnablePrivilege(bool isStart)
{
	// 1. 得到令牌句柄
	HANDLE hToken = NULL; // 令牌句柄
	if (!OpenProcessToken(GetCurrentProcess(),TOKEN_ADJUST_PRIVILEGES|TOKEN_QUERY|TOKEN_READ,&hToken))
	{
		return false;
	}

	// 2. 得到特权值
	LUID luid = { 0 };  // 特权值
	if (!LookupPrivilegeValue(NULL, SE_DEBUG_NAME, &luid))
	{
		return false;
	}

	// 3. 提升令牌权限
	TOKEN_PRIVILEGES tp = { 0 }; // 令牌权限
	tp.PrivilegeCount = 1;
	tp.Privileges[0].Luid = luid;
	tp.Privileges[0].Attributes = isStart ? SE_PRIVILEGE_ENABLED : 0;
	if (!AdjustTokenPrivileges(hToken, FALSE, &tp, 0, NULL, NULL))
	{
		return false;
	}

	// 4. 关闭令牌句柄
	CloseHandle(hToken);
	return 0;

}

DWORD CRemoteTHreadInjectDLL::GetProcessId(TCHAR * pszProcessName)
{
	HANDLE hProcess = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0);
	if (hProcess == INVALID_HANDLE_VALUE)
	{
		return 0;
	}

	DWORD dwProcessId = 0;

	PROCESSENTRY32  process32 = { 0 };

	process32.dwSize = sizeof(PROCESSENTRY32);

	BOOL bRetProcess = FALSE;

	bRetProcess = Process32First(hProcess,&process32);

	do 
	{
		if (_tcscmp(pszProcessName, process32.szExeFile) == 0)
		{
			dwProcessId = process32.th32ProcessID;
			break;
		}
		bRetProcess = Process32Next(hProcess,&process32);

	} while (bRetProcess);

	return dwProcessId;
}

 

文 / luna
LEAVE A REPLY

loading