Я хотел бы использовать (путем настройки стека) функцию __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;
}
}
Вопрос кажется интересным, но я не понимаю, что задают. Поскольку вы как-то определили это, вы можете отредактировать вопрос. – anatolyg
@anatolyg не уверен, что нужно прояснить? Он сказал, что хочет создать функцию thunk, которая может быть передана как обратный вызов с прототипом 'int Func (int a);' и который затем должен вызвать другую функцию 'int Func (char * ptr, int a);' Для этого вам необходимо изменить структуру стека в соответствии с представленными диаграммами. Он в основном хочет создать 'int thunk (int a) {return proc (ptr, a); } ' – Jester
Итак, вопрос был« что не так с моим кодом », и ответ« выравнивание », правильно? – anatolyg