![]() |
[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:
|
Re: [Assemmbler] Aufrufkonvention erkennen
Zitat:
Zitat:
|
Re: [Assemmbler] Aufrufkonvention erkennen
Scheint ein interessantes Thema zu sein :-)
Habe mittlerweile die Anzahl mittels "Neuron PE Disassembler" rausgefunden: Es sind 14 (!) DWORD bzw. Pointer-Parameter. PS: Es handelt sich um eine VC DLL, nur der Aufruf erfolgt jetzt über Delphi. |
Re: [Assemmbler] Aufrufkonvention erkennen
Zitat:
![]() Wenn noch was in Sachen RE ist, haste ja meine Mailadresse ;) |
Re: [Assemmbler] Aufrufkonvention erkennen
Zitat:
|
Re: [Assemmbler] Aufrufkonvention erkennen
Nö, auch das weis der Disassembler, es ist stdcall und klappt auch.
|
Re: [Assemmbler] Aufrufkonvention erkennen
Zitat:
Und das hängt nunmal wirklich von der DLL ab. Fastcall ist mir auch schon begegnet, Cdecl ebenfalls, aber am häufigsten sind immernoch Stdcall und Safecall. |
Re: [Assemmbler] Aufrufkonvention erkennen
naja das man auch in DLLs die konvention frei wähöen kann ist ja eigentlich klar, nur dachte ich, dass sich da als Quasi-Standard die cdecl etabliert hätte.
p.s.: wie war das noch: bei cdecl muss der aufrufer nachher selber den stack aufräumen, oder? |
Re: [Assemmbler] Aufrufkonvention erkennen
Zitat:
Zitat:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 12:13 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz