Вопрос

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

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

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

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

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

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

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

Мои мысли на данный момент состоят из:

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

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

Это было полезно?

Решение

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

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

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

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

Другие советы

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

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

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

Есть технология TPM: ТПМ в Википедии

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

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

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

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

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

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

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top