Это делается с помощью реверс инженеринга, когда по тому, что блок (черный ящик) получает на вход и что дает на выход, предполагают его внутреннюю структуру. Одной из самых частых и распространенных уязвимостей (раньше по крайней мере) была переполнение буфера. Эта уязвимость позволяла выполнить произвольный код от лица приложения, словно этот код был написан разработчиками.
Обычно приложения, типо игр и программ на комп, взламывают через дизасемблирование. Т.е. получают набор машинных команд, которые выполняет программа. Огромный листинг асемблерного кода изучается и модифицируется.
Отдельно можно говорить про взлом сайтов, но не уверен, что это входит в вопрос))
Владимир Ильич, вы ли это?