2016-12-07 1 views
1

Je voudrais thunk (en ajustant la pile) fonction __stdcall. Par exemple, un appelant pense est a un pointeur vers une fonction de rappel avec le prototype suivant:Thunking __stdcall fonction avec ajustement de la pile

int Func(int a); 

Je voudrais écrire un thunk (qui sera passé comme un rappel) qui ajuste l'appel à la fonction suivante prototype:

int Func(char* ptr, int a); 

Je sais que quand mon thunk sera appelée que la mise en page de la pile est:

------------------ 
|  a  | 
------------------ 
| return address | <-- Top of the stack 
------------------ 

J'aimerais régler le collé à:

------------------ 
|  a  | 
------------------ 
------------------ 
|  ptr  | 
------------------ 
| return address | <-- Top of the stack 
------------------ 

puis faire un saut par rapport à la fonction correspondante (de cette façon lorsque la fonction appelée retour de la pile est équilibrée)

Voici ma dernière thunk qui fonctionne (bien sûr, il doit être emballé et dynamique chargée à la mémoire exécutable), Kudo à Jester pour aider avec le code hexadécimal d'assemblage pour les instructions nécessaires!

struct Thunk 
{ 
    BYTE m_popRet; 
    BYTE m_pushPtr;   
    DWORD m_ptr;   
    BYTE m_pushRet;   
    BYTE m_jmp;   
    DWORD m_relProc;  
    BOOL Init(DWORD_PTR proc, void* ptr) 
    { 
     m_popRet = 0x58;  
     m_pushPtr = 0x68; 
     m_ptr  = PtrToUlong(ptr); 
     m_pushRet = 0x50; 
     m_jmp  = 0xE9; 
     m_relProc = DWORD((INT_PTR)proc - ((INT_PTR)this + sizeof Thunk)); 
     return TRUE; 
    } 
} 

Répondre

3

Puisque vous avez décrit la disposition de la pile, vous ne savez pas avec quoi vous avez un problème. Quoi qu'il en soit, si vous voulez utiliser JMP votre code pourrait ressembler à:

pop eax ; 58    return address 
push ptr ; 68 xx xx xx xx 
push eax ; 50    put return address back 
jmp proc ; E9 xx xx xx xx 

Notez que cela va changer l'alignement de la pile, donc si vous êtes dans un environnement où ce qui compte, vous devez régler le code. Une version un peu plus civilisée pourrait être:

push edx  ; 52    align stack 
push [esp+8] ; FF 74 24 08 "a" 
push ptr  ; 68 xx xx xx xx 
call proc ; E9 xx xx xx xx 
pop edx  ; 5A 
ret 4  ; C2 04 00 
+0

La question semble intéressante, mais je ne comprends pas ce qui est demandé. Puisque vous avez déterminé cela, vous pourriez vouloir éditer la question. – anatolyg

+0

@anatolyg ne sais pas ce qui a besoin d'éclaircir? Il a dit qu'il voulait créer une fonction de thunk qui peut être passée comme un callback avec le prototype 'int Func (int a);' et qui devrait ensuite appeler une autre fonction 'int Func (char * ptr, int a); vous devez changer la disposition de la pile selon les diagrammes OP fournis. Il veut essentiellement créer un int thunk (int a) {return proc (ptr, a); } ' – Jester

+0

SO la question était" quel est le problème avec mon code "et la réponse est" alignement ", non? – anatolyg