2016-12-07 5 views
1

Я хотел бы использовать (путем настройки стека) функцию __stdcall. Например, абонент думает, имеет указатель на функцию обратного вызова со следующим прототипом:Thunking Функция __stdcall с настройкой стека

int Func(int a); 

Я хотел бы написать (преобразователь, который будет передан в качестве обратного вызова), которые регулируют вызов следующей функции прототип:

int Func(char* ptr, int a); 

Я знаю, что, когда мой преобразователь будет называться, что расположение стека:

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

Я хотел бы настроить пристало:

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

, а затем сделать относительный скачок к соответствующей функции (таким образом, когда вызываемая функция возврата стек является сбалансированным)

Вот мой окончательный преобразователь, который работает (конечно, он должен быть упакован и динамически загружается к исполняемой памяти), Kudo to Jester за помощь с шестнадцатеричным кодом сборки для необходимых инструкций!

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; 
    } 
} 

ответ

3

Поскольку вы описали структуру стека, не знаете, с чем вы столкнулись. Во всяком случае, если вы хотите использовать JMP код может выглядеть следующим образом:

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 

Обратите внимание, что это изменит выравнивание стека, так что если вы находитесь в среде, где это имеет значение, вам придется настроить код. Несколько более цивилизованная версия может быть:

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

Вопрос кажется интересным, но я не понимаю, что задают. Поскольку вы как-то определили это, вы можете отредактировать вопрос. – anatolyg

+0

@anatolyg не уверен, что нужно прояснить? Он сказал, что хочет создать функцию thunk, которая может быть передана как обратный вызов с прототипом 'int Func (int a);' и который затем должен вызвать другую функцию 'int Func (char * ptr, int a);' Для этого вам необходимо изменить структуру стека в соответствии с представленными диаграммами. Он в основном хочет создать 'int thunk (int a) {return proc (ptr, a); } ' – Jester

+0

Итак, вопрос был« что не так с моим кодом », и ответ« выравнивание », правильно? – anatolyg

 Смежные вопросы

  • Нет связанных вопросов^_^