Detection d'un messageBox et fermeture automatique
elroulianito
Messages postés17Date d'inscriptionlundi 27 janvier 2003StatutMembreDernière intervention31 janvier 2009
-
5 juil. 2005 à 16:21
Zootella
Messages postés252Date d'inscriptionvendredi 10 juin 2005StatutMembreDernière intervention 5 septembre 2006
-
7 juil. 2005 à 22:08
J'aimerai utiliser une fonction issue d'une dll. Le problème est qu'à l'execution de celle-ci une fenêtre de type messagebox apparait m'invitant à cliquer sur ok.
Comment faire pour eviter que cette fenêtre apparaisse?
Je précise que j'utilise les MFC sous vc6 avec une appli "dialog based".
Voici ma première ébauche
------------------------------------------------------------
// 0) je crée un thread pour fermer automatiquement la fenêtre active
UINT Thread(LPVOID lparam)
{
Sleep(100);
PostMessage(GetForegroundWindow(), WM_CLOSE, 0, 0);
AfxEndThread(TRUE);
return 0;
}
void MyDlg::OnButton()
{
// 1) Je lance le thread avant l'appel de la fonction dll
AfxBeginThread(Thread,this);
// 2) recours a la fonction contenue dans la dll
Mafonctiondll();
}
------------------------------------------------------------
Cette "solution" n'est pas recevable car je ne sais pas à quel moment la messagebox apparaît, je suppose simplement qu'au bout de 100ms je peux tenter de la fermer mais cela sans aucune garantie!!
A voir également:
Detection d'un messageBox et fermeture automatique
vecchio56
Messages postés6535Date d'inscriptionlundi 16 décembre 2002StatutMembreDernière intervention22 août 201014 5 juil. 2005 à 21:07
Je suis désolé de dire ca, mais le plus simple est de désassembler
l'exécutable (avec w32dasm). Tu cherche ou est l'appel de MessageBox
(tu trouves à partir des chaines utilisées par le programme). Tu dois
trouver un call ??? qui va faire je crois 5 octets en tout. Tu note
l'offset dans l'exécutable, et avec un editeur hexa, tu remplace par
des "nop" (code 90h, tu en mets donc 5 à la suite)
Zootella
Messages postés252Date d'inscriptionvendredi 10 juin 2005StatutMembreDernière intervention 5 septembre 2006 6 juil. 2005 à 13:47
Sinon tu peux aussi esseyer de faire ce que vecchio56 a dit sans
modifier la dll mais sa mémoire avec la fonction WriteProcessMemory().
D'ailleurs comment on modifie la mémoire d'une dll chargé ? if faut un
processid pour un processus, et pour une dll ? Ou alors elle est chargé
dans la mémoire du processus qui la charge ?
elroulianito
Messages postés17Date d'inscriptionlundi 27 janvier 2003StatutMembreDernière intervention31 janvier 2009 6 juil. 2005 à 15:03
Ok les gars, je vais essayer tant bien que mal ce que vous me dites. Mais j'avoue que mon ambition de réussite n'est plus aussi élevée. Je pense que ce sera plus de la curiosité qu'autre chose. Car cela m'a l'air bien compliqué tout ça!!
Je pensais naïvement qu'il existerait une fonction dans l'api windows "écoutant" les messages et interceptant celui d'un nouvelle fenêtre créee. Ainsi en lançant un thread d'écoute à un moment t. Lorsqu'à t+1 une fenêtre se crée (peut importe laquelle), celle-ci est automatiquement fermée.
En effet, on peut faire comme postulat que la prochaine qui s'ouvre est celle qu'on veut fermer. C'est pas "the solution" mais c'est un compromis résultat/temps passé.
vecchio56
Messages postés6535Date d'inscriptionlundi 16 décembre 2002StatutMembreDernière intervention22 août 201014 6 juil. 2005 à 18:30
Ce que tu décrit existe aussi, ca s'appelle un hook (de type WH_CBT). Regarde SetWindowsHookEx<NAME></NAME><link href="../../../../../css/ie4.css" type="text/css" rel="stylesheet"><!-- @ --><link href="../../../../../css/inetsdk.css" type="text/css" rel="stylesheet"><!-- @ --><style type="text/css">
PRE.clsCode { font-size:110%; }
PRE.clsSyntax { font-size:100%; }
TD DIV.clsBeta { display:none;}
elroulianito
Messages postés17Date d'inscriptionlundi 27 janvier 2003StatutMembreDernière intervention31 janvier 2009 7 juil. 2005 à 14:18
Pour commencer, merci beaucoup pour vos réponses et pour l'aide que vous vous proposez de m'offrir.
j'ai récupéré w32Dasm et l'éditeur hexadémal nécéssaire en complément (d'après différents topics) que j'ai choisi est pspad (il est apparemment conseillé d'utilisé hexaworkshop mais j'avais déjà pspad pour le php).
Plusieurs questions:
1) Comment trouver le call en question? La fonction dans le .h est déclarée comme ci-dessous:
BOOL LoadImage(LPCTSTR Filename);
2) Supposons que la ligne correspondante est trouvée (offset ??)
comment faire pour modifier celle-ci. Je précise que ma version de w32dasm est celle disponible à l'url http://www.hackatak.org/outils.php est-ce avec l'éditeur hexadécimal que l'on procède?
3) pour finir, zootella ou veux-tu que je la poste ma dll (me répond pas "dans ton c... !!" comme certaines de mes connaissances le font souvent)
Zootella
Messages postés252Date d'inscriptionvendredi 10 juin 2005StatutMembreDernière intervention 5 septembre 2006 7 juil. 2005 à 22:08
Avec windasm tu cherche le call à modifier avec l'editeur hexa tu le modifie.
Tu ouvres ta dll avec windasm puis en haut à droite tu as un bouton 'Strn Ref'
Tu clic dessus puis tu cherche dans la listbox le text qui s'affiche dans la messagebox.
Une fois trouvé tu double-clique dessus et normalement windasm
affichera le code asm qui affiche cette MessageBox (tu verras une ligne
bleue : reference to: USER32.MessageBoxA) le code à modifier se trouve
juste en dessous de cette ligne, donc tu sélectionne la première ligne
puis dans la barre de statut en bas tout en bas tu as '@offset
xxxxxxxxh' tu note ce numéro sans les zérosn et sans le h, tu vas dans
ton éditeur héxa, tu dois avoir l'option 'aller à l'offset' tu rentre
l'offset, là le curseur est direcment dessus, tu remplace FF15 (call)
par 90 90 (nop) et encore 4 fois 90 pour l'adresse de la fonction
MessageBoxA.