Zitat von
generic:
Allerdings ist es praktisch unmöglich, eine beliebige Codeposition zweifelsfrei mit der Adresse der zugehörigen Funktion zu assoziieren, ohne über eine vollständige Funktionsliste zu verfügen, daher hilft das nichts.
Das ist nicht ganz richtig, es funktioniert in manchen Fällen allerdings nicht allen.
Tatsächlich war das die erste Frage, die mir durch den Kopf ging, als ich das hier gelesen hab und ich musste es gleich mal ausprobieren.
Es hängt davon ab wie der Compiler den Code erstellt, der deine Funktion aufruft, wenn es ein call mit einem offset aus einem Register ist, ist es fast unmöglich, da nicht mehr klar ist, welchen Wert das Register hatte und der Wert auch nicht ohne einen Großteil des Codes davor erneut durchzugehen wiederhergestellt werden kann. Wenn es sich allerdings um einen call mit festem Offset handelt ($E8 + 4 byte signed integer in little endian), dann ist es ohne weiteres möglich den Einsprungspunkt der Funktion zurückzurechnen.
Ein Label in
asm Code am Anfang der Funktion ist übrigens, falls jemand auf die Idee kommen sollte, auch wenig hilfreich, da (ausgenommen seien reine
asm Routinen) der Compiler davor dazu neigt, eine unterschiedliche Länge von Befehle zur Erstellung eines stackframes einzufügen. Abgesehen davon ist das auch noch aufwendiger als ein @Funktionsname (wofür man den Namen angeben müsste und dann bei jeder Funktion anderen Code hat) und erfüllt ja nicht die Bedingung, dass das ganze für jede Funktion mit dem selben (möglichst einzeiligen) Befehl geht.
Aber
imho ist es am sinnvollsten in solchen Protokoll-/Fehlermeldungen (oder für was braucht man das sonst?) einfach den Wert des EIP Registers einzufügen. Ist natürlich bei DLLs sinnlos und auch bei "normalen"
PE nen gewisses Risiko, das nicht an die Standardadresse geladen wird, aber in 95% der Fälle sollte das eine hilfreiche Information (sogar genau wo's geknallt hat) sein.
Was das Zurückrechnen der Einsprungspunkte betrifft, scheint das nicht zu funktionieren, falls die aufrufende Funktion ein Event ist, das aus der Messageschleife ausgelöst wird, aber ich habs jetzt nicht mehr genau durchprobiert.
Man kann einen Barbier definieren als einen, der alle diejenigen rasiert, und nur diejenigen, die sich nicht selbst rasieren.
Rasiert sich der Barbier?