Чи важливо приховати код програми C ++?


11

У світі Java, здається, іноді є проблема, але що з C ++? Чи є різні рішення?

Я думав про те, що хтось може замінити бібліотеку C ++ певної ОС на іншу версію тієї ж бібліотеки, але повну символів налагодження, щоб зрозуміти, що робить мій код. Чи не добре використовувати стандартні або популярні бібліотеки?

Це також може статися з деякою бібліотекою dll під Windows, заміненою на "версію налагодження" цієї бібліотеки. Чи краще віддати перевагу статичній компіляції? У комерційних програмах я бачу, що в основі своєї програми вони збирають все статично і здебільшого dll (динамічні бібліотеки взагалі) використовуються для пропонування деяких сторонніх технологій, таких як антипіратські рішення (це я бачу у багатьох іграх ), Бібліотека GUI (наприклад, Qt), бібліотеки ОС тощо.

Чи статична компіляція еквівалентна затуманенню у світі Java? Краще кажучи, це найкраще і найдоступніше рішення для захисту свого коду?


4
Пам'ятайте, що б ви не робили, хтось із занадто багато часу зможе знеструмлювати / декомпілювати це
Завірець

13
Багато компіляторів поставляються з /Oперемикачем обфускації. Деякі навіть мають кілька рівнів затухання, аж до /O3;)
MSalters

@MSalters Ні, g ++ має -O3;)
BЈович

@Zavior Або просто реверс-інженер, звичайний і простий. Це навіть не вимагає самого двійкового файлу, просто ретельного аналізу програмного забезпечення.
Джон Вайс

Відповіді:


27

Не витрачайте час на програш

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

Подальше читання

Вибрані читання по темі (не всі мають специфіку C ++, але застосовуються загальні принципи):

StackExchange відповіді

Папери

Відомі цитати про затуплення:

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


Ніколи?

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

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


Колись ми використовували апаратний ключ, де існувала вимога щодо ліцензування, щоб притупити всі дзвінки функції dongle - і вони надали інструмент для цього. Завжди змусив мене трохи підозріло ставитися до якості їхнього "захисту"!
Мартін Бекетт

@MartinBeckett: справді дивний дивний.
haylem

3

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

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

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


0

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

Незначна затьмарення

Існує незначна омертвіння, щоб запобігти випадковому користувачеві засунути пальці і легко зламати речі. Він не тримає рішучого хакера, але він має цінність у тому, щоб допомогти забезпечити те, що вам потрібно просити підтримати, те, що ви насправді доставили. Рівень захисту, необхідний для подібних речей, дійсно досить низький; пакет поставки просто не повинен виглядати читабельним та редагованим (без спеціалізованих інструментів), і це досить добре.

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

Аналогічно з доставкою програм Java. Просто упаковка коду у виконувану програму JAR зупинить більшість нерозумностей, навіть незважаючи на те, що у всьому містечку ввічливий знак "Будь ласка, тримайте від трави".

Навіть при доставці коду C ++, вилучення непотрібних символів з виконуваного файлу буде достатньо, щоб визнати його незначною затьмаренням. Ключовим є те, що незрозуміло читати результат як користувача, але це не проблема, щоб виконати його як комп'ютер.

Основна тупість

Основна затьмареність - це убереження визначеного та знаючого користувача. Це також загальна програша гра; якщо комп'ютер може виконати його, людина може забрати його і розробити те, що робить. Найближчим ви могли б зробити так, щоб програма постійно розшифровувала себе, перетворюючи те, що вона робить за один раз, у зовсім іншу річ, яку вона робить в інший час. Створити таку річ було б досить складно, і все одно не вдалося б уникнути дійсно хорошого хакера (хоча вони були б справді досить схрещені з вами в кінці цього при необхідній кількості зусиль, необхідних для розшифрування всього цього самовиправляючого коду).

Набагато краще думати з точки зору інших рішень. Наприклад, ви можете зберігати «коштовності корони» коду на серверах, якими ви керуєте, і дозволяєте лише виклики служб до нього, роблячи клієнту по суті безкоштовний роздачу, яка є передовим коштом бітів. Або ви можете піти на більш контрактний / легальний шлях і тільки здавати виконавчі файли організаціям, які офіційно погоджуються не торкатись всередині вашого коду або компенсувати вам, якщо вони це роблять (так що це буде якийсь NDA). Мета полягає в тому, щоб створити сильний стимул для хакера не зламати, а для користувачів тримати код подалі від будь-яких хакерів, не пов'язаних угодою.

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

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