I am trying to write a program that uses CreateRemoteThread
to input a dll.
The problem is that CreateRemoteThread refuses to work. GetLastError () returns 5, i.e. ERROR_ACCESS_DENIED. I canβt understand why!
I am working with this video http://www.youtube.com/watch?v=H3O3hmXkt1I .
#include <iostream> #include <direct.h> #include <Windows.h> #include <TlHelp32.h> using namespace std; char* GetCurrentDir() { char* szRet = (char*)malloc(MAX_PATH); _getcwd(szRet, MAX_PATH); return szRet; } LPCTSTR SzToLPCTSTR(char* szString) { LPTSTR lpszRet; size_t size = strlen(szString)+1; lpszRet = (LPTSTR)malloc(MAX_PATH); mbstowcs_s(NULL, lpszRet, size, szString, _TRUNCATE); return lpszRet; } void WaitForProcessToAppear(LPCTSTR lpcszProc, DWORD dwDelay) { HANDLE hSnap; PROCESSENTRY32 peProc; BOOL bAppeared = FALSE; while(!bAppeared) { if((hSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0)) != INVALID_HANDLE_VALUE) { peProc.dwSize = sizeof(PROCESSENTRY32); if(Process32First(hSnap, &peProc)) while(Process32Next(hSnap, &peProc) && !bAppeared) if(!lstrcmp(lpcszProc, peProc.szExeFile)) bAppeared = TRUE; } CloseHandle(hSnap); Sleep(dwDelay); } } DWORD GetProcessIdByName(LPCTSTR lpcszProc) { HANDLE hSnap; PROCESSENTRY32 peProc; DWORD dwRet = -1; if((hSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0)) != INVALID_HANDLE_VALUE) { peProc.dwSize = sizeof(PROCESSENTRY32); if(Process32First(hSnap, &peProc)) while(Process32Next(hSnap, &peProc)) if(!lstrcmp(lpcszProc, peProc.szExeFile)) dwRet = peProc.th32ProcessID; } CloseHandle(hSnap); return dwRet; } BOOL InjectDll(DWORD dwPid, char* szDllPath) { DWORD dwMemSize; HANDLE hProc; LPVOID lpRemoteMem, lpLoadLibrary; BOOL bRet = FALSE; if((hProc = OpenProcess(PROCESS_ALL_ACCESS, FALSE, dwPid)) != NULL) { dwMemSize = strlen(szDllPath); if((lpRemoteMem = VirtualAllocEx(hProc, NULL, dwMemSize, MEM_COMMIT, PAGE_READWRITE)) != NULL) if(WriteProcessMemory(hProc, lpRemoteMem, szDllPath, dwMemSize, NULL)) { lpLoadLibrary = GetProcAddress(GetModuleHandleA("kernel32.dll"), "LoadLibraryA"); if(CreateRemoteThread(hProc, NULL, 0, (LPTHREAD_START_ROUTINE)lpLoadLibrary, lpRemoteMem, 0, NULL) != NULL) { bRet = TRUE; } cout << GetLastError(); } } CloseHandle(hProc); return bRet; } int main() { char szProc[MAX_PATH], szDll[MAX_PATH]; char* szDllPath = (char*)malloc(MAX_PATH); LPTSTR lpszProc = NULL; for(;;) { cout << "Process: "; cin >> szProc; cout << "DLL: "; cin >> szDll; szDllPath = GetCurrentDir(); strcat_s(szDllPath, MAX_PATH, "\\"); strcat_s(szDllPath, MAX_PATH, szDll); cout << "Waiting for process.. ." << szDllPath << " " << szDll << endl; WaitForProcessToAppear(SzToLPCTSTR(szProc), 100); if(InjectDll(GetProcessIdByName(SzToLPCTSTR(szProc)), szDllPath)) cout << "Injection Succeeded!" << endl; else cout << "Injection Failed!" << endl; cout << "\n"; } return 0;
After enough search queries, I canβt find the reason why this should not work.
Does CreateRemoteThread work under Windows 7? If so, have I made any obvious mistakes?