Hook le notepad

david_fryda Messages postés 12 Date d'inscription dimanche 13 novembre 2005 Statut Membre Dernière intervention 29 juin 2009 - 26 déc. 2006 à 11:19
david_fryda Messages postés 12 Date d'inscription dimanche 13 novembre 2005 Statut Membre Dernière intervention 29 juin 2009 - 28 déc. 2006 à 09:45
Salut a tous,

Je suis arrive a hooker le "About" du notepad.
Maintenant, si je voulais hooker le "FindText" du notepad, comment faudrait-il s'y prendre ?
J'ai essaye de code le hook mais je n'ai fait que neutraliser le la possibilite de rechercher un text dans notepad.

Merci d'avance pour l'aide.

David Fryda

8 réponses

cs_Arnotic Messages postés 933 Date d'inscription dimanche 1 avril 2001 Statut Membre Dernière intervention 9 janvier 2012
26 déc. 2006 à 12:37
Salut,

Dans mes sources tu trouveras l'exemple d'un hook sur le Notepad. Il te suffira juste de changer l'API que tu veux hooker.

@+
Arnotic,
Admin CS,
http://dev.winsysdev.com
MVP Visual C++
0
david_fryda Messages postés 12 Date d'inscription dimanche 13 novembre 2005 Statut Membre Dernière intervention 29 juin 2009
26 déc. 2006 à 15:13
Salut,

J'ai viens de regarder ton code. Pas mal.
Je m'y prends d'une maniere legerement diferente.
J'utilise les thunk tel qu'il est decrit sur le site de microsoft.

Voici le code de mon DLL :
    hCurrent = GetModuleHandle(NULL);
    ((PIMAGE_DOS_HEADER) hCurrent)->e_magic == IMAGE_DOS_SIGNATURE;
    pNTHeader = (PIMAGE_NT_HEADERS) (((DWORD) hCurrent) + ((PIMAGE_DOS_HEADER) hCurrent)->e_lfanew);
    pNTHeader->Signature == IMAGE_NT_SIGNATURE;
    pIVA = pNTHeader->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_IMPORT].VirtualAddress;
    pID = (PIMAGE_IMPORT_DESCRIPTOR) (((DWORD) hCurrent) + pIVA);
 


    while (pID->FirstThunk != 0)
 {
      lpName = (LPSTR) (((DWORD) hCurrent) + pID->Name); //nom de la DLL


   if (lstrcmpiA(lpName, "shell32.dll") == 0)
   {
        PIMAGE_THUNK_DATA pITDName;
        PIMAGE_THUNK_DATA pITDAddr;
        if (pID->Characteristics == 0) return FALSE;
        pITDName = (PIMAGE_THUNK_DATA) (((DWORD) hCurrent) + pID->FirstThunk);
        pITDAddr = (PIMAGE_THUNK_DATA) (((DWORD) hCurrent) + pID->OriginalFirstThunk);
        while (pITDAddr->u1.Function != 0)
  {
   if (IMAGE_SNAP_BY_ORDINAL(pITDAddr->u1.Ordinal) == 0)
   {
               PIMAGE_IMPORT_BY_NAME pImportName = (PIMAGE_IMPORT_BY_NAME) (((DWORD) hCurrent) + pITDAddr->u1.AddressOfData);
    if (lstrcmpiA((LPCSTR)pImportName->Name, "ShellAboutW") == 0)
    {
              DWORD dwOld;
      DWORD dwNew = PAGE_READWRITE;


     VirtualProtect(&(pITDName->u1.Function), sizeof(DWORD), dwNew, &dwOld) != 0;
     pITDName->u1.Function = (DWORD) MyShellAbout;
     VirtualProtect(&(pITDName->u1.Function), sizeof(DWORD), dwOld, &dwNew) != 0;
     return TRUE;
             }


          }
          ++pITDName;
          ++pITDAddr;
        }
      }
      ++pID;

En fait , je n'utilise pas SetWindowsHookEx.

Connais tu cette methode ?
Laquelle conseille tu ?

Merci!

David Fryda
0
cs_Arnotic Messages postés 933 Date d'inscription dimanche 1 avril 2001 Statut Membre Dernière intervention 9 janvier 2012
26 déc. 2006 à 18:58
Oui je connais. Le problème dans ce cas (avec ta méthode) est le fait qui si le programme fait un GetProcAddress pour récupérer l'adresse de l'API ton hook ne fonctionnera pas.

Avec ma méthode tu écris à l'adresse de l'API un jmp sur ta fonction. De ce fait dans tous les cas la fonction sera hooké. Personne ne peut passé au travers du piège.

@+
Arnotic,
Admin CS,
http://dev.winsysdev.com
MVP Visual C++
0
david_fryda Messages postés 12 Date d'inscription dimanche 13 novembre 2005 Statut Membre Dernière intervention 29 juin 2009
27 déc. 2006 à 08:05
Merci de ton aide!

David Fryda
0

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

Posez votre question
david_fryda Messages postés 12 Date d'inscription dimanche 13 novembre 2005 Statut Membre Dernière intervention 29 juin 2009
27 déc. 2006 à 08:33
Je me permets d'ajouter ces quelque lignes que j'ai lu sur le site de microsoft :
Dans les versions précédentes de Windows, les fonctions IsBadReadPtr et IsBadWritePtr étaient utilisées pour valider les paramètres. Elles n'existent plus sous Windows Vista aujourd'hui. En outre, les applications reposant sur les composants Windows qui utilisaient ces fonctions pour valider les paramètres ne pourront plus le faire. Les applications ne doivent plus effectuer la validation des paramètres via Windows

http://www.microsoft.com/france/msdn/windowsvista/compatibilites-applicatives-sur-windows-vista.mspx

Merci encore de ton aide.

David Fryda
0
david_fryda Messages postés 12 Date d'inscription dimanche 13 novembre 2005 Statut Membre Dernière intervention 29 juin 2009
27 déc. 2006 à 09:10
J'ai remplace dans ton code 2 choses : comdgl32.dll et FindTextW.

Normalement, lorsque je selectionne dans le menu "Rechercher text", on devrait voir le message box....mais rien ne se passe. Aucune fenetre ne monte :

Voici un extrait de ton code que j'ai modifier :
int MyFindTextW(HWND hWnd, LPWSTR lpText, LPWSTR lpCaption, UINT uType)
{
  int r;
  RemoveHook();
  r = MessageBoxW(hWnd, L"hello", L"DLLInject", uType);
  SetHook(pAddrS, pAddrToJumpS);
  return r;
}
void __stdcall InstallMyHooks()
{
  HINSTANCE hUser32;
  hUser32 =  LoadLibrary("comdlg32.dll");
  if(hUser32 == 0) return;
  pAddrS = (DWORD)GetProcAddress(hUser32, "FindTextW");
  if(pAddrS == 0) return;
  pAddrToJumpS = (DWORD)MyFindTextW;
  SetHook(pAddrS, pAddrToJumpS);
}

La signature de FindTextW est la suivante :
HWND FindTextW
(
  LPFINDREPLACEW <tt class="param">pfr</tt>
)

As tu une idee ?
Dois-je changer la signature de MyFindTextW ?
Merci.

David Fryda
0
cs_Arnotic Messages postés 933 Date d'inscription dimanche 1 avril 2001 Statut Membre Dernière intervention 9 janvier 2012
27 déc. 2006 à 09:43
Pour info sous Windows Vista j'ai bien réussi à hook la fonction via mon code. La preuve en image :

Il faudrai plus d'explication pour ton problème. Mais la méthode fonctionne, même sous Windows Vista RTM :-)

@+
Arnotic,
Admin CS,
http://dev.winsysdev.com
MVP Visual C++
0
david_fryda Messages postés 12 Date d'inscription dimanche 13 novembre 2005 Statut Membre Dernière intervention 29 juin 2009
28 déc. 2006 à 09:45
Salut,

Je laisse tombe la technique des thunk pour passer a la tienne.
Une question me chiffonee : comment sais tu a quelle address faire le jump ?

void __stdcall CreateJmp(DWORD dwTo, DWORD dwFrom)
{
  if(!IsBadReadPtr((void*)dwFrom, 1))
  *((byte*)((DWORD*)dwFrom)) = 0xe9; // JMP
  if(!IsBadReadPtr((void*)(dwFrom+1), 4))
  *((DWORD*)(dwFrom+1)) = (dwTo-dwFrom-5);
}

Merci.

David Fryda
0
Rejoignez-nous