Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Как обмануть хакера-крякера? [D4, D5, D6, Win95/98, WinME, NT4, Win2k, WinXP]


Страницы:   1 2

Rooman ©   (2002-03-22 19:39:00) 

У меня такой вопрос. Я делаю защиту shareware программы. Допустим, до регистрации в программе действуют некоторые ограничения, которые снимаются после регистрации программы законным путем. Допустим, я привязываю программу к конкретной машине и пользователю. Например, в качестве привязки используется имя пользователя, его ИНН, данные БИОС и винчестера.
Пользователь, оплатив программу, получает индивидуальный пароль, назвав который по телефону и сообщив ключевой идентификационный номер по телефону же получает ответный код.
Моя задача: реализовать функцию проверки правильности регистрационного кода так, чтобы хакер-крякер с большим трудом смог отыскать это место в программе. Как это лучше сделать? Есть идея - создавать отдельный поток в момент срабатывания таймера (компонента TTimer). Как лучше всего это реализовать? Подскажите, пожалуйста...


Anatoly Podgoretsky   (2002-03-23 09:33:00) [21]

Если тебе нужна ействительно более менее надежная защита, то купи AsProtect и апгейдь его по мере взлома, последнии версии пока держутся.


Anatoly Podgoretsky   (2002-03-23 09:32:00) [22]

Rooman © (23.03.02 07:11)
Почему без основания, основание что есть программа на компьютере и она работает. Дальше дело времени, что бы она работала на другом компьютере.
Другое дело если программы или части модулей нет, они подгружаются из внешнего источника динамически при каждом запуске стартового модуля и могут быть каждый раз разные, то есть посторное использование не возможно. Но у тебя не этот случай.


Rooman   (2002-03-23 07:37:00) [23]

Ладно, сформулирую вопрос по другому: как лучше всего спрятать непосредственный вызов конкретной функции?
Т.е. в общем случае функция проверки вызывается из другого места программы так: "CALL proc;", при этом proc имеет статическое значение, прописываемое в скомпилированном exe-модуле. Когда хакер ломает программу - он находит такой вызов, ставит брейкпоинт в начало функции proc (напр., BPX proc в SoftICE), дожидается ее вызова, исследует ее работу и видоизменяет ее так, чтобы факт незарегистрированности программы был инвертирован (о как сказал!).
Задача: сделать вызов функции динамическим. Т.е. таким, чтобы момент ее вызова не был обнаружен простыми методами, например, трасировкой.
Есть предположение, что можно вызов делать:
1. по приходу некоторого сообщения Windows
2. в обработчике хука (WindowsHook)
3. в отдельном потоке

Все эти мысли надо превратить в код. Что посоветуете?


Rooman   (2002-03-23 07:23:00) [24]

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


Rooman   (2002-03-23 07:11:00) [25]

"Все равно сломают" - как часто я слышу эту фразу без всякого обоснования.

SDS - по поводу CRC - убивается так же, как и код проверки правильности ключа. Т.е. в самом начале этой функции прописывается либо просто ret, либо последовательность mov переменная,число; ret; Это не вопрос! Таких функций можно сделать много - но не бесконечное множество!
А я хочу сделать упор на то, что функция проверки должна создаваться бесконечно много раз, причем динамически. А так же все глобальные переменные, содержащие ключ и флаг его корректности, тоже должны перемещаться по памяти бесконечно много раз.
Вот такой геморой хочу сделать! Как?


kull   (2002-03-23 01:19:00) [26]

Есть неплохой вариант:
Защитить прогу с помощью ASProtect,
там есть разные способы и Trial и registration key и привязка к HardwareID......
http://www.aspack.com/


SDS   (2002-03-22 22:33:00) [27]

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


Rooman   (2002-03-22 20:53:00) [28]

SDS - дело в том, что нельзя сделать генератор ключей, но можно просто отключить (обойти) проверку кода! Вопрос об RSA не стоит - это само собой разумеется. У меня вопрос немного другой - как запрятать функцию проверки кода так, чтобы ее было бы трудно найти.

По поводу взлома Delphi - программ. VCL ломается элементарно, т.к. IDA начиная с 3.8 поддерживает сигнатуры VCL и многих других библиотек. Дизассемблим в IDA, видим, что это Дельфи, а значит есть методы, типа TTimer.OnTimer (внутри которого вызывается определенное на этапе разработки OnTimer событие). Можно записать его адрес на бумажку и поставить в SoftICE BPX на этот адрес. Тем самым мы легко отследим все события ВСЕХ (!!!) компонентов, унаследованных от TTimer.


SDS   (2002-03-22 20:27:00) [29]

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


Rooman   (2002-03-22 19:57:00) [30]

BlackJack - в том то и суть, что надо и код, и строчку создавать динамически, чтобы нельзя было подменить. Вот и давайте обсуждать, как это можно сделать?


Rooman   (2002-03-22 19:54:00) [31]

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


BlackJack   (2002-03-22 19:52:00) [32]

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


Rooman   (2002-03-22 19:49:00) [33]

Просто в обработчике OnTimer - мне кажется слишком простым для взлома, т.к. в принципе можно отследить этот метод в VCL (например брейкпоинтом на TTimer.OnTimer). Надо это дело как-то усложнить.


drpass   (2002-03-22 19:43:00) [34]

Нормальная идея. Можно даже без всяких потоков, просто в обработчике OnTimer. Вообще, разхакерить Delphi-программу очень сложно, код VCL настолько наворочен, что пропадет всякое желание его распутывать дизассемблером. А что за прога у тебя такая, и почем стоит?


Rooman   (2002-03-22 19:43:00) [35]

Комментарий: регистрационный номер я предполагаю считывать из общедоступного места, например, реестра. Но! данную строчку я планирую динамически перемещать в памяти по таймеру так, чтобы отследить момент считывания этой строчки было очень и очень проблемматично. Как это сделать?


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо