Tout d'abord je tiens à vous préciser que j'ai deja regarder les autres sujets parlant de ça sur code sources mais même en les relisant je n'arrive pas à voir d'où vient mon problème.
Donc en fait en gros je souhaiterais juste me familiariser avec l'injection de dll dans des processus actifs (avec toutes les opportunités que cela ouvre).
J'ai donc fait pas mal de recherche et je pense avoir bien compris comment ça marche ... seulement au moment de tester pas moyen de faire fonctionner quoi que ce soit.
En gros, j'ai 2 fichiers .C (dont une bonne partie est reprise de source trouvées sur le net)
- l'injecteur qui se nomme : kInject.c
- Mon fichier qui code mon dll : dllmain.c (qui va me donner injDLLl.dll )
Mon problème c'est qyue l'injection a l'air de bien marcher, pas de message d'erreur ... tout semble se passer niquel sauf que rien ne se passe :s
Je vous copie mon code :
dllmain.c ( je veux juste afficher une petite messageBox juste pour bien voir que mon injection marche !)
[CODE]#include <windows.h>
BOOL APIENTRY DllMain (HINSTANCE hInstance, DWORD dwReason, LPVOID lpReserved)
{
if(dwReason == DLL_PROCESS_ATTACH)
{
MessageBox(NULL , "INJECTED!" ,"bouh!",MB_OK);
return FALSE;
}
}[/CODE]
Et mon injecteur (que j'ai repris de quelqu'un sur le net, et qui semble marcher bien)
[CODE] #include <windows.h>
#include <tlhelp32.h> // CreateToolhelp32Snapshot, ...
#define DIE 1
char usage[]= "kInject.exe [process path/Pid] [dll path] [--create / --runtime] [--resolve]\n"
"--create : program will create the process before injecting\n"
"--runtime : inject already existing process\n"
"--resolve : get process id from executable name\n";
//prototypes
void DispError ( char * message, int die );
int GetPidByName ( char * nom );
int InjectDll ( HANDLE hModule, char * DLLFile );
//==============================================================================
// void DispError ( char * message, int die )
// Description
// affiche erreur si necessaire
//==============================================================================
void DispError ( char * message, int die )
{
printf("%s\n\n", message);
system ("PAUSE");
if ( die ) ExitProcess ( 0 );
return;
}
//==============================================================================
// int GetPidByName ( char * nom )
// retourne le PID depuis le nom du processus
//==============================================================================
int GetPidByName ( char * nom )
{
HINSTANCE hLib; // Chargement de la DLL
PROCESSENTRY32 PEntry; // Informations sur les processus Win32
HANDLE hTool32; // Snapshot des processus
// Type des fonctions
HANDLE (WINAPI *pCreateToolhelp32Snapshot)(DWORD,DWORD);
BOOL (WINAPI *pProcess32First) (HANDLE,LPPROCESSENTRY32);
BOOL (WINAPI *pProcess32Next) (HANDLE,LPPROCESSENTRY32);
//Functions addresses :
pCreateToolhelp32Snapshot = (HANDLE(WINAPI *)(DWORD,DWORD)) GetProcAddress ( LoadLibrary("kernel32.dll"), "CreateToolhelp32Snapshot" );
pProcess32First = (BOOL(WINAPI *) (HANDLE,LPPROCESSENTRY32)) GetProcAddress ( LoadLibrary("kernel32.dll"), "Process32First" );
pProcess32Next = (BOOL(WINAPI *) (HANDLE,LPPROCESSENTRY32)) GetProcAddress ( LoadLibrary("kernel32.dll"), "Process32Next" );
// On fixe la taille de la structure avant utilisation
PEntry.dwSize = sizeof(PROCESSENTRY32);
// On crée notre snapshot ( TH32CS_SNAPPROCESS : inclu la liste des processus Win32 )
hTool32 = pCreateToolhelp32Snapshot ( TH32CS_SNAPPROCESS, 0 );
// On récupère le premier processus
pProcess32First ( hTool32, &PEntry );
// Si le nom correspond, on retourne le PID ( Processus IDentifiant )
if ( !strcmp ( PEntry.szExeFile, nom ) )
return PEntry.th32ProcessID;
// Sinon, on teste les processus suivants
while ( pProcess32Next(hTool32,&PEntry) )
if(!strcmp(PEntry.szExeFile,nom))
return PEntry.th32ProcessID;
// Sinon, on a rien trouvé, on retourne 0
return 0;
}
//==============================================================================
// int InjectDll ( HANDLE hModule, char * DLLFile )
//------------------------------------------------------------------------------
// Description
// Injecte la dll dans un processus en cours d'execution
//------------------------------------------------------------------------------
//==============================================================================
int InjectDll ( HANDLE hModule, char * DLLFile )
{
int LenWrite = strlen(DLLFile) + 1;
char * AllocMem;
LPTHREAD_START_ROUTINE Injector;
HANDLE hThread;
DWORD Result;
// allocation pour WriteProcessMemory
AllocMem = (char *) VirtualAllocEx ( hModule, NULL, LenWrite, MEM_COMMIT, PAGE_READWRITE );
WriteProcessMemory ( hModule, AllocMem , DLLFile, LenWrite, NULL );
Injector = ( LPTHREAD_START_ROUTINE ) GetProcAddress ( GetModuleHandle("kernel32.dll"), "LoadLibraryA" );
if ( !Injector ) DispError ( "[!] Error while getting LoadLibraryA address.", DIE);
hThread = CreateRemoteThread ( hModule, NULL, 0, Injector, (void *) AllocMem, 0, NULL );
if ( !hThread ) DispError("[!] Cannot create thread.", DIE);
// Time out : 10 secondes
Result = WaitForSingleObject ( hThread, 10*1000 );
if ( Result==WAIT_ABANDONED || Result==WAIT_TIMEOUT || Result==WAIT_FAILED )
DispError ( "[!] Thread TIME OUT.", DIE );
// Libère la mémoire
VirtualFreeEx ( hModule, (void *) AllocMem, 0, MEM_RELEASE );
if ( hThread!=NULL ) CloseHandle ( hThread );
return 1;
}
//==============================================================================
// int main ( int argc, char * argv[] )
//------------------------------------------------------------------------------
// Description
// analyse la commande et agit
//==============================================================================
int main ( int argc, char * argv[] )
{
// Si le nombre d'arguments est insuffisant, on quitte en affichant l'aide
if(argc < 3 ) DispError ( usage, DIE );
printf("kInject v1.0 by Kdm [Modif Par BeLZeL]\n\n" );
//--------------------------------------------------------------------------
// --create : Exécute et injecte le code
//--------------------------------------------------------------------------
if ( !strcmp(argv[3], "--create") || !strcmp(argv[3], "-c") )
{
PROCESS_INFORMATION pi; // Recupère les informations d'identification du nouveau processus
STARTUPINFO si; // Aspect de la fenêtre créée (obligatoire)
// Allocation de mémoire avant utilisation
memset ( &si, 0, sizeof(si) );
si.cb = sizeof(si);
printf("CREATING PROCESS :\n\tName : %s\n\tStatus :", argv[1]);
if( !CreateProcess ( NULL, argv[1], NULL, NULL, TRUE, 0, NULL, NULL, &si, &pi ) )
DispError ( " [!!] CreateProcess [!!]\n", DIE );
printf(" [OK]\nINJECTING DLL :\n\tName : %s\n\tStatus :", argv[2]);
InjectDll(pi.hProcess, argv[2]);
printf(" [OK]\n");
}
//--------------------------------------------------------------------------
// --runtime : Injecte le code dans un processus existant
//--------------------------------------------------------------------------
else if ( !strcmp(argv[3], "--runtime") || !strcmp(argv[3], "-r") )
{
HANDLE hProc; // Handle du processus exécuté
DWORD ProcPid = 0; // PID du processus exécuté
// --resolve : On récupère le PID à partir du nom
if ( argc>4 && !strcmp(argv[4],"--resolve") )
{
ProcPid = GetPidByName(argv[1]);
if ( !ProcPid ) DispError( "RUNNING PROCESS :\n\tStatus : [!!] GetPidByName failed [!!]\n", DIE);
}
else ProcPid = atol(argv[1]);
// Récupère le handle du processus
printf("RUNNING PROCESS3 :\n\tName : %s\n\tPID : %d\n\tStatus :", argv[1], ProcPid);
hProc = OpenProcess ( PROCESS_ALL_ACCESS, TRUE, ProcPid );
if ( !hProc ) DispError ( " [!!] OpenProcess (Sure it exists ?) [!!]\n", DIE );
// Injecte le code
printf(" [OK]\nINJECTING DLL :\n\tName : %s\n\tPID : %d\n\tStatus :", argv[2], ProcPid);
InjectDll(hProc, argv[2]);
printf(" [OK]\n");
}
else printf("UNKNOWN COMMAND\n");
printf ("\n");
system ("PAUSE");
return 0;
}
[/CODE]
Pour lancer l'injection j'utilise la commande suivante :
kinject.exe "IEXPLORE.EXE" ".\injDLL.dll" --runtime --resolve
Je répète que j'ai repris l'injecteur du net (j'ai pris le temps de le comprendre mais pour être sur que tout marche j'ai préféré reprendre un code bien écrit) et que tout semble bien marcher.
Voilà ce que m'affiche ma console lors de l'injection :
[CODE]
C:\Dev-Cpp>kinject.exe "IEXPLORE.EXE" ".\injDLL.dll" --runtime --resolve
kInject v1.0 by Kdm [Modif Par BeLZeL]
RUNNING PROCESS3 :
Name : IEXPLORE.EXE
PID : 2356
Status : [OK]
INJECTING DLL :
Name : .\injDLL.dll
PID : 2356
Status : [OK]
Appuyez sur une touche pour continuer...[/CODE]
Tous les status sont OK ... donc ça voudrait me laisser sous-entendre que ça marche mais rien ne se passe...
Je suis un peu troublé :)
Si quelqu'un a une idée ça me rendrai très heureux parce que ça va faire presque une semaine que je galère tous les soirs à essayer de changer tout pour que ça marche avant de me décider à creer un topic :)
D'avance merci :)