远程注入大致可分为8步
01给自己提权
int DebugPrivilege =EnableDebugPrivilege(SE_DEBUG_NAME);
02获取目标窗口句柄
CWnd* hWnd = FindWindow(L"Notepad", NULL);
03获取目标窗口ID
GetWindowThreadProcessId(hWnd->m_hWnd, &Win_ID);
04获取目标进程句柄
HANDLE hWnd_Pro = OpenProcess(PROCESS_ALL_ACCESS, FALSE, Win_ID);
05在目标进程内申请内存空间
LPVOID lpAddr = VirtualAllocEx(hWnd_Pro, NULL, 0x1000, MEM_COMMIT, PAGE_EXECUTE_READWRITE);
6.拼接出dll的绝对路径,而这个绝对路径是给第8步loadLibrary的地址
要点一:GetCurrentDirectory获取到的是当前路径,***必须***提前把需要注入的dll手动复制过来
因为debug的时候这里是没有dll的,写错地址是最常出现的错误
要点二:loadLibrary需要2字节的LPCWSTR类型,我们这里也要把一个字节的char*改为LPCWSTR
获取到的szBuf已经是LPCWSTR类型了,添加dll名称时,每个char后面多加一个'\0'就变成LPCWSTR的结构了
比如DDDDDD,char类型是44 44 44 44 44 44,LPCWSTR类型是44 00 44 00 44 00 44 00 44 00 44 00
char szBuf[MAX_PATH] = { NULL };
DWORD Len_Path=GetCurrentDirectory(sizeof(szBuf), LPWSTR(szBuf));
char* dll_name = "\\helper2.dll";//这里填需要注入的dll路径名称
int aaaa = strlen(dll_name);
for (int i = Len_Path*2; i < (Len_Path + aaaa) * 2; i = i + 1) {
if (i % 2 == 0) {
szBuf[i] = dll_name[(i - (Len_Path * 2)) / 2];
}
else {
szBuf[i] = '\0';
}
}
07使用WriteProcessMemory把地址写入目标进程的内存空间。
BOOL bRet = WriteProcessMemory(hWnd_Pro, lpAddr, szBuf, MAX_PATH, NULL);
第一个参数: 进程的句柄, 可以用第4步OpenProcess返回的句柄
第二个参数 : 写入的内存地址起点,可以用第5步