Самостоятельная проверка двоичных файлов? - PullRequest
8 голосов
/ 19 сентября 2008

Мой вопрос довольно прост: вы исполняемый файл, который выводит «Доступ разрешен» или «Доступ запрещен», а злые люди пытаются понять ваш алгоритм или исправить ваши внутренности, чтобы вы все время говорили «Доступ предоставлен» ,

После этого вступления вам может быть очень интересно, что я делаю. Он собирается взломать Diablo3, когда он выйдет? Я могу успокоить ваши заботы, я не один из тех взломщиков. Моя цель - cramesmes.

Crackmes можно найти, например, на www.crackmes.de. Crackme - это небольшой исполняемый файл, который (в большинстве случаев) содержит небольшой алгоритм проверки серийного номера и выводит «Доступ разрешен» или «Доступ запрещен» в зависимости от серийного номера. Цель состоит в том, чтобы сделать этот исполняемый вывод "Доступ предоставлен" все время. Методы, которые вам разрешено использовать, могут быть ограничены автором - не устанавливать патчи, не разбирать - или включать в себя все, что вы можете сделать с помощью двоичного файла, objdump и шестнадцатеричного редактора. Взломать crames - это одна из забавных вещей, но, как программисту, мне интересно, как вы можете создавать сложные crames.

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

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

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

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

Мои мысли в настоящее время состоят из:

  • проверка явных местоположений в двоичном файле для прыжков.
  • контрольные суммы частей двоичного файла и сравнение контрольных сумм, вычисленных во время выполнения, с этими.
  • имеет положительные и отрицательные проверки времени выполнения для ваших функций в коде. С побочными эффектами при серийной проверке. :)

Можете ли вы придумать, как еще больше раздражать возможного злоумышленника? (конечно, вы не можете держать его подальше навсегда, когда-нибудь, все проверки будут нарушены, если вам не удалось сломать генератор контрольной суммы, если вы смогли встроить правильную контрольную сумму для программы в саму программу, хе-хе)

Ответы [ 6 ]

6 голосов
/ 19 сентября 2008

Вы попадаете в "Антиреверсивные методы". И это искусство в основном. Хуже того, что даже если вы топчете новичков, для olly и IDA Pro есть «анти-антиреверсивные плагины», которые они могут загрузить и обойти большую часть ваших контрмер.

Меры противодействия включают обнаружение отладчика с помощью API-интерфейсов отладчика или обнаружение «одного шага». Вы можете вставить код, который после обнаружения взлома отладчика продолжает функционировать, но начинает работать в случайное время намного позже в программе. Это действительно игра в кошки-мышки, и взломщики имеют значительное преимущество.

Проверить ... http://www.openrce.org/reference_library/anti_reversing - Часть того, что там есть.

http://www.amazon.com/Reversing-Secrets-Engineering-Eldad-Eilam/dp/0764574817/ - В этой книге есть действительно хорошая антиреверсивная информация и пошаговые инструкции по технике. Отличное место, чтобы начать, если вы получаете INT вспять в целом.

2 голосов
/ 19 сентября 2008

Я считаю, что эти вещи обычно доставляют больше хлопот, чем стоят.

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

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

1 голос
/ 19 сентября 2008

Одним из самых надежных решений этой проблемы является Trusted Computing . По сути, вы должны зашифровать приложение и передать ключ дешифрования на специальный чип ( Trusted Platform Module ). Чип расшифрует приложение только после того, как проверит, что компьютер находится в «доверенном» состоянии: нет средств просмотра / редактирования памяти, нет отладчиков и т. д. По сути, вам понадобится специальное оборудование, чтобы просто иметь возможность просматривать расшифрованный программный код.

1 голос
/ 19 сентября 2008

Есть технология TPM: т / мин в Википедии

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

Примечание : TPM имеет плохой рэп, потому что его можно использовать для DRM. Но для специалистов в этой области это несправедливо, и даже существует группа open-TPM , позволяющая пользователям Linux точно контролировать, как используется их чип TPM.

0 голосов
/ 20 мая 2009

Отличная статья о защите от копирования и защите Хранение пиратов в страхе: Реализация защиты от трещин для Spyro: Год Дракона

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

0 голосов
/ 20 мая 2009

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

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

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

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

Как будет выглядеть достаточно сложная программная платформа? Например, возможно, после каждых 6 операций сложения, седьмое сложение возвращает результат, умноженный на PI, деленный на квадратный корень из логарифма модуля 5 разности общего количества операций вычитания и умножения, выполненных с момента инициализации системы. Платформа должна будет отслеживать эти числа независимо друг от друга, как и сам код, чтобы декодировать правильные результаты. Таким образом, ваш код будет написан на основе знания сложного поведения платформы, которую вы спроектировали. Да, это потребляло бы циклы процессора, но кто-то должен был бы перепроектировать это небольшое неожиданное поведение и перестроить его в любой новый код, чтобы он вел себя правильно. Кроме того, ваш собственный код будет сложно изменить после его написания, поскольку он может привести к неснижаемой сложности, причем каждая строка зависит от всего, что произошло раньше. Конечно, в достаточно защищенной платформе будет намного больше сложностей, но дело в том, что кто-то должен будет провести обратный инжиниринг вашей платформы, прежде чем он сможет провести обратный инжиниринг и модифицировать ваш код без ослабления побочных эффектов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...