Hej, kiedyś na windows 7 napisałem kod injectujący plik DLL do procesu exe i to wciąż działa na windows 7. Przetestowałem na windows 10 i zupełnie nie działa, w takim sensie, że mam wrażenie tak jakby ten DLL w ogóle nie był wstrzykiwany do procesu, mimo że dostaję pozytywny komunikat o wstrzyknięciu. GetLastError zwraca 0. Co jest nie tak? Co potrzeba zmienić w tym kodzie pod kątem windows 10?
DWORD CInject::RunApplication(const char *pathApp)
{
STARTUPINFO startupInfo;
PROCESS_INFORMATION procInfo;
ZeroMemory(&startupInfo,sizeof(startupInfo));
startupInfo.cb = sizeof(startupInfo);
if(CreateProcess(pathApp,NULL,NULL,NULL,FALSE,NULL,NULL,NULL,&startupInfo,&procInfo))
return procInfo.dwProcessId;
return 0;
}
bool CInject::InjectDLL(DWORD processID, const char *pathDLL)
{
if(processID)
{
FILE *file = fopen(pathDLL,"r+");
if(file)
{
fclose(file);
LPVOID kernel;
LPVOID handleLibrary;
HANDLE hProcess = OpenProcess(PROCESS_ALL_ACCESS,FALSE,processID);
if(hProcess)
{
kernel = (LPVOID)GetProcAddress(GetModuleHandle("kernel32.dll"),"LoadLibraryA");
handleLibrary = VirtualAllocEx(hProcess,NULL,strlen(pathDLL),MEM_RESERVE | MEM_COMMIT,PAGE_READWRITE);
WriteProcessMemory(hProcess,(LPVOID)handleLibrary,pathDLL,strlen(pathDLL),NULL);
CreateRemoteThread(hProcess,NULL,NULL,(LPTHREAD_START_ROUTINE)kernel,(LPVOID)handleLibrary,NULL,NULL);
CloseHandle(hProcess);
return true;
}
}
}
return false;
}
CInject inject;
DWORD processID = inject.RunApplication("Process.exe");
if (processID)
{
if (inject.InjectDLL(processID, "biblioteka.dll") == true) {
DWORD lastError = GetLastError();
char spr[128];
sprintf(spr, "DLL Injected... (LastError: %d)\n", lastError);
PrintMessage(spr);
}
else
PrintMessage("Could not inject DLL File\n");
}
Kod ten uruchamia proces i od razu wstrzykuje do niego DLL. Otrzymuję komunikat: DLL Injected... (LastError: 0)
A w rzeczywistości plik nie załadował się do procesu na Windows 10. Windows 7 jest OK. Jak to naprawić?