PE Executable Struktur



  • Hallo,

    folgende Frage:
    Ich habe zwei kleine Programme, die eigentlich garnichts machen.
    Programm1 ist in C++ geschrieben, Programm2 in Assembler.

    Wenn ich Programm2 im Debugger (OllyDbg) anschaue, finde ich eben nur das was ich auch geschrieben habe.
    Wenn ich aber Programm1 anschaue, finde ich unter meinen Anweisungen noch viele andere Anweisungen. Da sind dann Funktionsaufrufe wie "GetSystemTimeAsFileTime", "GetTickCount", "QueryPerformanceCounter" und viele andere.
    Ich denke mal, dass es sich dabei um eine Art Prolog handelt, da ich diese Aufrufe auch in anderen Programmen finde.

    Kann mir das jemand erklären?

    Danke...



  • Dieser Thread wurde von Moderator/in SeppJ aus dem Forum C++ (auch C++0x, bzw. C++11) in das Forum Rund um die Programmierung verschoben.

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

    Dieses Posting wurde automatisch erzeugt.



  • Benutzername232132 schrieb:

    folgende Frage:
    Ich habe zwei kleine Programme, die eigentlich garnichts machen.

    /closed



  • Störenfried schrieb:

    Benutzername232132 schrieb:

    folgende Frage:
    Ich habe zwei kleine Programme, die eigentlich garnichts machen.

    /closed

    Hab ich etwas falsches gesagt?



  • Nö, ich bin nur grad sauer auf die Welt.



  • Kommt da noch etwas sinnvolles?

    folgende Frage:
    Ich habe zwei kleine Programme, die eigentlich garnichts machen.

    Was ist daran so schlimm, dass ich keine Antwort bekomme?



  • Die Runtime wird initialisiert, Exception-Handling wird vorbereitet etc.
    Wenn du mal die Binary uppst kann ich dir mehr sagen.



  • Klar, hier der Upload.
    Ist aber eigentlich nicht nötig.

    #include <Windows.h>
    int WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int){
    	return 1;
    }
    

    Das ist alles, kompiliert @Visual Studio, Win7. Die Aufrufe von MSVCR betreffen ja die C++ Runtime, das ist mir klar, aber OllyDbg gibt mir z.B.

    kernel32.GetCurrentProcessId
    kernel32.GetCurrentThreadId
    kernel32.GetTickCount
    kernel32.QueryPerformanceCounter
    kernel32.IsDebuggerPresent
    kernel32.TerminateProcess
    

    Nun würde ich eben gerne wissen, was da passiert, weil es ja sehr "Windowsspezifisch" aussieht.



  • Die Funktionen hängen praktisch alle mit dem Security-Cookie zusammen.
    Zum Cookie: http://uninformed.org/index.cgi?v=7&a=2&p=7

    TerminateProcess wird bei Mismatch aufgerufen.

    Und so wird es zusammengebaut:

    GetSystemTimeAsFileTime(&SystemTimeAsFileTime);
    v1 = GetCurrentProcessId() ^ SystemTimeAsFileTime.dwLowDateTime ^ SystemTimeAsFileTime.dwHighDateTime;
    v2 = GetCurrentThreadId() ^ v1;
    v3 = GetTickCount() ^ v2;
    QueryPerformanceCounter(&PerformanceCount);
    v4 = PerformanceCount.LowPart ^ PerformanceCount.HighPart ^ v3;
    

    Der Cookie wird nach ein paar Checks auf v4 gesetzt.



  • Ah...das erklärt doch einiges aber:

    Habe gerade festgestellt dass wenn ich bei meinem Projekt einen Einstiegspunkt in den Projekteigenschaften manuell festlege, dieser ganze "unnötige Quatsch" weg ist, und meine Exe von 32kb auf 2bk schrumpft. Auch die ganzen DLL-Abhängigkeiten sind weg (habe mit "Dependency Walker" nachgeschaut).

    Wie kommt das?
    Die ganzen Aufrufe sind doch nicht nötig, um automatisch den Einstiegspunkt zu finden 😃


Anmelden zum Antworten