IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Windows Discussion :

Thread et dll sous XP


Sujet :

Windows

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    39
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 39
    Points : 26
    Points
    26
    Par défaut Thread et dll sous XP
    Salut a tous,
    j'essaye de creer un thread dans un dll, mais, ca plante...

    voila le code...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    /*
    ** fonction appellee quand la dll est attachee
    */
    
    DWORD WINAPI  attachFunction(LPVOID lpParam)
    {
    	MessageBox(NULL, "WAPATILOUMPA!!!!!!!!! ", "hui", MB_OK);
    	MessageBox(NULL, "WAPATILOUMPA!!!!!!!!! ", "hui", MB_OK);
    	return 1;
    }
    
    /*
    ** main
    */
    
    BOOL
    WINAPI
    DllMain(IN	HANDLE	DllInstance,
    		IN	ULONG	ReasonForCall,
    		IN	LPVOID	Reserved)
    {
    	DWORD	ThreadId;
    	switch (ReasonForCall)
    	{
    	case	DLL_PROCESS_ATTACH:
    		CreateThread(NULL, NULL, attachFunction, NULL, 0, &ThreadId);
    		break;
    	case	DLL_PROCESS_DETACH:
    		break;
    	}
    	return (TRUE);
    }
    la dll est injectee dans un processus via createRemoteThread, ca plante apres l'affichage de la premiere boite de dialogue.
    je ne comprend pas du tout pourquoi

    si vous avez des infos, n'hesitez pas!


    pour info voila en gros les etapes du code injecteur:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    	HANDLE			hProcess;
    	HANDLE			hRemoteThread;
    	LPVOID			RemoteProcAddr;
    
    	hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, th32ProcessID);
    	RemoteProcAddr = VirtualAllocEx(hProcess, NULL, MAX_PATH, MEM_COMMIT,
    	PAGE_EXECUTE_READWRITE);
    
    	WriteProcessMemory(hProcess, RemoteProcAddr, TEXT("C:\\test.dll")), 
    	MAX_PATH, NULL);
    
    	hRemoteThread = CreateRemoteThread(hProcess, NULL, 0, 
    	(LPTHREAD_START_ROUTINE)GetProcAddress(GetModuleHandle(TEXT("kernel32.dll")),
    	 "LoadLibraryA"), RemoteProcAddr, 0, NULL);

  2. #2
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 519
    Points
    41 519
    Par défaut
    Déjà, n'utilise pas TEXT() si tu charges spécifiquement LoadLibraryA().

    Ensuite, pour le lancement du thread, je pense que ça devrait marcher, mais bon...
    Si ça ne marche pas, essaie de séparer chargement de la DLL et lancement de l'autre thread...
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  3. #3
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    39
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 39
    Points : 26
    Points
    26
    Par défaut
    merci de ton aide, mais j'avais deja tente de separer le chargement de la dll et le lancement de l'autre thread :/

    pour ce qui est de la macro TEXT(), je vais utiliser simplement LoadLibrary

  4. #4
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 519
    Points
    41 519
    Par défaut
    Tu ne peux, LoadLibrary() n'existe pas en tant que tel. Si elle figure dans la table d'exportation de la DLL, alors elle est mappée sur LoadLibraryA().

    Tu dois donc:
    • soit utiliser explicitement LoadLibraryA() avec "C:\\Test.dll" sans la macro TEXT(),
    • soit utiliser explicitement LoadLibraryW() avec L"C:\\Test.dll" (sans mettre la macro TEXT() non plus.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  5. #5
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    39
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 39
    Points : 26
    Points
    26
    Par défaut
    ok merci de l'info :-)

  6. #6
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    39
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 39
    Points : 26
    Points
    26
    Par défaut
    lorsque je charge la dll normalement, il n'y a aucun probleme

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    int	APIENTRY WinMain(HINSTANCE hInstance,
    					 HINSTANCE hPrevInstance,
    					 LPSTR lpCmdLine,
    					 int nCmdShow)
    {
    	LoadLibrary("C:\\test.dll");
    	return (0);
    }

    l'erreur doit donc se situer au niveau du code injecteur, mais j'ai beau chercher, je ne trouve rien : /

  7. #7
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 519
    Points
    41 519
    Par défaut
    Déjà, j'ai un doute sur le WriteProcessMemory() : Tu écris plus que tu devrais dans le processus fils...
    De plus, dans le VirtualAlloc(), ne faudrait-il pas cumuler les flags MEM_COMMIT et MEM_RESERVE?
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  8. #8
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    39
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 39
    Points : 26
    Points
    26
    Par défaut
    Apres avoir recommence mon prog
    he bien, il fonctionne (mais je n'ai pas saisi qu'elle etait l'erreur : / )

    pour ce qui est de WriteProcessMemory la memoire allouee par VirtualAllocEx correspond a MAX_PATH, donc je ne pense pas que se soit genant, mais effectivement ca pourrait etre un peu plus propre.

    en ce qui concerne l'etat de la memoire allouee par VirtualAllocEx, un simple MEM_COMMIT suffit.

    merci pour ton aide en tout cas

Discussions similaires

  1. Réponses: 5
    Dernier message: 08/09/2005, 20h33
  2. Enrgistrer une dll sous IIS
    Par jeff37 dans le forum ASP
    Réponses: 2
    Dernier message: 12/07/2004, 17h23
  3. DLL sous C++ builder 6
    Par ovdz dans le forum C++Builder
    Réponses: 3
    Dernier message: 05/08/2003, 14h15
  4. dll sous cygWin
    Par victorracine dans le forum C
    Réponses: 10
    Dernier message: 31/07/2003, 11h33
  5. Chargement dynamique de DLL sous Unix
    Par Willou dans le forum Autres éditeurs
    Réponses: 7
    Dernier message: 18/12/2002, 18h25

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo