Можно ли все программы преобразовать в сборку? - PullRequest
3 голосов
/ 16 февраля 2011

Скажем, у нас есть exe, это можно легко преобразовать в сборку? Есть ли способ для авторов программного обеспечения, чтобы предотвратить / препятствовать этому?

Ответы [ 5 ]

6 голосов
/ 16 февраля 2011

Нет.Программа может быть запущена вашей системой, только если она может это понять;если он это понимает, он, вероятно, находится в машинном коде, который непосредственно конвертируется в сборку.

Что вы можете сделать, это попытаться использовать методы обфускации кода, чтобы сделать разобранный двоичный файл таким же трудным для понимания, каквозможно.

http://en.wikibooks.org/wiki/X86_Disassembly/Code_Obfuscation

Редактировать: Хотелось бы добавить, что, конечно, со временем и достаточными ресурсами, кто-то в конечном итоге выяснит, как читать ваш запутанный код.Это неизбежно.Что делает запутывание, так это делает реверс-инжиниринг вашей работы настолько неудобным, насколько это возможно, делает его не стоящим своего времени на его выполнение, поэтому делать это могут только те, кто хочет реверс-инжиниринг.

4 голосов
/ 16 февраля 2011

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

Возможно, вы столкнулись с такой ситуацией: проприетарная программа, написанная на C / C ++, распространяется среди клиентов.Некоторые клиенты имеют менее чем честные намерения, они декомпилируют программу для сборки, изменяют некоторые инструкции (например, те, которые предотвращают злонамеренное использование программы, неограниченное расширение функции пробного использования программ), а затем перекомпилируют программу.

В этом случае, или аналогично, вы должны понимать, что все программы, когда они не выполняются, являются просто данными на диске.Любой может прочитать эти данные и изменить их по своему вкусу.Если это действительно проблема, вам придется придумать другой способ защиты вашей программы: например, делегировать важную логику веб-службе, которая ее выполняет и отсылает результаты.Пример этого: алгоритм поиска Googles, который работает на их собственных веб-серверах - никто точно не знает, как он работает.

2 голосов
/ 16 февраля 2011

Если под "преобразованным" вы подразумеваете скомпилированный, и под этим вы подразумеваете скомпилированный в машинный код, да, абсолютно. Каждый бит кода, который выполняется на любом устройстве, работает как машинный код. Для любого конкретного языка ответ варьируется в зависимости от того, существуют ли инструменты для создания отдельного исполняемого файла, для которого не требуются библиотеки времени выполнения языка.

Если под "преобразованным" вы имеете в виду ручное кодирование его в сборке, см. Другие ответы. Мы этого не делаем, потому что на написание кода уходит очень много времени.

Что касается запутывания, преобразование / компиляция, о которой я упоминаю в первом абзаце, на самом деле не работает для этого. Когда вы «компилируете» что-то вроде Java или C #, источник преобразуется во множество указателей в библиотеки времени выполнения. Эти указатели могут быть легко изменены, а исходный код сгенерирован заново.

2 голосов
/ 16 февраля 2011

Одним словом, нет. Точно так же, как вы не можете помешать кому-то читать и анализировать книгу, которую вы ему даете.

1 голос
/ 16 февраля 2011

Я думаю, что у maranas есть лучший ответ на этот вопрос, но добавил бы, что я думаю, что вы можете разобрать программу с некоторыми условиями.Сначала подумайте об этом следующим образом: если он на самом деле исполняемый, то есть смысл может быть выполнен процессором, то вы абсолютно точно можете анализировать этот двоичный файл точно так же, как процессор, а это означает, что вы можете анализировать каждый бит и байт и поворачивать его.в удобочитаемую форму ascii / ассемблер.Это всегда возможно, если программа может быть выполнена.

Теперь, есть вещи, которые могут помешать этому, если все, что у вас есть, это файл .exe, конечно, многие вещи и мараны ответят на некоторые из них, например, шифрование, и если ключи кчто шифрование выполняется аппаратно, пароль пользователя или что-то, что не включено в файл .exe, тогда вы, возможно, не сможете это выяснить, и игра окончена.

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

Суть в том, что если ваша программа может быть выполнена процессором, то да, безусловно, вы можете преобразовать машинный код обратно в читаемую человеком форму ассемблера.И да, есть вещи, которые вы можете сделать, в частности, используя аппаратные функции, которые являются секретными или не очевидными для дизассемблера, смотрящего только на исполняемый файл, которые могут и будут предотвращать дизассемблирование.Как и в случае любой меры безопасности, если у пользователя есть физический доступ к тому, что он, вероятно, может победить, если у него есть возможность запустить программу на оборудовании, он, вероятно, сможет победить вашу меру безопасности и разобрать ее.

...