Werden Argumente zu einer Funktion auf dem Stapel oder in einem Register übergeben werden?

StackOverflow https://stackoverflow.com/questions/976581

Frage

Ich bin derzeit analysiert ein Programm, das ich in der Montage schrieb und dachte über einen Code um in der Versammlung zu bewegen. Ich habe ein Verfahren, das ein Argument, aber ich bin nicht sicher, ob es auf dem Stapel oder ein Register übergeben wird.

Wenn ich mein Programm in IDA Pro öffnen, wird die erste Zeile in der Prozedur ist:

ThreadID= dword ptr -4

Wenn ich meine Cursor über die Erklärung schweben, auch folgendes erscheint:

ThreadID dd ?
 r db 4 dup(?)

, die ich würde auf einen Stapel Variable weist darauf annehmen?

Wenn ich das gleiche Programm in OllyDbg jedoch öffnen, an dieser Stelle auf dem Stapel befindet sich ein großer Wert, der mit jedem Parameter unvereinbar wäre, die übergeben werden konnte, führt mich zu glauben, dass es in einem Register geführt wird.

Kann jemand mich in die richtige Richtung?

War es hilfreich?

Lösung

Die Art und Weise Argumente an eine Funktion übergeben werden, hängt von der Konvention aufrufen. Die Standard-Aufrufkonvention ist abhängig von der Sprache, Compiler und Architektur.

Ich kann nichts sagen, sicher mit den Informationen, die Sie zur Verfügung gestellt, jedoch sollten Sie nicht, dass die Montage-Level-Debugger wie OllyDbg vergessen und Disassembler IDA wie oft Heuristiken, um das Programm Reverse-Engineering. Der beste Weg, um den Code generiert durch den Compiler zu studieren ist es zu instruieren Montage Inserate zu schreiben. Die meisten Compiler haben eine Option, dies zu tun.

Andere Tipps

Es ist eine lokale Variable sicher. Um zu prüfen, Argumente suchen [esp + XXX] Werte. IDA Namen diejenigen [esp + arg_XXX] automatisch.

.text:0100346A sub_100346A     proc near               ; CODE XREF: sub_100347C+44p
.text:0100346A                                         ; sub_100367A+C6p ...
.text:0100346A
.text:0100346A arg_0           = dword ptr  4
.text:0100346A
.text:0100346A                 mov     eax, [esp+arg_0]
.text:0100346E                 add     dword_1005194, eax
.text:01003474                 call    sub_1002801
.text:01003474
.text:01003479                 retn    4
.text:01003479
.text:01003479 sub_100346A     endp

Und Fastcall Konvention wie in Kommentar skizziert wurde oben verwendet Register Argument zu übergeben. Ich tippe auf Microsoft oder GCC-Compiler, wie sie weiter verbreitet werden. So ECX Check-out und EDX-Register zuerst.

  

Microsoft oder GCC [2] __fastcall [3]   Convention (aka __msfastcall) verläuft   die ersten beiden Argumente (bewertet   von links nach rechts), die in ECX passen und   EDX. Verbleibende Argumente gedrückt   auf den Stapel von rechts nach links.    http://en.wikipedia.org/wiki/X86_calling_conventions#fastcall

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top