Detection d'un messageBox et fermeture automatique

elroulianito Messages postés 17 Date d'inscription lundi 27 janvier 2003 Statut Membre Dernière intervention 31 janvier 2009 - 5 juil. 2005 à 16:21
Zootella Messages postés 252 Date d'inscription vendredi 10 juin 2005 Statut Membre Derniè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!!

7 réponses

vecchio56 Messages postés 6535 Date d'inscription lundi 16 décembre 2002 Statut Membre Dernière intervention 22 août 2010 14
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)
0
Zootella Messages postés 252 Date d'inscription vendredi 10 juin 2005 Statut Membre Derniè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 ?
0
elroulianito Messages postés 17 Date d'inscription lundi 27 janvier 2003 Statut Membre Dernière intervention 31 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é.

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

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>
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Zootella Messages postés 252 Date d'inscription vendredi 10 juin 2005 Statut Membre Dernière intervention 5 septembre 2006
7 juil. 2005 à 00:11
Sinon, on peut modifier ta dll si tu la poste.
0
elroulianito Messages postés 17 Date d'inscription lundi 27 janvier 2003 Statut Membre Dernière intervention 31 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);

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)
0
Zootella Messages postés 252 Date d'inscription vendredi 10 juin 2005 Statut Membre Derniè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.



Voilà normalement ça devrait marcher comme ça.



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