Hook le notepad

Signaler
Messages postés
12
Date d'inscription
dimanche 13 novembre 2005
Statut
Membre
Dernière intervention
29 juin 2009
-
Messages postés
12
Date d'inscription
dimanche 13 novembre 2005
Statut
Membre
Dernière intervention
29 juin 2009
-
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

Messages postés
933
Date d'inscription
dimanche 1 avril 2001
Statut
Modérateur
Dernière intervention
9 janvier 2012
2
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++
Messages postés
12
Date d'inscription
dimanche 13 novembre 2005
Statut
Membre
Dernière intervention
29 juin 2009

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
Messages postés
933
Date d'inscription
dimanche 1 avril 2001
Statut
Modérateur
Dernière intervention
9 janvier 2012
2
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++
Messages postés
12
Date d'inscription
dimanche 13 novembre 2005
Statut
Membre
Dernière intervention
29 juin 2009

Merci de ton aide!

David Fryda
Messages postés
12
Date d'inscription
dimanche 13 novembre 2005
Statut
Membre
Dernière intervention
29 juin 2009

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
Messages postés
12
Date d'inscription
dimanche 13 novembre 2005
Statut
Membre
Dernière intervention
29 juin 2009

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
Messages postés
933
Date d'inscription
dimanche 1 avril 2001
Statut
Modérateur
Dernière intervention
9 janvier 2012
2
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++
Messages postés
12
Date d'inscription
dimanche 13 novembre 2005
Statut
Membre
Dernière intervention
29 juin 2009

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