Programm zum analysieren einer PE-Datei



  • Weiss keiner, woran das liegen könnte?



  • Anonym_ schrieb:

    Weiss keiner, woran das liegen könnte?

    So trocken, wo man mit einer Debugger- Session binnen kürzester Zeit Bescheid wissen könnte? Nicht wirklich spassig.
    Poste doch einen Link auf so eine PE-Dödeldatei, dann guck ich mir das mal schnell an.

    „Erst wenn der letzte recursive tree gerodet,
    der letzte DebugCode unlinked,
    der letzte Bug gefangen ist,
    werden die Menschen feststellen,
    dass man printf() nicht essen kann, sondern bestenfalls drauf scheißen.“



  • pointercrash() schrieb:

    dass man printf() nicht essen kann, sondern bestenfalls drauf scheißen.“

    Häh?



  • Was bedeutet das Zitat und von wem stammt es?



  • john schrieb:

    Was bedeutet das Zitat und von wem stammt es?

    angeblich kommt's von den cree indianern: http://www.quotes.net/quote/16519
    🙂



  • Ja, war eine Anlehnung daran, daß Linus Thorvalds mal gesagt haben soll, daß er keinen Debugger braucht, solange printf() funktioniert.
    Ich finde, daß hier zuviel anlandet, das mit einem Debugger leicht gefunden hätte werden können und ich muß oft ohne printf() auskommen.



  • pointercrash() schrieb:

    Ja, war eine Anlehnung daran, daß Linus Thorvalds mal gesagt haben soll, daß er keinen Debugger braucht, solange printf() funktioniert.

    manchmal übertreibt er, obwohl printfs an entscheidenden stellen oft eine gute hilfe sind. also ich hab schon, während ein programm lief, am wust der vorbeiscrollenden ausgaben, fehler entdeckt, die sonst kaum aufgefallen wären.

    pointercrash() schrieb:

    ...und ich muß oft ohne printf() auskommen.

    port-pins wackeln, mit leds, oszi, oder logik-analyzer dran, hilft ja auch schon. *fg* (vor allem die letzten beiden sind für performancemessungen u.ä. unschlagbar).
    🙂



  • pointercrash() schrieb:

    Poste doch einen Link auf so eine PE-Dödeldatei, dann guck ich mir das mal schnell an.

    PE ist das Format, das bei Windows für ausführbare Dateien verwendet wird 😉

    http://www.chip.de/downloads/VLC-media-player_13005928.html



  • Anonym_ schrieb:

    Weiss keiner, woran das liegen könnte?

    Wurde ja eigentlich schon gesagt:

    //int *DataDirs[16][2]; // DataDir ist array von pointern auf int
    

    Das ist bestimmt nicht das, was Du gedacht hast, zu kriegen :p . Arrays als Funktionsargumente unterliegen sowieso schon diversen Beschränkungen, mit Pointern auf mehrdimensionale Arrays wird's dann doch unübersichtlich. Als schnellen Hack hab' ich mal ein

    static int DataDirs[16][2];
    

    gleich nach den includes reingehauen, die Funktion

    void GetDataDirs(FILE *datei, int PEPos)
    

    um den entsprechenden Parameter gekürzt und den Dereferenzierungskram rausgehauen. Zumindest augenscheinlich läuft's jetzt ohne Crash.
    Weniger Verhau verspricht eine Lösung, über Pointer auf Structs zu arbeiten oder meinetwegen sogar einen void *- Block zu übergeben und die Zeile/Spalte- Auflösung nach int selbst vorzunehmen. :xmas1:

    ;fricky schrieb:

    port-pins wackeln, mit leds, oszi, oder logik-analyzer dran, hilft ja auch schon. *fg* (vor allem die letzten beiden sind für performancemessungen u.ä. unschlagbar).

    Genau sowas, Yep, LogicPen haste vergessen. Beim Debuggen sind das aber die Nervtöter. Hab' mal zwei Wochen an etwa 100 LOC in Pascal mit Bug herumgewurstelt, dann den Code auf Inline- ASM runtergekürzt. Hab' mir dann einen Debug- Monitor gekauft, der ist aber auch andauernd abgestürzt. Letztlich war's ein CPU- Maskenfehler (AVR Mega103), der bei einem Interrupt manchmal die Instruction Pipe korrumpiert hat.
    Den Tray mit den restlichen CPUs hab' ich mit "Never without Debugger!" beschriftet und an die Wand gehängt.



  • Habe DataDirs zu static int geändert und den Parameter aus der Funktion gekürzt wie pointercrash() es geschrieben hat.

    Allerdings habe ich immernoch das Problem, dass ich weiter oben schon gepostet hatte:

    Anonym_ schrieb:

    Hier jetzt ein kleiner Ausschnitt aus der Datei "Test.exe":

    http://img5.imagebanana.com/img/sfvi680w/Screenshot.JPG

    Wie man unschwer erkennen kann, beginnt die Signatur beim Offset 0x0080.

    Wenn man jetzt 264(0x108) dazuaddiert, landet man bei 0x0188.

    Folgende Codestelle:

    *DataDirs[zaehler][zaehler2] = fgetc(datei) + fgetc(datei) * 0x100 + fgetc(datei) * 0x10000 + fgetc(datei) * 0x1000000;
    

    sollte ja jetzt folgendes auslesen:

    0x00 + 0x0E * 0x100 + 0x00 * 0x10000 + 0x00 * 0x1000000 = 0x0E00

    Allerdings ist der Rückgabewert 0x0E0000.

    Das ergibt mMn. keinen Sinn.



  • Anonym_ schrieb:

    Folgende Codestelle:

    *DataDirs[zaehler][zaehler2] = fgetc(datei) + fgetc(datei) * 0x100 + fgetc(datei) * 0x10000 + fgetc(datei) * 0x1000000;
    

    sollte ja jetzt folgendes auslesen:

    0x00 + 0x0E * 0x100 + 0x00 * 0x10000 + 0x00 * 0x1000000 = 0x0E00

    Allerdings ist der Rückgabewert 0x0E0000.

    Mach daraus mal vier Teilausdrücke. (Oder klammer Dir einen Wolf.) :xmas1:


Anmelden zum Antworten