Корисні поради по криптографії

[ виправити ] текст може містити помилки, будь ласка перевіряйте перш ніж використовувати.

скачати

Захист програм від копіювання.

Олексій! Із задоволенням читаю ваші сторіночки про криптографії і не зміг втриматися щоб не розповісти ще ободним досить ефективний спосіб програм від копіювання. Сам я пишу програми на Fox і використовую цей метод сутність якого наводжу нижче.

Як завжди виглядає запаролених програма? Її крадуть, запускають, і вона гордо так питає: Пароль?! (Їй відповідають: на горщику сидить КОРОЛЬ (joke) або щось в цьому роді Програма говорити: Password невірний, працювати не буду. Звуть хакера. Кажуть, ворога бачиш. Бачу відповідає. Давай, борись. Хакер дістає з кобури дебагер 38 калібру , і справляється з поставленими завданнями.

У мене точно також, тільки програма після відходу хакера починає глючити зі страшною силою. Те відсоток нарахування не той поставить, то директора поставить завгоспом, а секретарці зарплату нарахує вище директорського та т.д. Причому всі зрідка і випадково. Звуть знову хакера, кажуть йому - ти програму погано розкрив. Хакер дивиться ще раз, немає говорить, все нормально. А вона глючить у нас кажуть йому. А що він їм може відповісти, прямого образу ворога перед ним немає, не може ж він гнати всю програму під отдадкой, він же не програміст, він хакер. Якщо я маючи вихідні коди налагоджував прогу півроку, то йому в бінарних кодах скільки буде потрібно?

А суть методу як ти догадивешся дуже проста: В одній з менюшек програми, на вигляд такий-же як і всі інші вводиш пароль, і якщо він є невірним то користуючись генератором випадкових чисел виконуєш невірні команди (зазвичай я використовую свої глюки з ранніх версій програм) . Працює така штука у мене кілька років уже, і досить ефективно. Тобто сутність ідеї полягає в тому щоб не було видно захищена програма чи ні. Мені здається що таким способом можна кріптовать навіть тексти, але як, поки до кінця не додумав, хоча ідеї є.

З повагою,

Олександр Козлов, програмер.

Реєстрація заснована на серійних ключах.

Шановний Олексій, подивився Вашу сторінку про захист програм - досить непогано, але в мене є деякі зауваження. Ви розглядаєте два методи - серійні ключі і реєстратор. Ваше твердження, що другий метод набагато більш надійний, ніж перший, кілька спірно.

Справа в тому, що при хорошому знанні асемблера дуже просто його обійти: коли користувач вводить своє ім'я та реєстраційний код, програма генерує "правильний" код і порівнює його з тим, який він запровадив, тому "перехопити" цей код (просто вважати його з пам'яті) не составлет особливих зусиль. У більшості випадків достатньо просто поставити breakpoint на функцію lstrcmp - і всі справи ... Упаковка програми, анти-дебаггерние і анти-дізассемблерние "примочки" допомагають слабо. Дуже рекомендую заглянути на http://fravia.org - там багато чого з цього приводу написано.

А ось перший метод може бути реалізований досить непогано. Зберігати "правильні" ключі в програмі зовсім не обов'язково - можна підпорядкувати їх деяким правилам; щось подібне робить Microsoft зі своїми CD-keys, але у них все дуже просто. Алгоритм перевірки може бути довгим і заплутаним, так що його дизасемблювання (і "розбирання", що ж він робить) заподіє чимало головного болю. Саме перший метод я і застосував для захисту своєї програми (Advanced Disk Catalog - старі версії), але і він був "зламаний" (хоча, як мені написав ламав його хакер, добірка всього двох правильних ключів відняла в нього багато часу). Тоді мені в голову прийшла ідея: а що, якщо ключі зберігати всередині програми, але зашифрованими? Я "згенерувати" деяку кількість ключів (абсолютно випадковим чином), зашифрував їх (окремо) 128-бітовим ключем за алгоритмом RSA і прошив в програму у вигляді ресурсу. Коли користувач вводить ключ, він шифрується за тим же алгоритмом і порівнюється з правильними. Так як система з відкритим ключем не дозволяє зробити зворотне перетворення, базуючись лише на відкритому ключі (а закритого немає навіть у мене - розшифровувати-то не треба), то підібрати ключі неможливо навіть теоретично.

Є, втім, ще одна проблема: хакер (або "крекерами", якщо завгодно) може замінити 'je' на 'jne' (або щось в цьому роді) там, де відбувається остання перевірка, і функція "IsValidKey (.. .) "буде завжди повертати TRUE. Залишиться лише написати маленький patch ... Щоб захиститися і від цього, я вираховую CRC свого exe-файла і порівнюю його з правильний, прошитим теж усередині програми (природно, при обчисленні ця частина файлу - де лежить правильний CRC - виключається, а "прошивається" він після компіляції). До речі, це ще й захист від вірусів. Взагалі-то, перевірку CRC теж можна локалізувати і "запатчіть", але це вже трохи складніше, особливо якщо програма викликає функції читання / запису і для інших цілей. Крім того, не варто у випадку розбіжності CRC відразу про це повідомляти, ініче можна буде поставити hardware breakpoint і знайти місце, де він обчислюється. І останнє. Якщо хочеться захистити програми зовсім вже "круто", томожно кілька функцій у своїй програмі (ті, які повинні викликатися тільки в зареєстрованій версії), зашифрувати за тим же алгоритмом з відкритим ключем. При цьому, природно, частина серійного номера (посиланого зареєструвалися) треба зробити "статичним", тобто незмінним для всіх користувачів. На основі цієї частини після реєстрації генерується повний закритий ключ, який далі використовується для розшифровки зазначених функцій. Таким чином, навіть якщо буде написаний patch, що дозволяє "зареєструватися" з будь-яким (довільним) кодом, розшифровка пройде неправильно, і замість нормального коду буде виконуватися "сміття".

Цей спосіб я застосував в іншій своїй програмі (Advanced ZIP Password Recovery), та її поки не розкрили. Всього найкращого,

Vladimir Katalov

Як написати свій власний реєстратор.

Існує 2 типу написання реєстратора програми:

Перший - це так звані серійні ключі. Вони вбудовуються в програму і зовсім не залежать ні від введеного імені власника, ні від введеної організації. Його не бажано використовувати по Інтернету, тому що автору Shareware програми необхідно помістити кілька серійних номерів, які можуть бути переглянуті в exe-шнику і потім легко распостроняется через все той же Інтернет.

Другий - це створення свого алгоритму реєстрації, залежить від введеного імені власника (і організації). Ось на ньому ми докладно і зупинимося. Такий тип реєстрації застосовується в багатьох Shareware програмах, наприклад: WinZIP, CutFTP і т.д. Для його написання необхідно використовувати один і той же алгоритм двічі: спочатку в самій програмі для перевірки правильності введеного коду, і в програмі генерування ключів, за допомогою якої Ви, отримавши попередньо ім'я реєструється, створюєте реєстраційний ключ.

Ісходник написаний на Delphi 2.0

У полі NameEd типу TEdit вводиться ім'я (залежить від регістрів літер), а в полі PasswEd теж типу TEdit з'являється реєстраційний ключ. Змінивши глобальну константу RegCode можна отримати зовсім інший ключ для одного і того ж вводиться імені. Сенс цього алгоритму в тому, що спочатку з першим елементом Reg (який прирівнюється RegCod'у) робиться побітова операція XOR з усіма елементами стринга імені і XOR з довгою цього стринга, потім у циклі XORітся поточний елемент з попереднім, а потім весь отриманий масив перекладається в 16-розрядну систему числення і записується в результуючий стринг PasswEd.Text.


const
RegCode: array [1 .. 5] of integer = ($ 3В, $ 1E, $ FB, $ A1, $ 92); {Введіть сюди свої власні значення}

.......


procedure TMainForm.NameEdChange (Sender: TObject);
var Reg: array [1 .. 5] of integer;
z: integer;

{******** Переклад в шістнадцяткову систему *********}
procedure HEXCase (HexNm: integer);
begin

case HexNm of
0 .. 9: PasswEd.Text: = PasswEd.Text + IntToStr (HexNm);
10: PasswEd.Text: = PasswEd.Text + 'a';
11: PasswEd.Text: = PasswEd.Text + 'b';
12: PasswEd.Text: = PasswEd.Text + 'c';
13: PasswEd.Text: = PasswEd.Text + 'd';
14: PasswEd.Text: = PasswEd.Text + 'e';
15: PasswEd.Text: = PasswEd.Text + 'f';
end;


end;
{***************************}


begin {Main}


{Прирівнюємо RegCode = Reg}
For z: = 1 to 5 do Reg [z]: = RegCode [z];


{XORім перший елемент}
Reg [1]: = Reg [1] XOR Length (NameEd.Text);


{XORім його знову з усім Nam'ом}
For z: = 1 to Length (NameEd.Text) do


{XORім його знову з довжиною Nam'a}
Reg [1]: = Reg [1] XOR Ord (NameEd.Text [z]);


{XORім попередній з поточним}
For z: = 2 to 5 do

Reg [z]: = Reg [z] XOR Reg [z-1];

PasswEd.Clear;


{Переводимо Reg в HEX стринг}
For z: = 1 to 5 do
begin
HexCase (Reg [z] div 16);
HexCase (Reg [z] mod 16);
end


end; {main}

Якщо Ви хочете отримувати за свою Shareware програму гроші, то можете скористатися послугами запропонованими російською компанією StrongSoftware
Додати в блог або на сайт

Цей текст може містити помилки.

Програмування, комп'ютери, інформатика і кібернетика | Шпаргалка
16.3кб. | скачати


Схожі роботи:
Зародження криптографії
Основи криптографії
Основи криптографії
Сутність криптографії
Історія виникнення криптографії
Президентський указ по криптографії
Поради школярам
Поради молодим викладачам
Туреччина поради туристам
© Усі права захищені
написати до нас