CRT Static Initializer List ausfindig machen



  • Ahoi alle zusammen! 🙂

    Es geht um Folgendes: Ich habe mir zwei kleine Libs geschrieben, eine zum auslesen von PDB-Files mittels DIA (Debug Interface Access) und was eigenes um Dateien im PE-Format zu laden und auszuwerten - da sind Dinge wie das Kopieren der Sections, Auswerten von Imports/Exports oder das Verarbeiten der Fixups usw. enthalten. Sinn und Zweck ist es, mal einfach den Weg eines Loaders selbst nachzuvollziehen und zu -programmieren. Die PDBs sind erst mal nur nebenläufig.

    Eine Frage die sich mir jetzt nun aber stellt ist die Sache mit der CRT und dem Aufrufen der Static Initializers. Mir ist bewusst, dass es in dem Image irgendwo eine Section .CRT mit diversen Gruppen gibt, und das in .CRT$XCZ bis .CRT$XPA die Pointer auf die C++ Static Initializer liegen - diese werden ja in der mainCRTStartup() (oder dem jeweiligen Entrypoint eben) über _initterm() nach und nach aufgerufen.

    Die Sache ist nur die, dass ich diese Section, oder irgendwelche Anzeichen über den Verbleib derselben, nirgends in den PE-Headern finden kann, auch ein PDB-Dump verläuft da ins Leere (wobei z.B. die extern deklarierten __xc_a bzw. __xc_z irgendwo da drin stehen, weiß bloß nicht wo genau). Ich bin gerade etwas ratlos woher die CRT beim Startup den Offset im geladenen Image für diese Static Initializer Liste herbekommt. Irgendwoher muss der NT-Loader doch wissen wo er die zu finden hat...

    Also als direkte Symbole kann ich sie jetzt zumindest über die PE-Informationen nicht finden. Weiß jemand wie die CRT, bzw. ICH jetzt da rankomme um die Static Initializer selbst aufzurufen?

    Für alle die wissen wollen warum ich das alles überhaupt mache, tja, schlicht und einfach damit ich mich mal praktisch etwas mehr in das Thema einarbeiten kann, weil's mich schon ziemlich interessiert und blosse Theorie imo nicht so viel bringt wie tatsächlich mal damit zu arbeiten.

    Hoffe jemand kann mir helfen!

    Grüße



  • Okay, ich Dussel. Kaum schreibe ich den Post zuende, fällt mir auch schon ein warum ich keine Symbole finde. Das ist natürlich eine Compiletime-Sache - die Adressen der Pointer auf die Initializer Liste sind bereits fix und direkt "reingebacken". Aber dennoch, kommt man da nur anhand der PE-Informationen da überhaupt noch ran?



  • Also ich konnte die Liste jetzt finden, sie ist doch in den PDBs verfügbar. Sie ist als PublicSymbol defininiert und die RVA kann wie's der Name bereits vermuten lässt über IDiaSymbol::get_relativeVirtualAddress() geholt werden.


Anmelden zum Antworten