begin process at 2010 03 17 07:42:02
  Trouver un code source :
 
dans
 
Accueil > Forum > 

C++ & C++ .NET

 > 

Windows

 > 

System

 > 

VirtualProtect qui crash


Derniers messages déposésPoser une question dans le forum ou lancer une discussion

VirtualProtect qui crash

jeudi 2 juillet 2009 à 10:39:10 | VirtualProtect qui crash

TryToHelpMe

Bonjour, après avoir lu plusieurs sources de ce site sur le hook de l'API, j'essaye de réaliser ma propre source, pour bien comprendre comment cela fonctionne.

Je réalise donc un hook global, puis lorsque l'application qui m'intéresse map ma DLL, je récupère l'adresse de la fonction qui m'intéresse via les instructions suivantes :

[code]
    HMODULE hDll;
    GetModuleHandleEx( 0, dllName, &hDll );
    DWORD *adresse = (DWORD*)GetProcAddress( hDll, fonction );
[/code]

Peut être qu'il y a un problème à ce niveau?

Puis je veux ensuite modifier cette adresse, donc je doit modifier les accès à cette zone mémoire, via la fonction VirtualProtect :

[code]
   MessageBox( 0, L"Ici", L"Debug", 0 );
   VirtualProtect( (LPVOID)adresse, 4, PAGE_EXECUTE_READWRITE, previousProtection );
   MessageBox( 0, L"Ici2", L"Debug", 0 );
[/code]

J'ai entouré la fonction de MessageBox, pour m'assurer que c'est bien à ce niveau que l'application plante. Donc je n'ai pas d'erreur de compilateur, mais lors de l'exécution, je recois ma première MessageBox, puis l'application cesse de fonctionner.

Ce que je ne comprends pas c'est pourquoi la fonction n'échoue pas tout simplement auquel cas je pourrais récupérer le message d'erreur...

Merci pour votre aide.
jeudi 2 juillet 2009 à 13:18:37 | Re : VirtualProtect qui crash

rt15

Membre Club Administrateur CodeS-SourceS
Salut,

C'est quoi ton previousProtection ? Si c'est un DWORD, c'est mal barré. Il attend un PDWORD.

VirtualProtect( (LPVOID)adresse, 4, PAGE_EXECUTE_READWRITE, &previousProtection );

C'est logique. C'est un paramètre de sortie -> il lui faut l'adresse d'un DWORD.
jeudi 2 juillet 2009 à 13:20:18 | Re : VirtualProtect qui crash

rt15

Membre Club Administrateur CodeS-SourceS
Exemple de hook comme tu le fais ici.
jeudi 2 juillet 2009 à 14:07:39 | Re : VirtualProtect qui crash

TryToHelpMe

D'accord avec toi, j'avais déclaré ainsi:

DWORD *previousProtection = NULL;

Donc normalement c'est bon... Sachant que typedef DWORD *PDWORD
jeudi 2 juillet 2009 à 14:12:12 | Re : VirtualProtect qui crash

rt15

Membre Club Administrateur CodeS-SourceS
lol !

Bin non...

A quoi revient ton code ? A ça :

VirtualProtect( (LPVOID)adresse, 4, PAGE_EXECUTE_READWRITE, NULL);

Donc boum !

Tu peux éventuellement faire pointer sur un DWORD si tu tiens à ton pointeur :
DWORD *lpPreviousProtection;
DWORD previousProtection;
lpPreviousProtection = &previousProtection;
jeudi 2 juillet 2009 à 14:39:32 | Re : VirtualProtect qui crash

TryToHelpMe

En effet je n'avais pas été scrupuleux en initialisant à NULL, je viens de relire la doc.

Cependant la méthode que tu me donnes, à savoir :

DWORD *lpPreviousProtection;
DWORD previousProtection;
lpPreviousProtection = &previousProtection;

Est je pense valide, mais l'application plante toujours au même endroit et de la même façon :s...
jeudi 2 juillet 2009 à 14:51:09 | Re : VirtualProtect qui crash

TryToHelpMe

J'ai été voir une de tes sources qui traite du sujet, et tu dis qu'une fonction utilisée par l'exe, mais importée par le biais d'une autre DLL, ne peut pas être filtrée?

Celà vient sans doute de là mon problème, puisque l'exe fait appel à une DLL network, qui elle même fait appel à la DLL WS2_32...

Est ce possible que mon problème vienne de là?
jeudi 2 juillet 2009 à 15:13:00 | Re : VirtualProtect qui crash

rt15

Membre Club Administrateur CodeS-SourceS
Juste pour être sûr...
Avec mon code :

DWORD *lpPreviousProtection;
DWORD previousProtection;
lpPreviousProtection = &previousProtection;

Faut pas faire l'appel comme ça :
VirtualProtect( (LPVOID)adresse, 4, PAGE_EXECUTE_READWRITE, previousProtection );
mais comme ça :
VirtualProtect( (LPVOID)adresse, 4, PAGE_EXECUTE_READWRITE, lpPreviousProtection );


Est ce possible que mon problème vienne de là?

Non. Avec la méthode que tu utilises ici, ça marche dans tous les cas.
jeudi 2 juillet 2009 à 15:27:42 | Re : VirtualProtect qui crash

TryToHelpMe

Oui, je ne me suis pas trompé dans l'appel de la fonction...

Mais pourtant la fonction ne devrait pas apparaitre dans l'IAT de l'exe si il ne la charge pas directement?
jeudi 2 juillet 2009 à 15:35:28 | Re : VirtualProtect qui crash

rt15

Membre Club Administrateur CodeS-SourceS
Oui, la fonction n'apparaît pas dans la table d'import.

Mais la méthode utilisée ici écrase la fonction elle même. Pas la table d'import.

Au fait, tu as testé "adresse" ? Si la dll n'est pas (encore) chargée, GetModuleHandleEx renvoie rien de bon. Faut tout tester, comme j'ai fait dans mon code :

  /* Chargement de la librairie */
  hUser32 = LoadLibrary(_T("user32.dll"));
  if (! hUser32) goto the_end;

  /* Récupération de l'adresse de la fonction Win32 */
  lpWin32MsgBox = (char*)GetProcAddress(hUser32, MSGBOX_FUNC);
  if (! lpWin32MsgBox) goto free_lib;

  /* Lock de la zone pour la rendre accessible en écriture */
  if (! VirtualProtect(lpWin32MsgBox, 5, PAGE_EXECUTE_READWRITE, &nOldProtect)) goto free_lib;

1 2 3

Cette discussion est classée dans : fonction, code, adresse, messagebox, virtualprotect


Répondre à ce message

Sujets en rapport avec ce message

getch() sous Linux [ par yapud ] Bonjour,J'ai un probleme avec la fonction gecth() se trouvant danc la librairie CURSES.H sous LINUX !J'utilise cette meme fonction sous WINDOWS qui ma LVN_ENDLABELEDIT [ par Xentor609 ] Salut,Voici mon code pour edit un item dans une listview:Pour le Begin, pas de probleme, mais pour le ENDLABELEDIT, il m'affiche la msgbox, et juste a Fonction return dans une console windows [ par Jolfulorc ] Bonjour,Lorsque j'affiche un texte dans une console windows (code du genre : coutla façon que j'ai trouvé pour contourner cet inconvénient Timers haute précision [ par SMarmotte ] Bonjour à tousJe cherche à attendre EXACTEMENT 60 micro secondes.J'ai fait cette routine mais elle me bouffe 50% du temps CPU du fait que je dois l'ap Problème de code en c++ (fonction itoa) [ par mimyne ] voila g le code suivant:void Resultat_Clicked(Object* pSender, EventArgs* pArgs){ int operation = 5; char* chaine[2]; if (pSender == Btnres) { { ito Nombre aléatoire en C [ par FoLKeN91 ] Bonjour tout le monde.Alors voici mon probleme, j'ai beau cherché je n'arrive pas à le résoudre. Je désire faire une fonction qui renvoie un nombre al la fonction "afficher le source" de internet explorer [ par zip8000 ] Bonjour,je cherche a reproduire le resultat de la fonction "afficher la source" qui ouvre le code html d'une page internet. Mon but est de recuperer c probleme avec la fonction pow() [ par jeani763 ] j'ai un probleme avec la fonction powvoila mon code long int lettre1=pow(110,5);vous puriez me dire ce qui ne va pas pleas à propos des threads [ par GUERRIER_ABSOLU ] Salut, je voudrais savoir s'i quelqu'un a déjà essayé d'appeler une fonction dans un thread et a remarqué quelque chose d'innatendu. En fait quand j'a Récupération d'une adresse IP avec GetAddress [ par Tribute2U ] Bjr, je cherche un moyen pour récupérer l'adresse IP saisie sur un champ de type 'IP Address'. Je sais que c'est la classe CIPAddressCtrl qui est derr


Nos sponsors


Sondage...

Comparez les prix

CalendriCode

Mars 2010
LMMJVSD
1234567
891011121314
15161718192021
22232425262728
293031    

Consulter la suite du CalendriCode

Photothèque

 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 0,437 sec (4)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales