![]() |
[Assemmbler] Aufrufkonvention erkennen
Kann man anhand des Aufrufs einer Funktion in einem fremden Programm, die Paramteranzahl dieser Funktion ermitteln? Ich schätze die Funktion hat etwa sieben Parameter, die ersten drei sind PWideChars, 4-8 sind einfach 0, wenn ich die Funktion zum test hooke.
Sie hat auch einen Rückgabewert, da ja eax mit 1 verglichen wird. Eigentlich dachte ich immer, die ersten drei Paramter werden in ebx, ecx und edx abgelegt, aber wie funktioniert das nun bei so vielen Parametern?
Code:
* Reference To: KERNEL32.GetProcAddress, Ord:0197h
| :00407753 FF1580104000 Call dword ptr [00401080] :00407759 3BC6 cmp eax, esi :0040775B 743D je 0040779A :0040775D 56 push esi :0040775E FF7524 push [ebp+24] :00407761 FF7520 push [ebp+20] :00407764 FF751C push [ebp+1C] :00407767 FF7518 push [ebp+18] :0040776A FF7514 push [ebp+14] :0040776D 56 push esi :0040776E 56 push esi :0040776F 56 push esi :00407770 56 push esi :00407771 56 push esi :00407772 FF7510 push [ebp+10] :00407775 FF750C push [ebp+0C] :00407778 FF7508 push [ebp+08] :0040777B FFD0 call eax :0040777D 83F801 cmp eax, 00000001 :00407780 7429 je 004077AB :00407782 50 push eax :00407783 6868254000 push 00402568 :00407788 6838254000 push 00402538 |
Re: [Assemmbler] Aufrufkonvention erkennen
Die Parameterreihenfolge ist meinen Beobachtungen nach EAX-EDX-ECX-EBX-Top of Stack-Top of Stack-4, ... usw. Korrigiert mich, wenn ich falsch liege ;)
Wenn du den aufrufenden Code hast, musst du dann einfach nur sehen, welche Register benutzt und was auf den Stack gepusht wird, dann hast dus fast schon. |
Re: [Assemmbler] Aufrufkonvention erkennen
Zitat:
allgemein kann man sich aber nicht darauf verlassen, wie Delphi die Parameter übergibt, da sozusagen der Compiler es selber entscheidet, wie es nun am besten ist. das gilt meines Wissens auch wenn man z.b. die Direktive "register" anhängt. (anders natürlich bei Direktiven a la "stdcall", "cdecl" etc., da bei diesen Aufrufkonventionen ja ausschliesslich der stack genutzt wird, und die direktiven zweifelsfrei angeben, wie und in welcher reihenfolge die parameter auf den stack gelegt werden müssen). edit: das sagt die Delphi-Hilfe: Zitat:
|
Re: [Assemmbler] Aufrufkonvention erkennen
Das duerfte stdcall sein. Register kann es nicht sein, da sonst Parameter in die Register geladen wuerden.
Cdecl kann es nicht sein, da sonst nach dem call die Parameter wieder vom Stack geraeumt werden wuerden. |
Re: [Assemmbler] Aufrufkonvention erkennen
Zitat:
Zitat:
Zitat:
@scp: Wie groß ist das Programm? Kannst du es mir zuschicken? Man kann aus diesem kleinen Abschnitt nichts sagen. Wieso? Weil zB das CALL EAX auch nur ein Parameter vom Stack nehmen könnte und ein CALL danach nochmal 3 weitere und der folgende noch weitere ... ihr seht, daß man keine Diagnose ohne Kontext stellen kann. |
Re: [Assemmbler] Aufrufkonvention erkennen
Zitat:
ich bin z.b. schon öfter derbe auf die fresse gefallen, weil ich proceduren mit parametern komplett in ASM geschrieben habe und mich dann komplett auf eine Art der Parameterübergabe festgeschrieben hatte... (z.b. wurde von Delphi implizit die register-Konvention benutzt und ich hab in der Procedure fröhlich EAX und ECX benutzt, weil ich ja dachte, die Parameter lägen auf dem Stack) |
Re: [Assemmbler] Aufrufkonvention erkennen
Zitat:
Zitat:
Zitat:
|
Re: [Assemmbler] Aufrufkonvention erkennen
Zitat:
Zitat:
Zitat:
|
Re: [Assemmbler] Aufrufkonvention erkennen
Zitat:
Zitat:
Zitat:
(Warnung: Fehlerhafte code)
Delphi-Quellcode:
Was kommt da wohl raus?
procedure DoSomething(a, b, c: Integer);
asm mov eax, b mov edx, a mov ecx, c end;
Code:
Und das ist Müll.
mov eax, edx
mov edx, eax mov ecx, ecx ret |
Re: [Assemmbler] Aufrufkonvention erkennen
Zitat:
Zitat:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 22:12 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz