Salut,
J'essaye de coder un "injecteur" de DLL et je me trouve confronté à un problème : ça ne marche que dans un cas.
Mes connaissances en Windows étant quelque peu limitées, à l'aide ! ^^
J'ai trois fichiers :
- test.exe : le binaire dans lequel je veux faire l'injection (en l'occurrence il affiche une fenêtre vide même si ça n'a aucune importance)
- test.dll : la DLL que je veux injecter (elle affiche une MessageBox dans DllMain juste pour que je vois facilement que l'injection est OK)
- inject.exe (cf. plus bas pour le code) : le binaire qui fait l'injection
A l'origine, chacun de ces fichiers était dans un sous-dossier (i.e. un dossier pour chaque code, logique).
Mon inject.exe prend deux arguments : le binaire de test et la DLL.
Pour tester, je lance à la main "test.exe" puis j'exécute en console le inject.exe.
Ma première tentative a été : inject\inject.exe bin_test\test.exe dll_test\test.dll
=> il ne trouve pas le PID de test.exe (normal, il cherche "bin_test\test.exe"...)
Du coup, seconde tentative plus logique : inject\inject.exe test.exe dll_test\test.dll
=> il trouve le PID de test.exe, mais pas de MessageBox
Après pas mal de n'importe quoi j'en suis arrivé à constater que *il faut que test.exe soit dans le dossier courant*.
Autrement dit, il ne faut pas le path pour pouvoir récupérer le PID mais il faut le path pour que l'injection réussisse oO
Etant donné que le nom du fichier de test sert uniquement (ou pas du coup ?) à récupérer le PID, me voila perdu.
Si quelqu'un a une explication, je suis preneur !
Merci d'avance

----
Note : pour simplifier au maximum j'ai supprimé les tests sur l'input + sur les valeurs de retour (elles sont toutes testées et je n'ai aucune erreur btw).
#include <windows.h>
#include <tlhelp32.h>
#include <stdio.h>
static DWORD GetProcessPID(char * processName)
{
/* take a snapshot of running processes */
HANDLE hProcessesSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
PROCESSENTRY32 pe32;
pe32.dwSize = sizeof(PROCESSENTRY32);
/* get the first running process */
Process32First(hProcessesSnapshot, &pe32);
/* loop on the running processes: if we find the target then get its PID */
DWORD targetPID = 0;
do
{
if(strcmp(pe32.szExeFile, processName) == 0)
{
targetPID = pe32.th32ProcessID;
break;
}
}
while(Process32Next(hProcessesSnapshot, &pe32));
CloseHandle(hProcessesSnapshot);
return targetPID;
}
int main(int argc, char * argv[])
{
char * target = argv[1];
char * dllPath = argv[2];
/* get a handle on the target process */
DWORD dwTargetPID = GetProcessPID(target);
HANDLE hTargetProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, dwTargetPID);
/* allocate memory for the injection */
void * pReservedSpace = VirtualAllocEx(hTargetProcess, NULL, strlen(dllPath), MEM_COMMIT, PAGE_EXECUTE_READWRITE);
WriteProcessMemory(hTargetProcess, pReservedSpace, dllPath, strlen(dllPath), NULL);
/* get the address of 'LoadLibraryA' function from kernel32.dll */
HMODULE hModuleKernel32 = GetModuleHandle("kernel32");
LPTHREAD_START_ROUTINE pLoadLibrary = (LPTHREAD_START_ROUTINE) GetProcAddress(hModuleKernel32, "LoadLibraryA");
/* create a remote thread which executes the DllMain function of the injected DLL */
HANDLE hThread = CreateRemoteThread(hTargetProcess, NULL, 0, pLoadLibrary, pReservedSpace, 0, NULL);
/* wait until the thread returns*/
WaitForSingleObject(hThread,INFINITE);
/* clean and exit */
VirtualFreeEx(hTargetProcess, pReservedSpace, strlen(dllPath), MEM_COMMIT);
CloseHandle(hTargetProcess);
exit(EXIT_SUCCESS);
}