C++远程线程注入MFC
远程线程注入:指不同的进程地址空间的远程
exe:操作系统都会给他分配一块4G的虚拟内存
虚拟内存是在硬盘中分配一块区域作为虚拟内存通过操作系统映射给exe
物理内存才是真正的内存设备
进程之间是不能访问互相的数据的
想要注入到别人的exe中需要:
1.提升进程权限
1 2 3 4 5 6 7
| HANDLE hToken; if (FALSE == OpenProcessToken(GetCurrentProcess(),TOKEN_ALL_ACCESS,&hToken))
{ MessageBox(L"打开进程访问失败"); return; }
|
2.查看进程里面的特权信息
1 2 3 4 5 6
| LUID luid; if (FALSE == LookupPrivilegeValue(NULL,SE_DEBUG_NAME,&luid)) { MessageBox(L"查看进程里面的特权信息失败"); return; }
|
3.调节进程的权限
1 2 3 4 5 6 7 8 9
| TOKEN_PRIVILEGES tkp; tkp.PrivilegeCount = 1; tkp.Privileges[0].Attributes + SE_PRIVILEGE_ENABLED; tkp.Privileges[0].Luid = liud; if (FALSE == AdjustTokenPrivileges(hToken,FALSE,&tkp,sizeof(tkp),NULL,NULL)) { MessageBox(L"调节进程权限失败"); return; }
|
4.查找窗口
1 2 3 4 5 6
| HWND hNotepadWnd = ::FindWindow(L"Notepad",L"无标题 - 记事本"); if(hNotepadWnd == NULL) { MessageBox(L"没有打开记事本"); return; }
|
5.获取进程PID(Process ID)
1 2 3 4 5 6 7 8
| //根据窗口句柄获取PID DWORD dwPID = 0; GetWindowThreadProcessId(hNotepadWnd,&dwPID); if(dwPID == 0) { MessageBox(L"获取进程PID失败"); return; }
|
==进程是一个运行中的程序,一个进程可以有多个窗口(窗口句柄)==
6.根据PID获取进程句柄
1 2 3 4 5 6
| HANDLE hNotepad = OpenProcess(PROCESS_ALL_ACCESS,FALSE,dwPID); if(hNotepad == NULL) { MessageBox(L"打开进程失败"); return; }
|
7.在远程进程中申请内存空间
1 2 3 4 5 6
| LPVOID lpAddr = VirtualAllocEx(hNotepad,NULL,0x1000,MEM_COMMIT,PAGE_EXECUTE_READWRITE); if(lpAddr == NULL) { MessageBox(L"在远程进程中申请内存失败"); return; }
|
8.将DLL路径写入到远程进程中
1 2 3 4 5
| TCHAR szDllPath[] = L"C:\\Users\\xxx\\Desktop\\Inject.dll"; if(FALSE == WriteProcessMemory(hNotepad,lpAddr,szDllPath,sizeof(szDllPath),NULL)) { MessageBox(L"在远程中写入数据失败"); }
|
9.调用dll中的代码