Czy ważne jest zaciemnianie kodu aplikacji C ++?

11

W świecie Java wydaje się czasem stanowić problem, ale co z C ++? Czy są różne rozwiązania?

Myślałem o tym, że ktoś może zastąpić bibliotekę C ++ określonego systemu operacyjnego inną wersją tej samej biblioteki, ale pełną symboli debugowania, aby zrozumieć, co robi mój kod. CZY warto korzystać ze standardowych lub popularnych bibliotek?

Może się to również zdarzyć, gdy niektóre biblioteki dll w systemie Windows zostaną zastąpione „wersją debugowania” tej biblioteki. Czy lepiej jest preferować kompilację statyczną? W aplikacjach komercyjnych widzę, że dla rdzenia swojej aplikacji kompilują wszystko statycznie, a w większości dll (biblioteki dynamiczne ogólnie) są wykorzystywane do oferowania niektórych technologii stron trzecich, takich jak rozwiązania antypirackie (widzę to w wielu grach ), Biblioteka GUI (jak Qt), biblioteki systemu operacyjnego itp.

Czy kompilacja statyczna jest równoznaczna z zaciemnianiem w świecie Java? Mówiąc lepiej, czy jest to najlepsze i najtańsze rozwiązanie do ochrony twojego kodu?

użytkownik827992
źródło
4
Pamiętaj, że cokolwiek zrobisz, ktoś, kto będzie miał zbyt dużo czasu, będzie mógł go odszyfrować /
zdekompilować
13
Wiele kompilatorów jest wyposażonych w /Oprzełącznik zaciemniania. Niektórzy mają nawet wiele poziomów zaciemnienia, aż do /O3;)
MSalters
@MSalters No, g ++ has -O3;)
3овић
@Zavior Lub po prostu poddaj inżynierii wstecznej, prosty i prosty. Nie wymaga nawet samego pliku binarnego, tylko dokładną analizę oprogramowania.
John Weisz

Odpowiedzi:

27

Nie marnuj czasu na przegrywanie bitew

Jak zauważono w wielu innych podobnych odpowiedziach dla C ++ i innych języków, jest to w większości bezużyteczne .

Dalsza lektura

Wybrane teksty na ten temat (nie wszystkie są specyficzne dla C ++, ale obowiązują ogólne zasady):

Odpowiedzi StackExchange

Dokumenty tożsamości

Słynne cytaty na temat zaciemniania:

Wreszcie jest kwestia prywatności kodu. To przegrana sprawa. Nie ma transformacji, która powstrzymałaby zdecydowanego hakera przed zrozumieniem twojego programu. Okazuje się, że jest to prawdą we wszystkich programach we wszystkich językach, jest to oczywiście bardziej oczywiste w JavaScript, ponieważ jest dostarczany w formie źródłowej. Korzyści z zaciemnienia wynikające z prywatności są iluzją. Jeśli nie chcesz, aby inni widzieli twoje programy, odłącz serwer. - Douglas Crockford


Nigdy?

Nie twierdzę, że nigdy nie powinieneś zaciemniać i że nie ma żadnych dobrych powodów, ale poważnie kwestionuję potrzebę tego w większości przypadków i jego opłacalność.

Ponadto zdarzają się sytuacje, w których zaciemnianie jest de facto wymogiem. Na przykład, jeśli piszesz wirusy, oczywiście zaciemnianie (a najlepiej dynamiczne) jest równie dobre dla przetrwania twojego programu, jak jego zdolność do replikacji. Nie stanowi to jednak „zwykłego” przypadku ...

Haylem
źródło
Kiedyś używaliśmy klucza sprzętowego, w którym obowiązywał wymóg licencyjny, aby zaciemnić wszystkie wywołania funkcji klucza sprzętowego - i dostarczyli narzędzie do tego. Zawsze budziłem podejrzenia co do jakości ich „ochrony”!
Martin Beckett,
@MartinBeckett: naprawdę trochę dziwny.
haylem
3

Nie, to nie jest warte wysiłku i myślę, że jest to całkowicie niepotrzebne. Funkcje, które wywołujesz, można prawdopodobnie odgadnąć na podstawie funkcji, którą udostępniasz.

Przyczyną istnienia zaciemniaczy dla Javy jest to, że mapowanie między kodem bajtu Java a kodem źródłowym Java jest dość dobrze zdefiniowane, a nazwy wszystkich funkcji i zmiennych składowych są przechowywane w kodzie bajtów (niezależnie od tego, czy są one publiczne, prywatne czy chronione ), więc interpreter kodu bajtowego Java może przedstawiać rodzajową Javę, która dość dobrze pokazuje strukturę oryginalnego źródła dla źródła nieobjawionego.

C ++ kompiluje się bezpośrednio w języku maszynowym. Można go zdemontować, ale językiem asemblera jest dość żmudny. Dekompilacja jest znacznie trudniejsza ze względu na wszystkie zmiany dokonane przez optymalizatory w kodzie podczas kompilacji.

James McLeod
źródło
0

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.

Donal Fellows
źródło