Можно ли все программы конвертировать в сборку?

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


person LarryTheCat    schedule 16.02.2011    source источник
comment
Он имеет в виду сломать exe, чтобы изменить значение, а затем восстановить его.   -  person Jakob Bowyer    schedule 16.02.2011


Ответы (5)


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

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

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

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

person maranas    schedule 16.02.2011

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

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

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

person Jos van Egmond    schedule 16.02.2011
comment
Я не собираюсь «защищать» свой код. Я поддерживаю движение за свободное программное обеспечение, поэтому все равно предоставлю свой исходный код :) - person LarryTheCat; 16.02.2011
comment
Ларри, я тоже поддерживаю движение за свободное программное обеспечение, но деньги должны откуда-то поступать. ;) Я бы не возражал, если бы у вас была проблема, подобная этой. - person Jos van Egmond; 16.02.2011

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

person awm    schedule 16.02.2011

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

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

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

person Ken Downs    schedule 16.02.2011

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

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

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

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

person old_timer    schedule 16.02.2011