Werden Argumente zu einer Funktion auf dem Stapel oder in einem Register übergeben werden?
-
13-09-2019 - |
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?
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