Injecter dll dans un processus en cours

Soyez le premier à donner votre avis sur cette source.

Vue 19 189 fois - Téléchargée 2 779 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

Messages postés
54
Date d'inscription
vendredi 13 avril 2007
Statut
Membre
Dernière intervention
26 juillet 2011

=> Bonjour,

Je me demande si une telle injection peut se faire dans une session non Administrateur?
Messages postés
3793
Date d'inscription
samedi 22 décembre 2007
Statut
Membre
Dernière intervention
3 juin 2016
8
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 !
Messages postés
718
Date d'inscription
jeudi 19 décembre 2002
Statut
Membre
Dernière intervention
22 novembre 2016
3
Aucun problème, c'est là pour çà ...
Messages postés
3793
Date d'inscription
samedi 22 décembre 2007
Statut
Membre
Dernière intervention
3 juin 2016
8
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 !
Messages postés
718
Date d'inscription
jeudi 19 décembre 2002
Statut
Membre
Dernière intervention
22 novembre 2016
3
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.
Afficher les 70 commentaires

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.