2010-11-04 57 views
2

Connaissez-vous quelque chose sur l'accrochage __usercall type de fonctions? J'ai accroché avec succès __thiscall, __stdcall et __cdecl appels mais cela me suffit.Comment hooker __usercall, __userpurge (__spoils) fonctions?

Connaissez-vous une bibliothèque d'accrochage pour __usercall ou comment raccorder ce type de fonctions en utilisant la traduction à __stdcall ou __cdecl?

Fonction ce que je dois accrocher au premier est:

int __usercall func<eax>(int a<eax>, int b<ecx>, int c, unsigned int d, signed int e); 

Répondre

4

Utilisez un emballage qui convertira à __stdcall.

int __stdcall func_hook_payload(int a, int b, int c, unsigned int d, signed int e); 

// Wrapper for 
// int __usercall func<eax>(int a<eax>, int b<ecx>, int c, unsigned int d, signed int e); 
__declspec(naked) void func_hook() 
{__asm{ 
    push ebp 
    mov ebp, esp 
    push dword ptr[ebp + 0x0C] // or just push e 
    push dword ptr[ebp + 0x08] // d 
    push dword ptr[ebp + 0x04] // c 
    push ecx // b 
    push eax // a 
    call func_hook_payload 
    leave 
    ret // note: __usercall is cdecl-like 
}} 
+0

vous êtes sûr de travailler cela? Vous ne devriez pas 'pop 'arguments de détourné fonction callee? – Svisstack

+0

@Svisstack: oui, j'en suis sûr. Essayez-le. – Abyx

+0

J'essaie, mais peut-être que quelque chose ne va pas dans mon deuxième wrapper __stdcall à __usercall, débogueur dit violation d'accès après l'appel de la fonction usercall (parce que je dois avoir le résultat) hmm probablement je fais quelque chose de mal avec les arguments. – Svisstack

2

Lorsque tout le reste échoue, parcourez-le avec un débogueur.

En particulier, prendre note de ces comme l'ESP lorsque vous entrez dans l'appel, puis à nouveau juste avant la fonction retourne ..