Wie lese ich die Funktionsparameter aus Call-Stack-Frames programmgesteuert in Windows?

9

Ich habe versucht, durch die Call-Stack-Frames zu gehen und einige Informationen daraus zu extrahieren. Ich bin in der Lage, die Dateinamen, Zeilennummern und Funktionsnamen zu extrahieren, indem Sie% Co_de%,% Co_de% und% Co_de% APIs von WinDBG verwenden.

Das StackWalk64 in SymGetSymFromAddr64 , das ein Rückgabewert von SymGetLineFromAddr64 ist, unterstützt jedoch nur das Zurücklesen von vier 64-Bit-Funktionsparametern aus einem Frame. Schlimmer noch, im 32-Bit-System werden nur die unteren 32 Bits von DWORD64 Params[4] verwendet, so dass ein einzelner Parameter mit mehr als 32 Bits zwei oder mehr Elemente benötigt.

%Vor%

Ich konnte keine API finden, um ALLE Parameter aus einem Stack-Frame ohne Einschränkung zu lesen.

Ich dachte daran, STACKFRAME64 / StackWalk64 zu verwenden, um die Werte aus dem Stack (x86 / x64) und den Registern (x64) zu extrahieren. Aber trotzdem können nur die "möglichen" Werte der Parameter erhalten werden, wenn ich das tue.

Gibt es irgendeine API, die ich verwenden könnte, um die genauen Werte zu erhalten? Es wäre noch besser, wenn ich den Typ und den Namen der Parameter bekommen könnte.

    
stanleyli 17.04.2014, 22:16
quelle

1 Antwort

1

Es gibt keine API dafür. Warum sollte es welche geben, moderne Betriebssysteme sind nicht daran interessiert, dass einige Leute mit diesem Zeug spielen. Wie bereits erwähnt, kann der Compiler Optimierungen vornehmen, so dass Sie kein deterministisches Werkzeug dafür haben können. Aber, es gibt Heuristiken! Sie können wissen, wie viele Parameter in Funktion sind, wenn Sie Assembly vor dem Aufruf analysieren oder nach dem Aufruf zurückkehren. Sie haben immer eine Absenderadresse, die Sie überprüfen können, ob sie in CS ist.

Vor allem - sollten Sie über den Begriff "Stack Abwickeln" lesen.

    
Roman Smelyansky 02.05.2014 12:43
quelle

Tags und Links