Інструменти / стратегія обфускування .NET [закрито]


160

Мій продукт має кілька компонентів: ASP.NET, додаток Windows Forms та служба Windows. 95% або близько цього коду написано у VB.NET.

З міркувань інтелектуальної власності мені потрібно придушити цей код, і до цього часу я використовував версію dotfuscator, якій зараз більше 5 років. Я думаю, що настав час перейти до інструменту нового покоління. Що я шукаю - це перелік вимог, які я повинен враховувати під час пошуку нового обфускатора.

Що я знаю, що слід шукати поки:

  • Серіалізація / десерталізація . У своєму теперішньому рішенні я просто кажу інструменту не замучувати членів даних класу, тому що біль не в змозі завантажити дані, які раніше були серіалізовані, просто занадто великий.
  • Інтеграція з процесом збірки
  • Робота з ASP.NET . Раніше я вважав це проблематичним через зміну імен .dll (у вас часто є по одній сторінці) - з якими не всі інструменти справляються добре.

Кілька дублікатів: google.com/…
Джон Раш


Дивіться Agile.net .NET Obfuscator, щоб отримати альтернативне рішення щодо оскарження коду. Зокрема, перевірити його функцію віртуалізації коду.
sutton bernard

Дивіться хороший список обскудаторів від ArmDot до Xenocode тут на SO: stackoverflow.com/a/60054/1480104
Артем Разін

Відповіді:


43

Повернення до .Net 1.1 обфускування було важливим: декомпіляція коду була простою, і ви можете перейти від складання, до IL, до коду C # і скомпілювати його знову з дуже невеликими зусиллями.

Тепер з .Net 3.5 Я зовсім не впевнений. Спробуйте розкласти збірку 3.5; що ви отримуєте - це довгий шлях від складання.

Додайте оптимізацію з 3,5 (набагато краще, ніж 1,1), і те, як анонімні типи, делегати та інше обробляються шляхом відображення (вони кошмар для перекомпіляції). Додайте лямбда-вирази, "магію" компілятора на зразок Linq-синтаксису та varта функції C # 2yield (що призводить до появи нових класів з нечитабельними іменами). Ваш декомпільований код закінчується дуже довго від компільованого.

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

Я рекомендую підписати свої збори на ключ (тобто якщо хакери зможуть перекомпілювати одну, яку вони повинні перекомпілювати всі), але я не думаю, що обфускація того варта.


127
Повністю не згодні. Підписання не може замінити обфускування. Підписання спрямоване на те, щоб зламати ваш код. Але якщо вам, що приховати, ідея, алгоритми та ін. Затухання - це єдиний спосіб.
Шрайк

24
Я не думаю, що підписання може замінити затуманення, це просто ускладнює злому. Обфускування не вдається приховати вашу ідею - якщо вони хочуть скопіювати те, що їм все одно доведеться, а обфускація навіть не зробить це набагато складніше. Зокрема, оскільки алгоритми всі оператори обфускування не мають на них особливого впливу - вони, як правило, є однією з найпростіших речей для вилучення.
Кіт

6
Заблуднення може бути не вартим, якщо ваша розмова про команду з великою кількістю ресурсів у неї є одноразовою, але обтурація чудово захищає від "середнього" розробника, який не хоче нічого іншого, як використовувати Reflector для відкриття вашої збірки та збереження вихідного коду як проект та внесення змін. Заплутаність має своє місце і повністю виключати це неправильне ставлення. Це шар оборони.
Бритва

5
Коли ви декомпілюєте, джерело знаходиться в безладному стані, але логічно воно все одно слідує тим же шляхом. Немає "магічного" вуду компілятора. Я знаю, бо нещодавно втратив сховище і використав рефлектор для відновлення вихідного коду. Заплутаність - це лише біль, який потрібно «підтримувати», якщо це не є частиною вашого процесу збирання. Це додає накладні витрати, але чи всі ми пишемо обчислювально інтенсивні програми? Ні. Це слабкий рівень захисту для слабкого нападника.
Бритви

8
Яка жахлива відповідь. Ви насправді намагалися декомпілювати останнім часом? Декомпілятори стали краще , не гірше. Рефлектор надає майже оригінальну якість, але, звичайно, не залишає коментарів.
BlueRaja - Danny Pflughoeft

50

Ми спробували ряд обскураторів. Жоден з них не працює на великому клієнтському / серверному додатку, який використовує видалення. Проблема полягає в тому, що клієнт і сервер діляться деякими dll, і ми не знайшли жодного обфускатора, який би впорався з цим.

Ми спробували DotFuscator Pro, SmartAssembly, XenoCode, Salamander та декілька невеликих часових програм, імена яких уникають мене.

Чесно кажучи, я переконаний, що затуманення - це великий злом.

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


14
Браво Юда! Єдиний спосіб йти вперед - це розробити новий, кращий код, не чіпляючись до коду, який ви вже написали. Ви вкладаєте час, зусилля та, можливо, навіть гроші в те, що не має значення. Заблуднення не варто.
Девід Руттен

180
Тому мені не подобається ця система репутації, у вас є 19 голосів, і ви не надали відповіді. Користувач не запитує вашої думки щодо притуплення, він хоче дізнатися більше про методи обфукації.
зворотна коса17

32
Я надав інформацію про свій досвід, використовуючи кілька існуючих обскураторів. І моя думка випливала з цього досвіду.
Іуда Габріель Хіманго

6
+1 за "Чесно кажучи, я переконаний, що затуманення - це великий злом". Ви не могли б зробити це кращим за це.
Андрій Ронеа

15
Дуже обґрунтованою потребою захисту вашого коду є продаж дорогих спеціалізованих додатків компаніям, які використовуватимуть їх внутрішньо лише у кількох користувачів. Спокуса полягає в тому, щоб змінити код, щоб дозволити внутрішній злом і модифікації для власних цілей, уникати контрактів на технічне обслуговування або навіть зламати пробні версії, щоб отримати вигоду, яка їм потрібна.
Брейді Моріц

44

Я зараз "коліна глибокої", намагаюся знайти хороше рішення. Ось мої враження поки що.

Xenocode - у мене є стара ліцензія на Xenocode2005, яку я використовував для обмацування своїх збірок .net 2.0. Це добре працювало на XP і було гідним рішенням. Мій поточний проект є .net 3.5, і я перебуваю на Vista, підтримка сказала мені, щоб я його перейшов, але версія 2005 року навіть не працює на Vista (збої), тому я і тепер мені потрібно придбати "PostBuild2008" за ціною гобуса. від 1900 дол. Це може бути хорошим інструментом, але я не збираюсь це з'ясовувати. Занадто дорого.

Reactor.Net - Це набагато привабливіший ціновий пункт, і він добре працював на моєму автономному виконанні. Модуль ліцензування також був приємним і врятував би мені купу сил. На жаль, в ньому відсутня ключова особливість, і це можливість виключити речі з обфускування. Це унеможливлює досягнення потрібного мені результату (Об’єднайте кілька збірок разом, притупіть деякі, а не обплутайте інші).

SmartAssembly - я завантажив для цього Eval, і він працював бездоганно. Я зміг досягти всього, що хотів, і Інтерфейс був першим класом. Ціна все ще трохи здоровенна.

Dotfuscator Pro - Не вдалося знайти ціну на веб-сайті. В даний час в обговоренні отримати пропозицію. Звуки зловісні.

Confuser - проект з відкритим кодом, який працює досить добре (плутати ppl, як випливає з назви).

Примітка: повідомляється, що ConfuserEx "зламаний" відповідно до випуску № 498 у їхньому репортажі GitHub.


8
Ви можете опублікувати скільки цитованих dotfuscator?
Ентоні Джонстон

6
@Anthony Нещодавно я придбав ліцензію на початку 2011 року. Пропозиція становила 2475 доларів США за мінімальну машину для створення 1 + 1 ліцензію розробника. Включає 12 місяців оновлення та підтримки.
Йоші

2
Я не використовував .NET Reactor, коли ця публікація була зроблена, але тепер ви можете виключити частини коду з придушення, використовуючи атрибут System.Reflection.Obfuscation. Також є деякі налаштування, які дозволяють виконувати такі дії, як виключення всіх методів або всіх типів серіалізації.
benteight

5
DotFuscator процитував мені 4999 доларів, що було знижено до 4500 доларів через 10% знижку. Це було на 1 ліцензію на розробник! Під час обговорень це було зменшено до 2500 доларів, але все-таки занадто дорого.
Олівер

3
.NET Reactor тепер має редактор правил виключення, що дозволяє виключати певні класи, методи або властивості з обфускування. Також ви можете використовувати прапорець "Злити лише", щоб виключити конкретний dll з
обфускування


18

Я використовую smartassembly. В основному, ви вибираєте dll, і він повертає його заплутаним. Це, здається, працює добре, і у мене поки що проблем не було. Дуже, дуже простий у використанні.


6
Smartassembly досить марно. Зломщик ставить вашу програму в DumbAssembly і весь "захист" видаляється натисканням миші: woodmann.com/collaborative/tools/index.php/Dumbassembly
Elmue

2
Відтепер Google безпечно переглядає прапори сайту Woodmann як небезпечні. Крім того, на сайті Woodmann є ціла стаття про нього, який раніше страждав від зловмисного програмного забезпечення, тому я не хочу дуже орієнтуватися на його сайті, коли Google не довіряє йому.
Брайан

10

Я спробував майже кожен обфускатор на ринку, і SmartAssembly - найкращий на мій погляд.


6
Smartassembly досить марно. Зломщик вводить вашу програму в DumbAssembly і весь "захист" знімається клацанням миші: woodmann.com/collaborative/tools/index.php/Dumbassembly
Elmue

3
Відтепер Google безпечно переглядає прапори сайту Woodmann як небезпечні. Крім того, на сайті Woodmann є ціла стаття про нього, який раніше страждав від зловмисного програмного забезпечення, тому я не хочу дуже орієнтуватися на його сайті, коли Google не довіряє йому.
Брайан

9

Я також використовував SmartAssembly. Я виявив, що Ezrinz .Net Reactor набагато краще для мене в додатках .net. Він обтяжує, підтримує Mono, об'єднує збірки, а також має дуже приємний ліцензійний модуль для створення пробної версії або підключення ліцензії до певної машини (дуже просто в реалізації). Ціна також є дуже конкурентоспроможною, і коли мені потрібна підтримка, то там, де швидко. Езіріз

Просто для того, щоб було зрозуміло, я просто зберігач, який любить продукт і не має жодного стосунку до компанії.


У мене є кілька друзів , які клянуться .Net Reactor - хоча і не на сайті продукції є корисно для групи Google для продукту , а також: groups.google.com/group/net-reactor-users?hl=en
Bittercoder

2
+1 для Eziriz. Я мав відмінні результати з цим. Це найкраще зараз, ІМО.
Друїд

4
.NET реактор відстій. Я змінив комп’ютер, двічі надіслав електронний лист стосовно файлу ліцензії, і не отримав відповіді. Ви бачите, що ліцензія .NET Reactor заблокована апаратно.
АбоElse

2
Це нормально. Як ви очікуєте, що вони вам вірять? Звідки вони знають, що ви дійсно змінили комп’ютер і не намагаєтеся запустити ліцензію свого друга на комп’ютер? Бо це апаратне блокування! Якби його можна було використовувати на декількох комп'ютерах, апаратне блокування було б марним.
Елмуе

(PS. Ми вибрали Reactor значною мірою на основі цієї відповіді SO.)
Кріс,

7

Коротка відповідь полягає в тому, що ви не можете.

Навколо є різні інструменти, які комусь ускладнюють читання вашого коду - на деякі з них вказували інші відповіді.

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


51
якщо (зусилля. Потрібні> кодFromScratch.Costs) DoNoReverseEngineer ();
Ніколя Доріє

41
@NicolasDorier,Operator '>' cannot be applied to operands of type 'System.TimeSpan' and 'decimal'
Саїб Amini

21
@Seeb впевнений, що може, переведення з TimeSpan на гроші (десяткові) - це те, що стосується більшості підприємств.
hultqvist

6

У нас є багаторівневий додаток з інтерфейсом asp.net та winform, який також підтримує видалення. У мене не було проблем із використанням будь-якого обфускатора, за винятком типу шифрування, який генерує завантажувач, який може бути проблематичним у всіляких несподіваних способах, і, на мою думку, просто не варто. Насправді моя порада буде більше узгоджуватися з текстами "Уникайте шифрувальних обскусаторів типу навантажувачів, як чума". :)

На мій досвід, будь-який обфускатор буде чудово працювати з будь-яким аспектом .net, включаючи asp.net та видаленням, вам просто потрібно наблизитись до налаштувань та дізнатись, як далеко ви можете натиснути на нього, в яких районах вашого коду. І знайдіть час, щоб спробувати зворотну інженерію того, що ви отримаєте, і подивіться, як це працює з різними налаштуваннями.

Ми використовували кілька років у своїх комерційних додатках і влаштувались на obfuscator Spices від 9rays.net, оскільки ціна правильна, вона справляється, і вони мають хорошу підтримку, хоча нам справді вже не потрібна підтримка в роках, але чесно кажучи Я не думаю, що це дійсно має значення, яким обфускатором ви користуєтесь, проблеми та крива навчання все одно, якщо ви хочете, щоб це працювало належним чином із видаленням та asp.net.

Як уже згадували інші, все, що ви насправді робите, - це еквівалент замка, що дозволяє інакше чесним людям і або ускладнює просто перекомпілювати додаток.

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

Дійсно зайняти це занадто далеко і негативно впливати на ваших клієнтів та ваш бізнес, робити те, що просто і розумно, а потім не турбуйтеся про це.


5

Останні два дні я експериментував із розширеним Dotfuscator Community Edition (безкоштовне завантаження після реєстрації базового CE, що постачається в комплекті з Visual Studio).

Думаю, що більшість людей не використовують обфускування як варіант за замовчуванням у тому, що це серйозні клопоти порівняно з ризиком. На менших тестових проектах я міг отримати заплутаний код, що працює з великими зусиллями. Розгортання простого проекту через ClickOnce було проблематичним, але досяжним після підписання маніфестів вручну вручну. Єдина проблема полягала в тому, що при помилці слід стека повернувся затуманеним, а у СЕ немає упакованого деобфускатора чи освітлювача.

Я спробував придушити справжній проект, який VSTO базується в Excel, з інтеграцією в Virtual Earth, безліччю дзвінків у веб-сервіси та контейнером IOC та багато роздумів. Це було неможливо.

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


5

Crypto Obfuscator вирішує всі ваші проблеми та сценарії. Це:

  1. Автоматично виключає типи / члени з обфускування на основі правил. Серіалізовані типи / поля є одним з них.
  2. Її можна інтегрувати в процес збирання за допомогою MSBUild.
  3. Підтримує проекти ASP.Net.

3
fyi @logicnp написав Crypto.
CAD блокується

Схоже, криптовалюта більше не підтримується.
Карл

Я спробував декілька, "Crypto" видався дуже агресивним і корисним, але при запуску затуманеної DLL у De4dot я отримав оригінальний код ... Вибачте за те, що розгубив вечірку ....
Дейв Гахан

4

Нещодавно я спробував перенести вихід одного вільного обфускатора в інший безкоштовний обфускатор - а саме Dotfuscator CE та новий обробник Babel на CodePlex. Більше деталей у моєму блозі .

Що стосується серіалізації, я перемістив цей код в іншу DLL і включив його в проект. Я обґрунтовував, що там не було ніяких секретів, які так чи інакше відсутні в XML, тому не потрібно було придушення. Якщо в цих класах є якийсь серйозний код, використання часткових класів в основній збірці повинно охоплювати його.


-1, тому що "йо дауг, я чув, що ти любиш обскураторів, тож я запустив обфускатора на виході обфускатора ... хочу знати більше? Хітів сторінки". Але я вважаю другий абзац дуже гарною пропозицією.
ANeves

3

Ви повинні використовувати все, що найдешевше і найвідоміше для вашої платформи, і називати це щодня. Заплутаність мов високого рівня є важкою проблемою, тому що потоки коду VM не страждають від двох найбільших проблем, які роблять поточні потоки опкодів: ідентифікація функції / методу та реєстр.

Те, що ви повинні знати про повернення байтового коду, це те, що тестери безпеки вже є звичайною практикою перегляду прямого коду X86 і виявлення в ньому вразливих місць. У необробленому X86 не можна навіть знайти дійсні функції, не кажучи вже про відстеження локальної змінної під час виклику функції. Практично за жодних обставин реверсори кодового коду не мають доступу до імен функцій та змінних --- якщо тільки вони не переглядають код Microsoft, для якого MSFT з користю надає цю інформацію громадськості.

"Dotfuscation" працює в основному за допомогою шифрування функцій та імен змінних. Це, мабуть, краще зробити, ніж опублікувати код з інформацією про рівень налагодження, де Reflector буквально відмовляється від вашого вихідного коду. Але все, що ви зробите поза цим, швидше за все, призведе до зменшення віддачі.



3

Ви можете використовувати "Dotfuscator Community Edition" - це за замовчуванням у Visual Studio 2008 Professional. Ви можете прочитати про це на:

http://msdn.microsoft.com/en-us/library/ms227240%28VS.80%29.aspx
http://www.preemptive.com/dotfuscator.html

"Професійна" версія продукту коштує грошей, але краще.

Чи дійсно вам потрібен ваш код прихованим? Зазвичай дуже мало помилок з тим, що ваша програма декомпілюється, якщо тільки вона не використовується з метою безпеки. Якщо ви переживаєте за те, щоб люди "крали" ваш код, не будьте; переважна більшість людей, які дивляться на ваш код, будуть для навчальних цілей. У будь-якому разі не існує повністю ефективної стратегії обскубації для .NET - хтось з достатньою кваліфікацією завжди зможе декомпілювати / змінити додаток.


+1 для цього. Я пробував майже кожен безкоштовний .NET obfuscator там, і Dotfuscator був єдиним, хто фактично заплутав значну частину MSIL у моїх додатках ASP.NET.
saille

@Saille, чи використовували ви для цього безкоштовний Dotfuscator - Community Edition? Я щойно провів чат продажу, і вони кажуть, що видання коштує 2000 EUR. :(
Хоуман

Дотфускатор марний.
користувач626528

3

Уникайте реактора. Це абсолютно марно (і так, я заплатив за ліцензію). Ксенокод був найкращим, з яким я стикався і купував ліцензію теж. Підтримка була дуже хорошою, але мені вона була не дуже потрібна, оскільки вона просто працювала. Я перевіряв кожного обскускатора, який я міг знайти, і я дійшов висновку, що ксенокод був далеко і найнадійнішим і робив найкращу роботу (також можливість опублікувати ваш .NET exe до рідного exe, якого я більше ніде не бачив.)

Є дві основні відмінності між реактором і ксенокодом. Перший - Xenocode насправді працює. Друге - швидкість виконання ваших збірок не відрізняється. З реактором це було приблизно в 6 мільйонів разів повільніше. У мене також склалося враження, що реактор - це операція однієї людини.


.NET Reactor має безліч варіантів. Деякі з них передбачають захист від виконання часу і трохи сповільнить додаток, але це ціна додаткової безпеки, яку ви отримаєте. Однак я серйозно сумніваюся, чи не відбудеться сповільнення, якщо ви просто скористаєтеся
обфускуванням

3

Я виявив, що Agile.Net забезпечує досить хороший захист для вашої .Net Assembly, оскільки він пропонує не тільки затуплення, але і шифрування. Завантажте безкоштовний слід.
http://secureteam.net/NET-Code-Protection.aspx http://secureteam.net/downloads.aspx


3
Eazfuscator сказав, чому б не записати MSIL: див. Gapotchenko.com/eazfuscator.net/kb/100028
QMaster

2

Я оскаржував код в одній програмі з .Net 1, і це було головним болем з точки зору технічного обслуговування. Як ви вже згадували, проблеми серіалізації можна уникнути, але зробити помилку і притупити те, чого ви не хотіли придушити, насправді легко. Легко порушити збірку або змінити шаблон обфускування і не в змозі відкривати старі файли. Плюс може бути важко з’ясувати, що пішло не так і куди.

Нашим вибором був Xenocode, і якби я сьогодні став знову робити вибір, я вважаю за краще не кодувати коду або використовувати Dotfuscator.



1

Ми використовуємо SmartAssembly на своєму клієнті Windows. Працює просто чудово.

Чи додасть вам і додаткових проблем. Друк імен класів у файлах журналу / винятках має бути знецінено. І звичайно не можна створити клас із його імені. Тож непогано зазирнути до свого клієнта і побачити, які проблеми можна отримати, обдумуючи.




1

Мені довелося використовувати захист від обфускування / ресурсів у своєму останньому репозиторії, і я знайшов Crypto Obfuscator як приємний та простий у використанні інструмент. Проблема серіалізації - лише питання налаштувань цього інструменту.


@logicnp, це ваша друга публікація в цій темі, яка підтримує цей продукт. Будь ласка, розкрийте, чи є у вас стосунки з розробником цього продукту.
H2ONaCl

Вибачте, але de4dot може це знешкодити . Я рекомендую використовувати ConfuserEx .
newbieguy

1

Існує хороша версія з відкритим кодом під назвою Obfuscar. Здається, добре працює. Типи, властивості, поля, методи можуть бути виключені. Оригінал тут: https://code.google.com/p/obfuscar/ , але, здається, більше не оновлюється


Я сьогодні придивився до цього - відзначте дату мого коментаря! - і трохи безладно розпочати. Я також втратив найкращу частину години, намагаючись змусити її переписати збірку за допомогою .pfx-файлу. Це кинуло незрозумілу, недокументовану помилку; Здається, ви можете підписати лише за допомогою .snk.
SteveCinq

0

Ви також можете ознайомитися з новими технологіями захисту коду, такими як Metaforic та ViLabs, та новими технологіями захисту від копіювання програмного забезпечення, такими як ByteShield . Розкриття інформації: Я працюю на ByteShield.


0

Я також використовую smartassembly. Однак я не знаю, як це працює для веб-програми. Однак я хочу зазначити, що якщо ваш додаток використовує захист типу умовно-безкоштовного програмного забезпечення, переконайтеся, що він не перевіряє ліцензію з булевим поверненням. занадто легко байтувати тріщини. http://blogs.compdj.com/post/Binary-hack-a-NET-executable.aspx


0

SmartAssembly чудово, мене використовували в більшості моїх проектів


-1

Я спробував демо-версію Eziriz .... Мені це сподобалось. Але ніколи не приносив програмне забезпечення.


як це може бути відповідь вікі від громади?
ΦXocę 웃 Пепеупа ツ

-1

Замутнення - це не справжній захист.

Якщо у вас є файл .NET Exe, є краще рішення FAR .

я використовую Themida і можу сказати, що вона працює дуже добре.

Єдиним недоліком Themida є те, що він не може захистити .NET Dlls. (Він також захищає код C ++ у Exe та DLL)

Феміда набагато дешевша, ніж згадані тут обскуратори, і найкраща в боротьбі з піратством захисті на ринку. Він створює віртуальну машину, коли критичні частини вашого коду виконуються і запускають декілька потоків, які виявляють маніпуляції або точки прориву, встановлені зломщиком. Він перетворює .NET Exe у те, що Reflector навіть не розпізнає як збірку .NET.

Будь ласка, прочитайте детальний опис на їхньому веб-сайті: http://www.oreans.com/themida_features.php


-2

Я спробував продукт під назвою Rummage, і він робить хорошу роботу в наданні вам деякого контролю ... Хоча йому бракує багатьох речей, які пропонує Eziriz, але ціна на Rummage занадто хороша ...

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.