HOOK D'API, INJECTION DE DLL, TABLE D'IMPORT

Caribensila Messages postés 2527 Date d'inscription jeudi 15 janvier 2004 Statut Membre Dernière intervention 16 octobre 2019 - 17 déc. 2007 à 11:18
strobinateur Messages postés 11 Date d'inscription jeudi 15 janvier 2004 Statut Membre Dernière intervention 14 avril 2009 - 19 juil. 2011 à 17:01
Cette discussion concerne un article du site. Pour la consulter dans son contexte d'origine, cliquez sur le lien ci-dessous.

https://codes-sources.commentcamarche.net/source/45094-hook-d-api-injection-de-dll-table-d-import

strobinateur Messages postés 11 Date d'inscription jeudi 15 janvier 2004 Statut Membre Dernière intervention 14 avril 2009
19 juil. 2011 à 17:01
Merci, c'est une très bonne source !
cs_Yooda Messages postés 3 Date d'inscription vendredi 12 septembre 2003 Statut Membre Dernière intervention 15 juillet 2008
15 juil. 2008 à 11:52
Certains exe, exporte des fonctions. Je suppose pour inter-opérabilité avec d'autres softs. C'est justement ce que je cherche a faire... ;)

Je teste cette piste, merci :)
cs_rt15 Messages postés 3874 Date d'inscription mardi 8 mars 2005 Statut Modérateur Dernière intervention 7 novembre 2014 13
15 juil. 2008 à 11:45
Cela marcherait si le code de l'exe passait par sa propre table d'export pour appeler cette fonction. Mais il serait stupide de passer par celle-ci pour récupérer une adresse que l'on connait déjà. Donc il y a peu de chance que des compilos le fasse.

Par contre...

Ton exe exporte la fonction, donc tu peux facilement récupérer son adresse dans le processus distant (Pour cela, on peut exploiter la technique d'injection de ce source). Une fois que l'on a l'adresse de cette fonction, rien n'empèche de modifier le début du code de cette fonction pour appeler une fonction à nous, injectée elle aussi.

1. Injection d'une dll dans le processus distant, via la technique de ce source ou autre.

2. Dans le code de la dll, récupérer un handle du .exe avec GetModuleHandle.

3. Récupérer l'adresse de la fonction exportée avec GetProcAdresse, en lui passant le handle du .exe.

4. Modifier le début de la fonction exporté (Ecriture à l'adresse ci-dessus). La fonction commence très certainement par un :
push ebp
mov ebp, esp

(Les compilos Microsoft mettent généralement un mov edi,edi en début de fonction, idéal pour un hook)

Remplacer ce début par un jmp vers une fonction de la dll que l'on a injecté.

5. La fonction de la dll qui va récupérer les appel doit faire le début qui a été remplacé, et doit faire un saut vers la fonction originale à la fin.

Bien qu'un peu technique, c'est très faisable.
Par contre, je ne vois pas dans quel cas ce serait utile...
cs_Yooda Messages postés 3 Date d'inscription vendredi 12 septembre 2003 Statut Membre Dernière intervention 15 juillet 2008
15 juil. 2008 à 01:44
Superbe source... Et merci pour la blague sur le "string" ;) Ca détend....

juste une question:
Comment faire pour "Hooker" une fonction exporté dans l'exe et non importé à partir de la DLL ?

ansi dans mon code j'ai :
-----------------
implementation

{$R *.dfm}
function SommeINCLUDE(A, B: Integer): Integer;
begin
result:=A+B;
end;

exports SommeINCLUDE;
end.
-----------------
SommeINCLUDE est donc Exporté... Et non importé certes. Mais les mécanismes sont les mêmes. Ne peut on pas ce basé sur ce code pour "Hooké" sommeINCLUDE ?
cs_jeanr Messages postés 17 Date d'inscription vendredi 25 avril 2003 Statut Membre Dernière intervention 12 juin 2008
19 déc. 2007 à 18:36
Belle source, super bien documentée et expliquée, merci :-)
Oniria Messages postés 292 Date d'inscription dimanche 14 mars 2004 Statut Membre Dernière intervention 18 décembre 2014 3
19 déc. 2007 à 10:33
Bonjour,

Je voulais juste savoir si c'est cette méthode qu'il faut utiliser pour créer un sniffer de port RS232 ?

En tout cas bravo.

Oniria
WhiteHippo Messages postés 1154 Date d'inscription samedi 14 août 2004 Statut Membre Dernière intervention 5 avril 2012 3
17 déc. 2007 à 19:36
Comme je le pensais, la police ne convient pas pour le code. Une copie sous Delphi ou bien dans un editeur de texte avec du Courier Nex par exemple, permettra de le faire apparaitre tel qu'il aurait du apparaitre.

Cordialement.
WhiteHippo Messages postés 1154 Date d'inscription samedi 14 août 2004 Statut Membre Dernière intervention 5 avril 2012 3
17 déc. 2007 à 19:32
Salut à tous,

Désolé foxi, mais je sens que je vais encore faire le rabat-joie doublé du pinailleur de service ... et surtout t'enerver encore plus ;)

"procedure ConsolePause();
sans arguments .... pas de parenthese! on est pas en C/C++ et t'es plus un debutant maintenant :)"

Ben justement, je pense que c'est parce que l'on est plus un débutant que l'on peut se permettre ces choses là. :P Un code "initié" ou "expert" peut se le permettre, car il ne s'adresse pas aux mêmes personnes que le code "débutant".

Moi j'utilise régulièrement les parenthèses pour mes appels de fonctions ou de procédure, je pousse même le vice encore plus loin (N.B. je ne sais pas si la police de caractère employés pour les commentaires refletera correctement la disposition du code suivant) :

procedure MaProcedureSansParametres
(
)
;
begin
// ...
end ;

N.B. Pour ceux qui voudraient me faire remarquer que la procédure sans paramètres occupe trois lignes alors qu'elle pourrait n'en utiliser qu'une, je sais et alors... Le compilateur comprends parfaitement le code donc il n'y a pas de problèmes ;D Juste une façon différente de voir les choses. Vive la différence !!

procedure MaProcedure
( var MonParametre1 : MonType1 // Commentaire du MonParametre1
; MonParametre2 : MonType2 // Commentaire du MonParametre2
; const MonParametre3 : MonType3 // Commentaire du MonParametre3
)
; stdcall ;
begin
// ...
end ;

Là encore, j'entends déjà les ronchons... Qu'est que fait un point virgule en début de ligne ? L'important là encore, et qu'il remplisse sa fonction de délimiteur. Et en plus, je trouve ça super esthétique ;P

function MaFonction
( const MonParametre1 : MonType1
; const MonParametre1bis : MonType1
; out MonParametre3 : MonType3
) {Result} : MonTypeResultat
;
begin
// ...
end ;

Là, on fait apparaitre le result, défini par défaut dans chacune des fonctions. A quoi ça sert ? Ben je viens de le dire à le faire apparaitre :)

Pourquoi, ecrire et disposer le code ainsi ?
Plusieurs raisons à cela :
- Le décalage entre deux paramètres en est grandement facilité.
- L'insertion d'un nouveau paramètre (d'une ligne) se fait aisément.
- La clarté du code est, pour moi, meilleure ainsi.
- La sélection et/ou la suppression ("par colonne") est alors pleinement exploitable.

Bref, si c'est juste histoire de mettre des parenthèses, pas d'intérêts. Par contre si c'est en prévision de modifications futures, alors je suis plus que pour rt15. Et pour tous ceux, qui comme foxi sont enervés à la simple vue d'un code quelques peu différent, il reste toujours des outils de formattage de code tel DelForExp.

P.S. Entre commenter ton code rt15, et taquiner foxi, le choix à été vite fait... Patience, je regarde ça bientôt.

Cordialement.
cs_rt15 Messages postés 3874 Date d'inscription mardi 8 mars 2005 Statut Modérateur Dernière intervention 7 novembre 2014 13
17 déc. 2007 à 17:45
f0xi -> Ca m'est venu très récemment le coup des parenthèses. Je me suis dit : pourquoi pas ?
Bah maintenant j'ai ma réponse...

Je mettrai mes sources dans "expert" quand j'emploierai des fonctions de M$ non documentées par M$. Niark niark.
f0xi Messages postés 4205 Date d'inscription samedi 16 octobre 2004 Statut Modérateur Dernière intervention 12 mars 2022 35
17 déc. 2007 à 17:21
Houla! clair que c'est pas jo l'rigolo l'brunews :)

en tout cas ça m'a l'air bien costaud, bien programmé, même si j'ai pas tout tester.

le seul truc qui m'ennerve dans ce code c'est ça :

procedure ConsolePause();

sans arguments .... pas de parenthese! on est pas en C/C++ et t'es plus un debutant maintenant :)

par contre pour le niveau expert ... mmm ... je me demande si c'est vraiment utile. il est vrai que faut deja avoir un bon niveau pour bien comprendre la source.
Caribensila Messages postés 2527 Date d'inscription jeudi 15 janvier 2004 Statut Membre Dernière intervention 16 octobre 2019 18
17 déc. 2007 à 11:18
Salut,

Eh bein!..
Ca nous change du SIMOBROWSER.
Tu pourrais peut-être pousser jusqu'au niveau «expert», non? ;)
Rejoignez-nous