Скомпиленный ехе можно превратить в ассемблерный код, т.к. операция на асме практически точно соответствует определённым байтам в скомпиленном ехе.
Собственно, история-то какая (могу в деталях ошибаться, поправьте, если что):
Сначала все проги писали в бинарном коде.
Затем людям это надоело, и они придумали ассемблер: то же самое, только словами, более-менее понятными для человека.
Например было 0101010101101011 (взял число от балды), а я назвал это mul. Последнее человеку понятней. Так что прогер пишет mul, а ассемблер (прога-сборщик) из них совершенно однозначно делает машинный код (то есть из mul получается 0101010101101011 и только).
А так как он делает это однозначно, то возможен и обратный процесс.
Потом придумались языки высокого уровня типа Си, Бейзика, Алгола, Паскаля и т.д.
А уже там то, какой получится машинный код, зависит от компилятора, т.к. возможны варианты. Появились переменные, которым юзер может назначить свои имена, классы и т.д. Все эти подробности теряются при компиляции.
Так что асм-код из ехе получить можно, а код на си - уже нет.
Недавний пример:
Давеча крякал себе плугинчик к Максу (кряка нигде не нашёл)
Нахожу кнопку регистрации. Появляетсо окно со строкой, куда надо писать ключик. Жму ок - появляется простой месседжбокс "Regisrtation code is invalid!" (ну естессно)
Ну чего, ковыряю плугин.
Оказался он обычным бинарником, т.е. тупо dll-кой, переименованной в dlu.
Короче, дизассемблировался без проблем.
Нашёл строчку "Regisrtation code is invalid!"
Немного выше на это место ссылается jnz (условный переход)
В случае если он не происходит то код идёт дальше, среди кучи непонятных регистров видна ссылка на строку "Registration successfull!"
Нахожу в гекс-редакторе это место с jnz и вставляю туда аналогичный по размеру, но ничего не дающий в д. случае оператор (2 байта)
Схороняю, загружаю макс, пытаюсь регистрироваться.
Оставляю поле пустым, давлю на ОК.
Success!
К сожалению при следующем старте макса плуг опять не зареган и надо снова "регать", видимо, при старте есть ещё проверка ключа, которую я не выключил. Впрочем, дальше искать было лениво, работает и ладно.
Вот так всё и ломается.
Только, думаю, в защищённых игровых проектах тупо поиском по строчке не найдёшь ничего.
Там нужно хорошо знать ассемблер и иметь хорошие мозги

Ведь ассемблерный код - это не исходник на си, и его очень трудно понять, особенно когда нет явных зацепок, он большой и генерировался не человеком.