информационная безопасность
без паники и всерьез
 подробно о проектеRambler's Top100
Атака на InternetПортрет посетителяСетевые кракеры и правда о деле Левина
BugTraq.Ru
Русский BugTraq
 Анализ криптографических сетевых... 
 Модель надежности двухузлового... 
 Специальные марковские модели надежности... 
 Три миллиона электронных замков... 
 Doom на газонокосилках 
 Умер Никлаус Вирт 
главная обзор RSN блог библиотека закон бред форум dnet о проекте
bugtraq.ru / форум / hacking
Имя Пароль
ФОРУМ
все доски
FAQ
IRC
новые сообщения
site updates
guestbook
beginners
sysadmin
programming
operating systems
theory
web building
software
hardware
networking
law
hacking
gadgets
job
dnet
humor
miscellaneous
scrap
регистрация





Легенда:
  новое сообщение
  закрытая нитка
  новое сообщение
  в закрытой нитке
  старое сообщение
  • Напоминаю, что масса вопросов по функционированию форума снимается после прочтения его описания.
  • Новичкам также крайне полезно ознакомиться с данным документом.
Защита ключа для средств защиты ПО : новое слово? 12.12.03 13:39  Число просмотров: 5408
Автор: ToJ|cTuK Статус: Незарегистрированный пользователь
<"чистая" ссылка>
Предлагаются на суд общественности следующие рассуждения под заголовком:

Защита ключа для средств защиты ПО на основе динамической неопределенности его местоположения в памяти компьютера с использованием объектов ядра.

Данный текст предлагает использовать объекты ядра для реализации ключевой части любой защиты – а именно, для проверки ключа и соответствующего ветвления программы.

Ввод ключа, раскрывающего защиту программы, обычно должен сопровождаться проверкой этого ключа на корректность, и не секрет, что именно это местоположение ключа кракер ищет в первую очередь для поиска хэш-функции. В связи с этим, возникла идея усложнения задачи вычисления местоположения введенного ключа, а так же директив вызова проверки этого ключа в памяти. Решение этой задачи должно соответствовать следующим требованиям: 1) обращение к этим данным не должно быть одновременным ко всем байтам ключа, 2) местоположение ключа должно быть случайным в каждый минимальный момент времени, 3) переменная со ссылкой на текущее местоположение ключа должна быть не равна адресу, а должна быть хэш-функцией адреса, 4) переменная со ссылкой должна быть не единственна, а должна быть динамическим массивом, 5) вычисление адреса ключа выполняется через случайный выбор из массива с хэш-функциями адреса, 6) изменение местоположения ключа и ссылок должно быть неуловимым.

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

Итого, алгоритм ветвления программы в зависимости от ключа выглядит следующим образом:
1) Вводится ключ
2) Создается 1000 нитей с клонированными по памяти обработчиками, выполняющими постоянное перемещение ключа в памяти и обновление ссылок с использованием критической секции
3) Чтение ключа и проверка на пригодность в нескольких местах программы осуществляется так: создается 1000 нитей с клонированными по памяти обработчиками, выполняющими постоянное чтение ключа и случайную проверку с использованием той же критической секции (выбирается верность/неверность с некоторой вероятностью, например, 5/95%, вместо 0/100%). Признак верности возвращается в основной поток через объекты ядра, например – семафор. Для этого, если использовать семафор, основной поток, который проверяет ключ, должен создать два потока с равными приоритетами, каждый из которых приостанавливается и ждет своего семафора. Потом создается 1000 вышеуказанных нитей. Проверка в 1000 нитях должна «зажечь» несколько «глаз» того или иного семафора. Первым откроется тот семафор, вероятность «зажигания» которого будет выше в зависимости от верности/неверности ключа, и та ветка программы и сработает в первую очередь.

Основной принцип – неопределенность во времени момента чтения и неопределенность успешности проверки делает вскрытие и нахождение основных участков кода, из которых производится ветвление программы, невозможным, либо очень сложным, т.к. отладка многопоточных систем на базе ядра Win32 непостижима человеческим разумом ((С) Рихтер).

Как следствие данных рассуждений, можно придумать способ, как использовать объекты ядра (крит. секции и семафоры) для реализации условных переходов, являющихся критичными для взлома логики работы программы.
<hacking> Поиск 






Rambler's Top100
Рейтинг@Mail.ru


  Copyright © 2001-2024 Dmitry Leonov   Page build time: 0 s   Design: Vadim Derkach