Что значит незащищенность кода на платформе win32?
По простому. Незащищенность означает то что любая программа имеет доступ к "любой" области памяти, даже не своей.  Т.е. сторонняя программа может залезть в память выделенную для другой программы и делать там что хочет. 
Есть еще clr в ней эту проблему какбы решили путем вынесения исполнения кода в "виртуальную машину" и соответсвенно у каждой программы есть свой индивидуальный кусок которой больше никто тронуть не может.
Ответов на этот вопрос очень много) Потому что вопрос сильно обобщенный.
Например можно ответить так: в вин32 дескриптор памяти написан плохо. В вин64 уже лучше.
Но для вин64 нужен 64-битный процессор. Отсюда все и лезет.
Если есть 64-битный процессор, то он имеет "в железе" например nx-бит. И 64-битный дескриптор написан как бы под него, если сильно притягивать заушы. Суммарно получается так, что код и данные разделены. И железо следит за этим. Т.е. нельзя запустить код из данных.
А на 32-битных системах это можно было сделать запросто, через ошибку переполнения. Т.е. вставляете исполняемый код в картинку, картинку в программку, и программкой запускаете код из картинки. Ранее во времена 32-бит на этом строились защиты массово, и ровно так же распространялись эксплойты массово.
В общем смысле 32-битные системы не имеют контроля исполнения кода. 64-битные уже имеют. Но под это дело нужна еще и вменяемая организация памяти. В современных версиях например win-64 это есть. Впрочем оно же есть во всех 64-битных системах насколько я помню. Реализация прикручена уже везде.