Detection d'un messageBox et fermeture automatique

Signaler
Messages postés
17
Date d'inscription
lundi 27 janvier 2003
Statut
Membre
Dernière intervention
31 janvier 2009
-
Messages postés
252
Date d'inscription
vendredi 10 juin 2005
Statut
Membre
Dernière intervention
5 septembre 2006
-
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!!

7 réponses

Messages postés
6535
Date d'inscription
lundi 16 décembre 2002
Statut
Modérateur
Dernière intervention
22 août 2010
7
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)
Messages postés
252
Date d'inscription
vendredi 10 juin 2005
Statut
Membre
Dernière intervention
5 septembre 2006
1
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 ?
Messages postés
17
Date d'inscription
lundi 27 janvier 2003
Statut
Membre
Dernière intervention
31 janvier 2009

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é.

...
Messages postés
6535
Date d'inscription
lundi 16 décembre 2002
Statut
Modérateur
Dernière intervention
22 août 2010
7
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;}

A:link { color:#0000ff; text-decoration:underline;}
A:visited { color:#0000ff; text-decoration:underline;}
A:hover { color:#3366ff; text-decoration:underline;}
MSHelp\:link {
color:#0000ff;
text-decoration:underline;
cursor:hand;
hoverColor:#3366ff;
filterString: ;}
</style><link href="ms-help://Hx/HxRuntime/HxLink.css" type="text/css" rel="stylesheet"> dans MSDN<XML id="_topicdata" pagetype="function" proj="WinUIHXS" name="SetWindowsHookEx" pubpath="/WinUI/WindowsUserInterface/Windowing/Hooks/HookReference/HookFunctions/SetWindowsHookEx.htm"><!-- topic data --><root></root></XML><xml xmlns:mshelp="http://msdn.microsoft.com/mshelp"></xml>
<dd><dl><dt>
</dd></dl>
Messages postés
252
Date d'inscription
vendredi 10 juin 2005
Statut
Membre
Dernière intervention
5 septembre 2006
1
Sinon, on peut modifier ta dll si tu la poste.
Messages postés
17
Date d'inscription
lundi 27 janvier 2003
Statut
Membre
Dernière intervention
31 janvier 2009

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);

et dans le .cpp on retrouve:

BOOL CCVimage::LoadImage(LPCTSTR Filename)
{
BOOL result;
static BYTE parms[] = VTS_BSTR;
InvokeHelper(0x21, DISPATCH_METHOD, VT_BOOL, (void*)&result, parms, Filename);
return result;
}

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)
Messages postés
252
Date d'inscription
vendredi 10 juin 2005
Statut
Membre
Dernière intervention
5 septembre 2006
1
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.



Voilà normalement ça devrait marcher comme ça.



Sinon tu poste ta dll dans ton c.. euh sur http://www.yousendit.com/