Otázka:
Jakou konvenci volání použít pro EAX / EDX v IDA
Devolus
2013-10-27 14:31:08 UTC
view on stackexchange narkive permalink

Mám nějaký kód (předpokládám Delphi), který pro předávání argumentů používá pouze registr EAX a EDX (a samozřejmě zásobník, pokud je zapotřebí více). Podíval jsem se, které konvence volání by odpovídaly, ale nenašel jsem ten, který používá pouze EAX a EDX. AFAIK Borland fastcall / register používá EAX a EDX, ale také ECX, což zde není tento případ.

Mohu IDA nějak říct o této konvenci volání? Jak bych to udělal?

Můžete vložit nějaký kód, který používá EAX, EDX a stack * bez * ECX?
Po podrobnějším pohledu se zdá, že ECX se skutečně používá a že kód obvykle nepotřebuje více než dva argumenty. Když jsem se podíval na funkce s více argumenty, uvědomil jsem si, že to byl standard s EAX / EDX / ECX / PUSH ...
Dobře, takže záhada byla vyřešena.
Tři odpovědi:
Ange
2013-10-27 15:11:54 UTC
view on stackexchange narkive permalink

typ funkce můžete přidat úpravou (klíč Y) a přidáním názvu.

Napsal jsem stránku, která mi připomene konvence volání na úrovni ASM.

Úvod

původní hovor je myfunc(0,1,2,3,4).

  • standardní objednávka is first argument is push last.
  • standardní úprava zásobníku je ' vyčištění volaného ' - po návratu by zásobník měl být bez svých volacích argumentů.

Poznámka : zásobník vypadá svisle jako objednávka volání.

stdcall (pouze zásobník)

  push 4push 3push 2push 1push 0call myfuncxor eax, eaxretn 10  

Fastcall (ecx, edx)

Toto je ve skutečnosti rychlé volání společnosti Microsoft.

  push 4push 3push 2mov edx, 1xor ecx, ecxcall myfuncxor eax, eaxretn 10  

CDECL & syscall (vyčištění volajícího)

  push 4push 3push 2push 1push 0call myfuncadd esp, 014xor eax, eaxretn 10  

Pascal (obrácené pořadí, ebx uloženo, i když ebx není použit ...)

  push ebxpush 0push 1push 2push 3push 4call myfuncxor eax, eaxpop ebxretn 10  

Fortran / watcall (eax, edx, ebx, ecx, pak stack - ebx je uložen)

Zřejmě to není tak jasné, jaká je konvence volání Fortran, a tato se dokonce liší od Raymondova příspěvku The __fo konvence volání rtran není konvence volání používaná FORTRANEM.

  push ebxpush 4mov ecx, 3mov ebx, 2mov edx, 1xor eax, eaxcall myfuncxor eax, eaxpop ebxretn 10  

Delphi 'registruje' konvenci volání (výchozí)

Používá eax , ecx , edx kód> jako první 3 argumenty. Další argumenty jsou do zásobníku vloženy v opačném pořadí.

  push 3push 4mov ecx, 2mov edx, 1xor eax, eaxcall myfuncxor eax, eaxretn 10  
Řádek „retn 10“ na konci každého příkladu je červeným sleděm a pravděpodobně se zamění. Jeho hodnota nemá nic společného s voláním příkladů `myfunc`.
Peter Andersson
2013-10-27 18:33:42 UTC
view on stackexchange narkive permalink

Pokud narazíte na konvenci volání, na kterou se nevztahuje žádná standardní konvence volání, můžete použít __usercall nebo __userpurge konvenci volání, která vám umožní určit, které argumenty jsou kam předávány. Syntaxe je

 return_type __usercall function_name<  registry  > (arg0_type arg0<  registry  >, arg1_type arg1<  registry  ... > ) 

Kde registry může být seskupení registrů oddělené znakem „:“, pokud argument zabírá více než jeden registr.

Pokud jste na opravdu hovno konvenci volání moudře můžete použít úplnou syntaxi, jak je popsáno zde. Místo toho, že jednoduše zadáte název registru obsahující argument, můžete popsat předávání argumentů v částech registrů nebo prvků zásobníku. Syntaxe je výše uvedená pouze u registrů nahrazených

 <argoff: register ^ regoff.size> 

nebo pokud je argument předán do zásobníku

 <argoff: ^ stkoff.size> 
Igor Skochinsky
2013-10-28 16:18:31 UTC
view on stackexchange narkive permalink

Delphi a Borland C ++ Builder používají EAX , EDX a ECX pro první tři argumenty v jejich variantě __ fastcall konvence volání. Pokud tedy v Options-Compiler zvolíte „Delphi“ nebo „C ++ Builder“, můžete v prototypu funkce použít pouze __fastcall - není třeba se uchýlit k __usercall .

Původní plakát uvedl, že konvence volání používá pouze EAX a EDX, nikoli ECX. Zní mi to divně.


Tyto otázky a odpovědi byly automaticky přeloženy z anglického jazyka.Původní obsah je k dispozici na webu stackexchange, za který děkujeme za licenci cc by-sa 3.0, pod kterou je distribuován.
Loading...