ProxyDll mit Logfile (zur Laufzeit)



  • Hallo Leute,

    ich möchte die Aufrufreihenfolge von Funktionen, die von einer Dll exportiert werden mit einer ProxyDll (http://www.codeproject.com/Articles/16541/Create-your-Proxy-DLLs-automatically) analysieren. Zu diesem Zweck verwende ich folgenden Code:

    char calls[1000]; 
    BOOL WINAPI DllMain(HINSTANCE hInst,DWORD reason,LPVOID) 
    { 
    FILE * logfile;
    .
    .
    .
    p[0] = GetProcAddress(hL,"Funktion1"); 
    .
    .
    .
    .
    
    strcat(calls,"BeispielDll - STARTED \n"); 
    } 
     if (reason == DLL_PROCESS_DETACH)
     { 
    
    if(strlen(calls) < 1000) strcat(calls,"BeispielDll- STOPPED \n"); 
    if((logfile=fopen("C:\\LOG.txt","a")) != NULL) { 
    fprintf(logfile, calls); 
    fclose(logfile); 
    } 
    
    FreeLibrary(hL); 
     } 
    return 1; 
    }
    
    extern "C" __declspec(naked) void __stdcall func0()
    { 
    
    if(strlen(calls) < 1000) strcat(calls,"Funktion1 \n");
    
     __asm 
        { 
           jmp p[0*4];
        }
     }
    

    Mit diesem Konstrukt erhalte ich ein Logfile, wenn DLL_PROCESS_DETACH stattfindet.

    Nun möchte ich aber das Zusammenwirken der Funktionen aus 31 unterschiedlichen Dll analysieren. Mit der genannten Vorgehensweise erfahre ich zwar, welche Funktionen aus diesen Dll aufgerufen wurden, aber leider nicht in welcher Reihenfolge.
    Von den extern “c“ Aufrufen aus, kann ich nicht in ein Logfile schreiben. Das Hinzufügen einer Zeitmarke auf der Basis der Systemzeit scheitert daran, dass ein Aufrufen der Systemzeit nicht in den extern "C" Funktionen möglich ist.

    Ich würde mich sehr über einen Hinweis freuen, wie ich genau in dem Moment eine Message im Logfile erzeugen kann, wenn eine der extern "C" Funktionen aufgerufen wird.

    MfG.



  • 7x7-7 schrieb:

    Das Hinzufügen einer Zeitmarke auf der Basis der Systemzeit scheitert daran, dass ein Aufrufen der Systemzeit nicht in den extern "C" Funktionen möglich ist.

    Warum? Vielleicht steh ich komplett auf dem Schlauch, aber ich kann mir grad keinen Grund vorstellen. Und wenn dem so wäre, kannst du nicht einfach eine eigene "nicht extern C" Funktion schreiben, die das Logging übernimmt?



  • Hallo Mechanics,
    ja Zeitangaben gehen doch - ich habe wohl irgendwas falsch gemacht. Wichtig ist vermutlich nur, dass man keinen Variablen in den „extern „C“ Funktionen deklariert:

    char calls[1000]; 
     char inter[35];
    time_t ltime;
    
    *
    *
    *
    
    extern "C" __declspec(naked) void __stdcall func0()
    { 
    
     time(&ltime);
     sprintf(inter,"Funktion1: %d\n",ltime);
     if(strlen(calls) < 1000) strcat(calls,inter);
    
     __asm 
        { 
           jmp p[0*4];
        }
     }
    


  • Warum willst Du unbedingt "naked" verwenden?
    Das geht nur, wenn Du 'keinerlei Register veränderst (oder nur ganz bestimmte)... da Du aber Methoden aufrufst, erfüllt dies schon mal nicht die Bedingung...

    Siehe auch:
    http://msdn.microsoft.com/en-us/library/k2b2ssfy.aspx



  • Hallo Jochen,

    ich habe mich an eine Methode gehalten, deren Uhrsprung ich in meinem ersten Beitrag aus „codeprojekt.com“ verlinkt habe (s.o.). Glücklicherweise funktioniert das Ganze für meine Problematik (siehe ebenfalls oben) bis auf weiteres für einige Beispiele bereits ohne nennenswerten Absturz. Anhand des Logfiles und der darin enthaltenen Zeitmarken kann ich dann nachvollzeihen, in welcher Reihenfolge bestimmte Funktionen aus den 31 Dll‘s (s.o.) aufgerufen werden. Leider ist das Ganze nur im Sekundentakt möglich.

    MfG.


Log in to reply