Wie bekomme ich den vollen Pfad von einer in eine .EXE geladene/injizierten dll(module)?



  • Ich habe eine unicode DLL (Hook.dll) erstellt in .net 2003. der Builder benutzt vc++. Ich lade die dll dynamisch mit einem hook in einen target process (Main.exe) mit einem dll injector.

    BOOL APIENTRY DllMain (HMODULE hDll, DWORD reason, PVOID lpReserved)
    {
    	if(Reason == DLL_PROCESS_ATTACH)
    	{
    		DisableThreadLibraryCalls(hDll);
    

    Ich habe nun eine funktion innerhalb meiner DLL(Hook.dll) die nun versucht den pfad mit namen von der DLL(Hook.dll) zu bekommen (vollen pfad mit dll name von der Hook.dll)

    Das ist der original code, dieser code erhält und liest die crc32 checksumme von der Main.exe (Target Prozess), was ich aber nicht will. ich will den namen der Hook.dll, damit ich sie scannen kann.

    pEXEFile = fopen(pszEXEFileName, "rb");
    

    nun habe ich den code umgewandelt zu diesem und kann die Hook.dll nun fopen und lesen, wenn ich diesen folgenden code benutze:

    pDLLFile = fopen("C:\\Dokumente und Einstellungen\\Shawn\\Desktop\\Hook.dll", "rb");
    

    Der obere Code funktioniert, er öffnet die Hook.dll und liest die crc32 checksumme der Hook.dll, aber bloss wenn ich die Hook.dll auf dem Desktop habe.

    eine andere variante die auch funktioniert:

    pDLLFile = fopen("\\Hook.dll", "rb");
    

    dieser code funktiniert wenn ich die Hook.dll im gleichen ordner platziere in der auch die Main.exe(Target Prozess) sich befindet.

    Ich dachte weil ich LoadLibrary benutze um die Hook.dll zu laden, das es in seinem eigenen Speicher geschehen würde. da habe ich doch wirklich gedacht
    ich könnte einfach die dll komonente benutzen um den datei namen der dll zu extrahieren mit GetModuleFileName.

    Wie auch immer, ich war sehr überrascht feststellen zu müssen, das es dem so nicht ist und der gewonnene name nicht der der dllname war, sondern der exename.

    Gibt es einen anderen weg um den dllnamen mit pfad (damit ich die dll dann scannen kann) zu bekommen wenn ich die dll dynamisch lade oder gibt es da eine bessere GetModuleFileName funktion?

    Das Problem besteht darin, das ich nicht den ordner kenne wo sich die dll befindet, wenn ich die dll in die exe injiziere und ich muss das während der runtime wissen.

    was ich versuche istim allgemeine: erhalte den vollen pfad von der geladenen dll in der runtime, dann die dll fopen um sie im binary modus zu lesen und den crc32 checksum hash zu bekommen, checke die crc32 checksumme und überprüfe und gebe die dll frei, wenn nicht irgendwas an der dll gemacht wurde, falls doch was daran gemacht wurde schliesse die main.exe.

    ich hab hier ein paar example codes gefunden, brauche nun aber hilfe wie genau ich das umsetzen muss, wie kann ich den code dazu bringen den dll namen der geladenen dll(module) anstelle von der main.exe zu geben mit GetModuleFileName?

    example codes:

    extern HINSTANCE _hInstance;
    
    const char *OurFileName()
    {
    static char our_filename[MAX_PATH + 1];
    
    if (!*our_filename)
    {
    GetModuleFileName(_hInstance, our_filename, sizeof(our_filename);
    }
    
    return our_filename;
    }
    
    You can do something like this to get path of a loaded module:  
    
    HMODULE hmod = NULL;  
    
    LPCTSTR lpszModuleName = TEXT("MyLibrary.dll");  
    
    TCHAR szPath[MAX_PATH + 1] = {0};  
    
    hmod = GetModuleHandle(lpszModuleName);  
    
    if (!hmod)  
    
    // handle error  
    
    GetModuleFileName(hmod, szPath, MAX_PATH);  
    
    FreeModule(hmod);  
    
    This copies path to the module into szPath.
    
    inside your hook.dll: GetModuleFileName(GetModuleHandle(NULL), szPath, MAX_PATH);
    
    use the first parameter of DllMain as handle to the dll in GetModuleFileName
    (Works for me if the type is HINSTANCE)
    

    Danke für jede Hilfe
    Shawn



  • Warum benutzt du nicht einfach

    MSDN schrieb:

    GetModuleFileName

    The GetModuleFileName function retrieves the fully qualified path for the specified module.

    in deiner DllMain mit hDll als ersten Parameter!?

    Greetz, Swordfish



  • Wie du das machst?
    Nicht mit Standard C++

    ~=> Falsches Forum



  • Ok hier ist mein code, wo genau muss ich den code einfügen und was genau?

    BOOL APIENTRY DllMain (HMODULE hDll, DWORD reason, PVOID lpReserved)
    {
    	if(Reason == DLL_PROCESS_ATTACH)
    	{
    		DisableThreadLibraryCalls(hDll);
    		if(bProt)
    		{
    			pb.StartProt();                            
    			Log.WriteLog("Prot Start @");
    			InitPB = 1;
    		}
    		if (!InitControlsDone)
    		{
    			HookEngine();
    			InitControls();
    			InitControlsDone = 1;
    		}
    	}
    	else if(Reason == DLL_PROCESS_DETACH)
    	{
    		if(bProt)
    		{
    			pb.FinishProt();
    			Log.WriteLog("Prot End @");
    		}
    	}
    	return 1;
    }
    

    @___da_da_da_ahah_ah, sry falls ich im falschen forum gepostet habe.

    @Swordfish habe ich gemacht, bloss ich krieg immer die exe nicht den dll namen. ich glaube ich mache da was falsch. dein tip klingt einleuchtend, ich soll GetModuleFileName in meiner dllmain function rufen und du meinst das geht? könntest du vielleicht ein kleines code beispiel posten damit ich mich daran orientieren kann. sry bin noch nicht so bewandert mit GetModuleFileName.



  • Ist ja kein Problem, am besten du wartest bis ein Moderator es ins WinAPI-Forum verschiebt. 🙂
    Zum Thema kann ich persönlich nix sagen, kenne mich mit WinAPI nicht aus.

    Trotzdem helfen dir vielleicht folgende Beispiele in dennen die Funktion innerhalb von DllMain genutzt wird:
    http://koders.com/cpp/fid0DEA42A9616C414C965CB31DD72BD5D277C93E6C.aspx?s=GetModuleFileName+DllMain
    http://koders.com/cpp/fid5A4716018ABBC25868965852B2CEA0F85942027C.aspx?s=GetModuleFileName+DllMain
    http://koders.com/c/fidE09850AABD6E403AD35C24701D88BF06D12C4DFF.aspx?s=GetModuleFileName+DllMain (zeile 361)



  • Dieser Thread wurde von Moderator/in evilissimo aus dem Forum C++ in das Forum WinAPI verschoben.

    Im Zweifelsfall bitte auch folgende Hinweise beachten:
    C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?

    Dieses Posting wurde automatisch erzeugt.



  • danke dir vielmals ___da_da_da_ahah_ah du warst eine sehr grosse hilfe, ohne dich und deine links hätte ich es nicht so schnell geschafft.

    hier das hat funktioniert:

    in meiner Main.h

    static char *dll_name;
    char bfr[1000];
    
    BOOL APIENTRY DllMain (HMODULE hDll, DWORD reason, PVOID lpReserved)
    {
        if(Reason == DLL_PROCESS_ATTACH)
        {
            GetModuleFileNameA((HMODULE) hDll, bfr, sizeof(bfr));//<- geht wunderbar
            dll_name = bfr;));//<- geht wunderbar
            DisableThreadLibraryCalls(hDll);
            if(bProt)
            {
                pb.StartProt();                            
                Log.WriteLog("Prot Start @");
                InitPB = 1;
            }
            if (!InitControlsDone)
            {
                HookEngine();
                InitControls();
                InitControlsDone = 1;
            }
        }
        else if(Reason == DLL_PROCESS_DETACH)
        {
            if(bProt)
            {
                pb.FinishProt();
                Log.WriteLog("Prot End @");
            }
        }
        return 1;
    }
    

    und dann in meiner CK.h (Check.h)

    pEXEFile = fopen(bfr, "rb");
    

    funktioniert nun wunderbar, bei fehlendem hashstamp oder bei nur einem einzigen geänderten bit in der dll binary, sendet die dll den exit befehl zu meiner Main.exe

    danke nochmals an alle die mir geholfen haben.


Anmelden zum Antworten