strobinateur
Messages postés11Date d'inscriptionjeudi 15 janvier 2004StatutMembreDernière intervention14 avril 2009 19 juil. 2011 à 17:01
Merci, c'est une très bonne source !
cs_Yooda
Messages postés3Date d'inscriptionvendredi 12 septembre 2003StatutMembreDernière intervention15 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és3874Date d'inscriptionmardi 8 mars 2005StatutModérateurDernière intervention 7 novembre 201413 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és3Date d'inscriptionvendredi 12 septembre 2003StatutMembreDernière intervention15 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és17Date d'inscriptionvendredi 25 avril 2003StatutMembreDernière intervention12 juin 2008 19 déc. 2007 à 18:36
Belle source, super bien documentée et expliquée, merci :-)
Oniria
Messages postés292Date d'inscriptiondimanche 14 mars 2004StatutMembreDernière intervention18 décembre 20143 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és1154Date d'inscriptionsamedi 14 août 2004StatutMembreDernière intervention 5 avril 20123 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és1154Date d'inscriptionsamedi 14 août 2004StatutMembreDernière intervention 5 avril 20123 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és3874Date d'inscriptionmardi 8 mars 2005StatutModérateurDernière intervention 7 novembre 201413 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és4205Date d'inscriptionsamedi 16 octobre 2004StatutModérateurDernière intervention12 mars 202235 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és2527Date d'inscriptionjeudi 15 janvier 2004StatutMembreDernière intervention16 octobre 201918 17 déc. 2007 à 11:18
Salut,
Eh bein!..
Ca nous change du SIMOBROWSER.
Tu pourrais peut-être pousser jusqu'au niveau «expert», non? ;)
19 juil. 2011 à 17:01
15 juil. 2008 à 11:52
Je teste cette piste, merci :)
15 juil. 2008 à 11:45
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...
15 juil. 2008 à 01:44
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 ?
19 déc. 2007 à 18:36
19 déc. 2007 à 10:33
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
17 déc. 2007 à 19:36
Cordialement.
17 déc. 2007 à 19:32
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.
17 déc. 2007 à 17:45
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.
17 déc. 2007 à 17:21
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.
17 déc. 2007 à 11:18
Eh bein!..
Ca nous change du SIMOBROWSER.
Tu pourrais peut-être pousser jusqu'au niveau «expert», non? ;)