Как я могу создать простой код C ++, который прекрасно работает без предотвращения выполнения данных (DEP), но будет работать sh при включенном DEP? - PullRequest
0 голосов
/ 04 мая 2020

Хотя я понимаю, что код, не помеченный как «исполняемый», вызовет DEP cra sh, я пытаюсь понять, какой тип распространенных методов кодирования (в устаревших Windows приложениях) приведет к этому типу cra sh.

1 Ответ

4 голосов
/ 04 мая 2020

Примерно так:


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 решения.
...