Я думаю, что у maranas есть лучший ответ на этот вопрос, но добавил бы, что я думаю, что вы можете разобрать программу с некоторыми условиями.Сначала подумайте об этом следующим образом: если он на самом деле исполняемый, то есть смысл может быть выполнен процессором, то вы абсолютно точно можете анализировать этот двоичный файл точно так же, как процессор, а это означает, что вы можете анализировать каждый бит и байт и поворачивать его.в удобочитаемую форму ascii / ассемблер.Это всегда возможно, если программа может быть выполнена.
Теперь, есть вещи, которые могут помешать этому, если все, что у вас есть, это файл .exe, конечно, многие вещи и мараны ответят на некоторые из них, например, шифрование, и если ключи кчто шифрование выполняется аппаратно, пароль пользователя или что-то, что не включено в файл .exe, тогда вы, возможно, не сможете это выяснить, и игра окончена.
За годы написания дизассемблеров я видел разные уловки, иногда умышленные, иногда нет.Например, если вы читаете «Дзен сборки» Майкла Абраша, я, кажется, полагаю, что в 8088/86 году обсуждалась программа предварительной выборки, которая была способом отличить один процессор от другого (помните, что это было до кэшей), но такжепобедить хакеров.Например, вы можете сделать так, чтобы одна инструкция изменила следующую инструкцию, увеличив ее, скажем так.Это было бы прекрасно выполнено, потому что эта вторая инструкция уже была извлечена и находилась в канале, поэтому измененная команда была только в памяти, и неизмененная команда будет выполнена.Естественно, это должен быть код, который запускался только один раз, когда эта инструкция изменялась в ram.В частности, это не позволяло людям пошагово пройти по коду с помощью отладчика, потому что отладчик мог выполнить измененную инструкцию и аварийно завершить работу или сделать что-то подобное.И если бы ваш дизассемблер попытался смоделировать программу и не учел то, как аппаратное обеспечение работает снова, вы были бы унесены в сорняки.Я также видел использование, скажем, загрузки регистра с немедленным нулем, за которым следует ветвь, если ноль, что совпадает с безусловной ветвью (при условии, что регистр действительно не должен быть нулевым), за этим следуют некоторые данные, которые будутвызвать дизассемблер, чтобы споткнуться.Вы должны быть на набор инструкций переменной длины слова, чтобы это работало.Человеку не сложно понять, что произошло, и вручную отрегулировать процесс разборки, чтобы избежать слова данных, которое не является инструкцией, но более сложным для автоматизированного инструмента (который не является симулятором).Список трюков можно продолжать и продолжать ...
Суть в том, что если ваша программа может быть выполнена процессором, то да, безусловно, вы можете преобразовать машинный код обратно в читаемую человеком форму ассемблера.И да, есть вещи, которые вы можете сделать, в частности, используя аппаратные функции, которые являются секретными или не очевидными для дизассемблера, смотрящего только на исполняемый файл, которые могут и будут предотвращать дизассемблирование.Как и в случае любой меры безопасности, если у пользователя есть физический доступ к тому, что он, вероятно, может победить, если у него есть возможность запустить программу на оборудовании, он, вероятно, сможет победить вашу меру безопасности и разобрать ее.