DLL_PROCESS_ATTACH und geladene Module



  • Heyo,

    Ich versuche im Moment in einer EXE-Datei einen Import zu verändern, dass klappt ganz gut und wunderbar, wenn diese Funktion aus der EXE-Datei heraus aufgerufen wird.

    Sobald ich dies aber bei einer anderen EXE-Datei machen möchte, bei der ich in den Prozess eingeschleust werde - über ein WH_CBT - funktioniert dies jedoch nicht, da die DLLs zu diesem Zeitpunkt noch nicht initialisiert wurden.

    Da bereits in der win_main der veränderte Import benutzt werden soll kann ich auf keine anderen Hooks zurückgreifen.

    Weis jemand wie ich An die Initialisierte Importtable komme, bevor diese benutzt wird ?

    Vielen Dank schonmal



  • Das versteht doch niemand. Kann man das nicht vernünftig beschreiben?



  • Also, ich setze einen CBT Hook:

    (innerhalb der DLL die in den Zielprocess reinmuss)

    LRESULT CALLBACK CBTProc(int nCode,WPARAM wParam,LPARAM lParam) {
        return CallNextHookEx(CBThook,nCode,wParam,lParam) ;
    } ;
    
    void WINAPI InstallNCT(void) {
        GWMhook = SetWindowsHookEx(WH_CBT,&CBTProc,GetModuleHandle("MYDLL.dll"),NULL );
    } ;
    

    Dieser Code wird mit der ProzessID des Launchers ausgeführt. Sobald ein neuer Prozess erstellt/aktiviert ist wird der folgende Code durchgeführt:

    BOOL APIENTRY DllMain( HANDLE hModule, 
                           DWORD  ul_reason_for_call, 
                           LPVOID lpReserved
                         )
    {
        switch (ul_reason_for_call)
        {
            case DLL_PROCESS_ATTACH:
                if (isZielProzess()) {
                    HMODULE thismod = GetModuleHandle("MYDLL.dll") ;
                    LPVOID addr = GetProcAddress(thismod,"MyOverrideFunction") ;
                    ChangeImport_("D3DDrv.dll","DDRAW.dll","FunctionName",addr) ;
                } ;
                return TRUE ;
            case DLL_THREAD_ATTACH:
            case DLL_THREAD_DETACH:
            case DLL_PROCESS_DETACH:
                break;
        }
        return TRUE;
    } ;
    

    Wobei ChangeImport_(ModulName,ImportModulName,ImportFunctionName,Addresse) ;
    in der MudulName.dll den Import aus der ImportModulName.Dll mit dem Namen ImportFunctionName mit der Addresse überschreibt.

    Nun funzt das nicht, da die D3DDrv nich initialisiert ist... aber ich brauchs funzent 😉


Anmelden zum Antworten