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 !
30 janv. 2009 à 11:57
Je me demande si une telle injection peut se faire dans une session non Administrateur?
4 janv. 2009 à 12:36
Merci :)
Cordialement, Bacterius !
4 janv. 2009 à 09:00
4 janv. 2009 à 01:10
Merci d'avance :)
Cordialement, Bacterius !
21 déc. 2006 à 09:04
"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.