Наткнулся на довольно странную реализацию, как такое может быть?
Есть конструктор
Очень хорошо видно что соглашение о вызове указано __cdecl.
Но если посмотреть на дизассемблированный код, видно что это __fastcall.
Вопрос почему это не приводит к ошибке, компилированная DLL, хорошо работает.
Подмена происходит вот так:
Есть конструктор
PHP:
CUserSocket* __cdecl CUserSocket::UserSocketConstructor(CUserSocket* pUserSocket, SOCKET _s)
{
typedef CUserSocket* (__cdecl *t)(CUserSocket*, SOCKET);
t f = (t)0x0093CADC;
CUserSocket* pReturn = f(pUserSocket, _s);
return pReturn;
}
Очень хорошо видно что соглашение о вызове указано __cdecl.
Но если посмотреть на дизассемблированный код, видно что это __fastcall.
Код:
.text:000000000093CED6 mov rdx, rbx
.text:000000000093CED9 mov rcx, rax
.text:000000000093CEDC call sub_93CADC
Вопрос почему это не приводит к ошибке, компилированная DLL, хорошо работает.
Подмена происходит вот так:
PHP:
WriteInstruction(0x93CEDC, (UINT32)CUserSocket::UserSocketConstructor, 0xE8);