Myśląc o tym, istnieje kilka różnych rodzajów zaciemnienia. Zacznijmy od zaciemnienia kodu źródłowego, co jest całkowitą stratą czasu; bez tego trudno zrozumieć! Zamiast tego skupmy się na zaciemnieniu pakietu dostarczania, na tym, jak kod jest dostarczany do użytkownika.
Niewielkie zaciemnienie
Istnieje niewielkie zaciemnienie, aby zapobiec przypadkowemu wsuwaniu palców i łatwemu łamaniu przedmiotów. Nie powstrzymuje określonego hakera, ale ma wartość, ponieważ pomaga zapewnić, że rzeczy, o które poproszono cię o wsparcie, są tym, co faktycznie dostarczyłeś. Poziom ochrony wymagany dla tego rodzaju rzeczy jest naprawdę dość niski; pakiet dostawy musi po prostu nie wyglądać czytelny i edytowalny (bez specjalistycznych narzędzi) i to dość dobrze.
Przykładem tego jest minimalizacja Javascript, chociaż nie jest ona sprzedawana jako taka. Nikt przy zdrowych zmysłach nie chciałby czytać i edytować zminimalizowanego pliku JS, nawet jeśli jest to technicznie możliwe, jeśli jesteś wystarczająco zdeterminowany / trwały.
Podobnie jest z dostarczaniem aplikacji Java. Samo zapakowanie kodu w wykonywalny plik JAR zatrzyma większość głupot, mimo że ma całą moc grzecznego znaku „Please Keep Off The Grass” w parku miejskim.
Nawet podczas dostarczania kodu C ++ usunięcie niepotrzebnych symboli z pliku wykonywalnego wystarczy, aby zakwalifikować się jako niewielkie zaciemnienie. Kluczem jest to, że jest niezręczny jest czytanie wyniku jako użytkownik, ale nie ma problemu z wykonaniem go jako komputera.
Poważne zaciemnienie
Poważne zaciemnianie polega na utrzymywaniu determinacji i wiedzy użytkownika z dala. Jest to także gra całkowicie przegrana; jeśli komputer może go wykonać, osoba może go rozdzielić i ustalić, co robi. Najbliżej byłoby, gdyby program ciągle się odszyfrowywał, przekształcając to, co robi w jednym czasie, w zupełnie inną rzecz, niż robi to w innym czasie. Stworzenie takiej rzeczy byłoby raczej trudne i nadal nie powstrzymałoby naprawdę dobrego hakera (choć do końca byliby bardzo wściekli na siebie przy nakładzie pracy wymaganym do odszyfrowania całego tego samodmodyfikującego się kodu).
O wiele lepiej jest myśleć w kategoriach innych rozwiązań. Na przykład, możesz zatrzymać „klejnoty koronne” kodu na serwerach, które kontrolujesz, i zezwalać tylko na połączenia serwisowe, dzięki czemu klient jest zasadniczo darmową grą, która stanowi frontend dla cennych bitów. Możesz też przejść na bardziej kontraktową / legalną ścieżkę i przekazywać pliki wykonywalne tylko tym organizacjom, które formalnie zgadzają się nie zaglądać do twojego kodu lub rekompensować Ci, jeśli to zrobią (tak by to był rodzaj NDA). Celem byłoby stworzenie silnej zachęty dla hakera, aby nie hakował, a użytkownicy trzymali kod z dala od hakerów niezwiązanych umową.
Ale nie możesz zakładać, że twój kod nigdy nie zostanie złamany. Dzięki wirtualizacji każdy stan wykonania programu można zbadać i śledzić, a wszystko, co próbuje go pokonać (np. Śledzenie zegara do zewnętrznego źródła czasu), będzie znacznie bardziej powodować problemy dla legalnych użytkowników niż hakerów. (Zobacz historię DRM, aby dowiedzieć się, w jaki sposób nawet bardzo zdeterminowani wydawcy informacji nie mogą zapewnić bezpieczeństwa swoich systemów, gdy kod jest w rękach ich przeciwników.) O wiele lepiej jest skupić się na tym, aby prawdziwi użytkownicy byli szczęśliwi. Straty wynikające z okazjonalnych cracków będą niczym w porównaniu z dodatkowymi pieniędzmi wniesionymi przez odpowiednio zadowolonych klientów.