以下是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);
}