Почему не срабатывает шеллкод?
при компиляции флаг из реестра не удаляется. В чем может быть проблема?
В том, что ты засунул бинарный код в параметр функции, в котором должна быть строка с именем программы для запуска и её параметрами. Непонятно, почему ты ожидаешь, что WinExec бросится выполнять машинный код в этой строке. WinExec имеет код возврата, который недвусмысленно тебе сказал бы в чём ошибка (путь или файл для запуска не найдены), если бы ты его проверил.
И, кстати, байт с кодом 0 по смещению 0x246 -- это тоже часть шелл-кода, терминатор командной строки.Байты из зеленой области, как я понял, это информация линкера golink. Так ли это?
Это заголовок файла формата PE. Да, его туда записал линкер. Нет, это не информация линкера, это информация в основном для загрузчика ОС, а так же для дизассемблера и прочих binutils.
Машинный код по адресу shell можно вызвать как функцию как-то так (может быть, без звёздочки)typedef void functype(void);

((functype *)shell)();
или короче, но не уверен, что проще для понимания(void *(void))shell)();
только надо в нём предусмотреть возврат (ret) обратно в место вызова.