Problème chargeur dll

Résolu
M5i9k Messages postés 49 Date d'inscription mardi 22 novembre 2005 Statut Membre Dernière intervention 10 novembre 2007 - 6 août 2006 à 21:40
MuPuF Messages postés 536 Date d'inscription mercredi 27 avril 2005 Statut Membre Dernière intervention 22 août 2008 - 7 août 2006 à 21:25
Bonjour,

j'ai écrit un programme qui permet de charger une dll dans un processus, mais le programme fonctionne seulement en DEBUG, en RELEASE, j'ai un problème avec CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0), est-ce que cette fonction de marche qu'en debug?

voici mon code :

#include
#include
#include "windows.h"
#include <tlhelp32.h>

using namespace std;

BOOL Injecter(char *dllPath, DWORD pid)
{
    HANDLE hProc, hThread;
    HANDLE hAddress;
    HANDLE hKernel;
    VOID *pMem;
    DWORD dwExitCode;

    // Ouvre le processus
    hProc = OpenProcess(PROCESS_CREATE_THREAD | PROCESS_VM_READ | PROCESS_VM_WRITE | PROCESS_QUERY_INFORMATION | PROCESS_VM_OPERATION, FALSE, pid);
    if(!hProc)
        return FALSE;

    // Obtient l'adresse de la fonction LoadLibrary
    hKernel = GetModuleHandle("kernel32.dll");
    pMem = GetProcAddress((HMODULE)hKernel, "LoadLibraryA");
    if(!pMem)
    {
        CloseHandle(hProc);
        return FALSE;
    }

    // Crée un espace pour stocker l'emplacement de la dll dans le processus distant
    hAddress = VirtualAllocEx(hProc, NULL, strlen(dllPath), MEM_COMMIT, PAGE_READWRITE);
    if(!hAddress)
    {
        CloseHandle(hProc);
        return FALSE;
    }

    // Copie le chemin de la dll
    WriteProcessMemory(hProc, hAddress, dllPath, strlen(dllPath), NULL);

    // Lance un thread pour charger la dll
    hThread = CreateRemoteThread(hProc, NULL, NULL, (LPTHREAD_START_ROUTINE)pMem, hAddress, NULL, NULL);
    if(!hThread)
    {
        VirtualFreeEx(hProc, hAddress, NULL, MEM_RELEASE);       
        CloseHandle(hProc);
        return FALSE;
    }

    WaitForSingleObject(hThread, INFINITE);
    GetExitCodeThread(hThread, &dwExitCode);
   
    VirtualFreeEx(hProc, hAddress, NULL, MEM_RELEASE);       
    CloseHandle(hProc);
    CloseHandle(hThread);
   
    return dwExitCode>0?TRUE:FALSE;
}

int main(int argc, char *argv[])
{
    HANDLE hTool;
    PROCESSENTRY32 proc;
    BOOL bFound;

    // Vérifie les arguments
    if((argc < 2) || (!ATLPath::FileExists(argv[1])))
    {
        cout << "Nombre d'arguments incorrects ou dll introuvable." << endl;
        cout << "Inject [dll] [nom processus]";
        return 1;
    }

    hTool = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
    if(!hTool)
    {
        cout << "Impossible de creer hTool!" << endl;
        return 1;
    }

    bFound = FALSE;

    if(Process32First(hTool, &proc))
    {
        do
        {
            if(strcmp(proc.szExeFile, argv[2]) == 0)
            {
                if(!Injecter(argv[1], proc.th32ProcessID))
                {
                    cout << "Echec d'injection." << endl;
                }
                else
                {
                    cout << "Injection reussie." << endl;
                }
                bFound = TRUE;
            }
        }while(!bFound && Process32Next(hTool, &proc));
    }

    if(!bFound)
        cout << "Processus introuvable";

    CloseHandle(hTool);

    return 0;
}

Mon programme en release me donne toujours "Processus introuvable", alors qu'en debug il fonctionne très bien.

4 réponses

M5i9k Messages postés 49 Date d'inscription mardi 22 novembre 2005 Statut Membre Dernière intervention 10 novembre 2007
6 août 2006 à 23:03
J'ai trouvé mon erreur : il fallait rajouter proc.dwSize = sizeof(proc); et maintenant sa marche aussi en release.
3
wxccxw Messages postés 755 Date d'inscription samedi 15 mai 2004 Statut Membre Dernière intervention 30 janvier 2011
6 août 2006 à 23:46
pourquoi toujours commencer sont programmes en Debug ? ca ne sert a rien, et sa ralenti car sa ne marche pas toujour en release !

alors commence tout de suis ton projet en release et tu n'aurai pas eu ce probleme :)
voila
sinon bonne chance
0
elguevel Messages postés 718 Date d'inscription jeudi 19 décembre 2002 Statut Membre Dernière intervention 22 novembre 2016 3
7 août 2006 à 14:06
Ah les DLL injections ... :-)
0
MuPuF Messages postés 536 Date d'inscription mercredi 27 avril 2005 Statut Membre Dernière intervention 22 août 2008
7 août 2006 à 21:25
Le debug est seulement utile pour le debug en effet lol . Dans vc 2003 meme en release il y a des infos de debug lol, tu peux voir des variables (a condition que ton prog soit pas trop évolué dans le c++).
Enfin bon, faudrait voir si on grossis pas l'exe avec ce genre de code (et si on peux pas grater des cycles en les enlevant totalement).
Si ça se trouve en fait, en mode release, il ne connait que les adresses mémoires statiques (données à la compilation) donc forcement il peut y accéder une fois le programme lancé, mais faire du pas à pas, c'est chaud quand meme, ils ont dus trouver la technique ...
0
Rejoignez-nous