Injecter dll dans un processus en cours

5/5 (70 avis)

Vue 20 163 fois - Téléchargée 2 869 fois

Description

Bon au départ je ne voulais pas poster ce code, mais Forman m'a doubler avec çà source : http://www.delphifr.com/codes/REMPLACER-FONCTION-DLL-IMPORTE-QUELLE-AUTRE_38484.aspx

Du coup je vais vous présenter l'injection de DLL dans un processus, non pas pour remplacer une fonction comme la fait Forman, mais qu'elle tourne indépendemment en tache de fond sur un autre processus. Il faudra biensur crée avant une DLL dynamique qui est une fonction particulière (sorte d'application embarqué).

Cette technique est utilisée par certain malware afin d'ouvrir des canaux (porte d'entrées) sur votre PC, pour y laisser entrer des intrus.

Mon programme est assez généraliste car il permet de selectionner la DLL à injecter et le processus cible. Mais l'avantage de se type d'injection, et que si elle est faite sur votre navigateur internet, les firewall laissant votre navigateur envoyer et recevoir sans confirmation et la socket faisant partie de l'application, le FireWall laissera votre socket embarqué lire et ecrire sur une socket client exterieure en passant outre les protections.

Source / Exemple :


// La fonction d'injection

function InjectDLL( DLLSource : string; ProcessDestination : string ) : Boolean;
var
    LibName     : Pointer;
    hProcess    : THandle;
    ThreadHandle: THandle;
    OctEcrit    : Cardinal;
    TheadID     : DWORD;
begin
    Result := False;

    AjustePrivileges; // voir dans le Zip pour cette fonction

    hProcess := OpenProcess( PROCESS_ALL_ACCESS, FALSE, FindProcess( ProcessDestination ) );
    if (hProcess = 0) then Exit;

    LibName := VirtualAllocEx( hProcess, nil, Length(DLLSource) + 1, MEM_COMMIT, PAGE_READWRITE );
    if ( LibName <> nil ) then
    begin
      WriteProcessMemory( hProcess, LibName, PChar(DLLSource), Length(DLLSource) + 1, OctEcrit );
      if ( (Length(DLLSource) + 1) <> OctEcrit ) then Exit;
le process
      ThreadHandle := CreateRemoteThread( hProcess, nil, 0, GetProcAddress( LoadLibrary('kernel32.dll'), 'LoadLibraryA' ), LibName, 0, TheadID );
      Result := ( ThreadHandle <> 0 );
      WaitForSingleObject( ThreadHandle, INFINITE );
    end else Result := False;
    VirtualFreeEx( hProcess, LibName, 0, MEM_RELEASE );
    CloseHandle( hProcess );
end;

Conclusion :


Les sources fournies avec le Zip ne contiennent aucun "Malware", et ma DLL contient juste un serveur socket qui renvoi ce que lui envoi le client connecté : donc rien de méchant. Cette source à un but pédagogique, je ne cherche en rien à faire de futur HAcKer, je vous serez grée de ne pas me la supprimer, un avertissement serai suffisant !

J'ai posté cette source un peu rapidement, donc s'il y a des corrections je suis preneur.

Notes et commentaires sont les bienvenues !

Codes Sources

A voir également

Ajouter un commentaire Commentaires
randriano Messages postés 54 Date d'inscription vendredi 13 avril 2007 Statut Membre Dernière intervention 26 juillet 2011
30 janv. 2009 à 11:57
=> Bonjour,

Je me demande si une telle injection peut se faire dans une session non Administrateur?
Bacterius Messages postés 3792 Date d'inscription samedi 22 décembre 2007 Statut Membre Dernière intervention 3 juin 2016 10
4 janv. 2009 à 12:36
Merci beaucoup Elguevel, je te citerai dans le code, devant ta fonction (je crois avoir pris également AdjustPrivileges pour pouvoir obtenir des droits suffisants).

Merci :)

Cordialement, Bacterius !
elguevel Messages postés 718 Date d'inscription jeudi 19 décembre 2002 Statut Membre Dernière intervention 22 novembre 2016 3
4 janv. 2009 à 09:00
Aucun problème, c'est là pour çà ...
Bacterius Messages postés 3792 Date d'inscription samedi 22 décembre 2007 Statut Membre Dernière intervention 3 juin 2016 10
4 janv. 2009 à 01:10
Très interessant code ... Puis-je m'en servir dans mon application à venir ? Je l'inclurai dans mon unité ProcessUtils, je la modifierai juste un peu pour la rendre compatible avec mon système de types et de classes (TProcess=class(TObject)) ?
Merci d'avance :)

Cordialement, Bacterius !
elguevel Messages postés 718 Date d'inscription jeudi 19 décembre 2002 Statut Membre Dernière intervention 22 novembre 2016 3
21 déc. 2006 à 09:04
Le Result ne signifie pas la fin de la fonction, je vais donc avoir un resultat avec mon
"Result := ( ThreadHandle <> 0 );" mais la fonction continue à être executé.
Et là problème si je continue on retrouve :
"VirtualFreeEx( hProcess, LibName, 0, MEM_RELEASE );"
"CloseHandle( hProcess );"

Et mon CreateRemoteThread se termine là.
C'est pour çà que j'ai ajouter : "WaitForSingleObject" qui permet au thread de durée pendant X temps ( X exprimé en milisecondes ), vu que je ne veux pas que celui-ci se termine j'utilise la constante INFINITE qui permet d'avoir une durée infinie.

Mais c'est vrai que dans ce cas les lignes :
"VirtualFreeEx( hProcess, LibName, 0, MEM_RELEASE );"
"CloseHandle( hProcess );"

... ne servent à rien puisque mon programme se stop au "WaitForSingleObject" !

A revoir ...

Sinon je n'avais pas vu le message de Thepuple, mais effectivement je n'ai pas essayé de passer la DLL directement, je ne sais pas si çà marche, mais il me semble plus naturelle d'alloué avant d'ecrire.

Merci, et bon code.

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.