Примерно так:
int main()
{
char* s = (char*)malloc(1);
s[0] = '\xC3';
void (*p)() = (void (*)())(s);
p();
}
ATL сделал это, чтобы выделить thunk для WndProc
. Целью таких WndPro c thunks является встраивание параметра контекста и использование метода для WndProc
вместо функции, не принимающей дополнительный параметр контекста.
Исправление достаточно простое и не обязательно включает удаление динамического c выделения кода:
- Один из способов, как @Remy указал, выделяет с помощью
VirtualAlloc
и управляет правами с помощью VirtualProtect
, чтобы убедиться в наличии права на выполнение. - более простой способ - создать кучу с
HeapCreate
и передать HEAP_CREATE_ENABLE_EXECUTE
, распределить код в этой куче - наконец, есть помощник по ATL , с Windows 10, они могут помочь избежать реализации генерации кода в программе или библиотеке. Хотя это будет работать только для таких блоков, как ATL, а не для универсального c решения.