Zabezpieczenie aplikacji offline.

0

Cześć,
tworzę aktualnie prostą aplikację i nie mogę wymyślić rozwiązania jednego z kluczowych problemów.
Chciałbym aby aplikacja działała tylko na 1 komputerze i przez określony czas.
Wpadłem na pomysł aby stworzyć tablicę która będzie zawierać klucz licencyjny, date wyłączenia programu oraz numer seryjny dysku twardego. Utworzona tablica zostałaby przekonwertowana na jsona i zahashowana.
Niestety nie mam zielonego pojęcia w jaki sposób mógłbym zahashować taki ciąg znaków i ponownie odczytać jego wartości w celu porównania.
Bardzo proszę o wskazówki w jaki sposób mogę zakodować ten ciąg aby jego odkodowanie sprawiło jak największą trudność potencjalnego intruzowi.

4

Niestety nie mam zielonego pojęcia w jaki sposób mógłbym zahashować taki ciąg znaków i ponownie odczytać jego wartości w celu porównania.

Nie da się. Robi sie to tak, ze hashujesz ponownie te dane które cię interesują i dopiero wtedy porównujesz hashe :)

Niestety generalnie jak ktoś będzie chciał, to obejdzie to zabezpieczenie w mgnieniu oka, patchując aplikacje i dodając sobie jumpa który ominie cały ten twój check.

0

"Niestety generalnie jak ktoś będzie chciał, to obejdzie to zabezpieczenie w mgnieniu oka, patchując aplikacje i dodając sobie jumpa który ominie cały ten twój check "

jest jakiś sposób aby się przed tym uchronić ew. utrudnić?

1

Nie tędy droga. Amatorskie implementacje zabezpieczeń padają jak muchy. Polecam się ze swoim rozwiązaniem jeśli chodzi o 32 bitowe, natywne aplikacje C++.

Jak odczytać sprzętowy ID:

https://github.com/PELock/PELock-Software-Protection-and-Licensing-SDK/tree/master/Examples/Polish/1.%20System%20licencyjny/GetHardwareId%20-%20sprzetowy%20identyfikator

Czy licencja jest zablokowana na sprzętowy ID:

https://github.com/PELock/PELock-Software-Protection-and-Licensing-SDK/tree/master/Examples/Polish/1.%20System%20licencyjny/IsKeyHardwareIdLocked%20-%20czy%20klucz%20jest%20zablokowany%20na%20sprzetowy%20identyfikator

Jak ustawić własny algorytm generacji sprzętowego ID (np. w oparciu o jakieś własne, zewnętrzne komponenty sprzętowe):

  1. https://github.com/PELock/PELock-Software-Protection-and-Licensing-SDK/tree/master/Examples/Polish/1.%20System%20licencyjny/HARDWARE_ID_CALLBACK%20-%20wlasna%20procedura%20identyfikatora%20sprzetowego

  2. https://github.com/PELock/PELock-Software-Protection-and-Licensing-SDK/tree/master/Examples/Polish/1.%20System%20licencyjny/SetHardwareIdCallback%20-%20wlasna%20procedura%20identyfikatora%20sprzetowego

Ogólnie SDK zawiera tonę metod utrudniających złamanie aplikacji.

Jakie są wady takich systemów jak mój? Nie lubią się z antywirusami, które tagują wszystko co nie jest czystym exekiem (a nawet czasami czyste exeki tagują jako malware) jako false-positive detection. Jak sobie z tym poradzić? Na public wypuszczać wersje demo z brakującym kodem (#ifdef twoim przyjacielem), a dla klientów zabezpieczone wersje z adnotacją, że AV może się przyczepić i żeby to zignorować.

2

Nie wiem czy polecałbym akurat Puloka, ale @Bartosz Wójcik ma tu rację, że takie chałupnicze zabezpieczenia niewiele dadzą. Tzn pytanie przed kim chcesz to zabezpieczać, ale akurat ominięcie takiego checka jest trywialne i jeśli serio chcesz się jakoś zabezpieczyć, to musisz to zrobić inaczej.

0
Shalom napisał(a):

Nie wiem czy polecałbym akurat Puloka, ale @Bartosz Wójcik ma tu rację, że takie chałupnicze zabezpieczenia niewiele dadzą. Tzn pytanie przed kim chcesz to zabezpieczać, ale akurat ominięcie takiego checka jest trywialne i jeśli serio chcesz się jakoś zabezpieczyć, to musisz to zrobić inaczej.

Wy macie tak już z natury, czy też po prostu... edukacji wam brakuje? :)

wystarczy w kilku miejscach sprawdzać - tak fragmentarycznie, w etapach;
i teraz możecie sobie skakać i wycinać - powodzenia życzę.

A jeśli miałoby to być tak całkiem super, no to trzeba pomieszać kod zabezpieczeń z tym funkcjonalnym,
i sytuacja łamacza jest już zupełnie beznadziejna, bo po wycięciu/ominięciu zabezpieczeń program zacznie źle działać:
bzdury będzie produkował - w najlepszym przypadku, bo zwykle będzie się zupełnie sypał, zawieszał, wywalał błędy krytyczne - system go zamknie i tyle.

0

A cóż to za wybitny program, że wymaga takich zabezpieczeń ?
W mojej własnej ocenie jest odwrotna proporcjonalność rzeczywistej wartości programu *) i podobnych technik.

*) wartość w oczach twórcy jest wykładniczą funkcją czasu

4
Brattanek napisał(a):

tworzę aktualnie prostą aplikację
Chciałbym aby aplikacja działała tylko na 1 komputerze i przez określony czas.

Ja powiem, że jest jeszcze gorzej.
Czy na google play lub Apple Store największą plagą jest hackowanie aplikacji?
NIE! Największą plagą jest klonowanie aplikacji.
Jak ktoś wpadnie na dobry prosty pomysł, to za 6mc sklepy zalane są klonami (zwykle gorszymi), a przed tym chroni jedynie złożoność produktu.

Wątpię, by twoja aplikacja, była na tyle atrakcyjna i skomplikowana, by ktoś kto ma odpowiednie umiejętności chciał ją hackować.
Skoro jest prosta to bardziej prawdopodobne jest to, że ktoś ją sam napisze od zera, albo już to zrobił, bo jak klasyk mówi: "wszystko co proste zostało już zrobione".

Dlatego jak chcesz bawić się w licencje i zabezpieczenia, to nie kombinuj za bardzo.
Najlepiej olać temat.
Jak już to robić, to ja po prostu bym wykorzystał OpenSSL, by klucz licencyjny był po prostu podpisem elektronicznym jakiś danych licencjobiorcy (nazwa licencjobiorcy) i totalnie olał kwestię łatwości hackowania.

0

Bardzo dziękuje za wszystkie wypowiedzi. Aplikacja którą tworzę będzie działała tylko i wyłącznie na Linuxie dlatego rozwiązanie PELock się nie sprawdzi.
Generalnie dopiero zaczynam przygodę z C++ ponieważ wymyśliłem aplikację która uprości wykonywanie pewnych działań i wiem, że będzie w stanie pomóc nie tylko mi ale też kilku innym osobą z branży. Zazwyczaj wszystko załatwiałem w PHP i tam kwestie licencji były dużo prostsze ze względu na uruchamianie skryptów na moim serwerze.
Aplikację będę miał zamiar sukcesywnie rozbudowywać a wiem, że najłatwiej nauczyć się języka mając cel i do niego dążyć. Zabezpieczenie aplikacji jest właśnie jednym z tych celów. Nie chciałbym aby w przyszłości śmigała po internecie bo jakiś gamoń ominie wszystko 1 trickiem. Moim celem nie jest stworzenie aplikacji dla korporacji która na braku zabezpieczeń straci X euro tylko zabezpieczenie się przed amatorem który coś tam umie w komputer.

5
Brattanek napisał(a):

Generalnie dopiero zaczynam przygodę z C++

Szczerze to wszyscy się tego domyślaliśmy.
Głownie początkujący, bujają w obłokach, rozmyślają o wielkich sukcesach swoich dzieł i zanim je zrealizują, zamartwiają się, że ktoś ukradnie im pomysł, więc szukają różnych zapieczeń.
Nie zrobiłeś jeszcze kroków A B C, a już planujesz X Y Z.

Ci bardziej doświadczenie bardziej bawią się w open source, co pokazuje absurd zabezpieczeń.
Ba znam parę płatnych produktów, które są open source.

3

Wy macie tak już z natury, czy też po prostu... edukacji wam brakuje?

@bonifacy widzę troll znowu atakuje i znowu wypowiada sie na tematy o których nie ma pojecia... A Bartowi na pewno brakuje edukacji, w końcu wcale nie żyje od lat z pisania softu do zabezpieczania binarek xD

wystarczy w kilku miejscach sprawdzać - tak fragmentarycznie, w etapach; i teraz możecie sobie skakać i wycinać - powodzenia życzę.

Oh sweet summer child. Ludzie na CTFach dla zabawy robią takie rzeczy:
https://www.robertxiao.ca/hacking/dsctf-2019-cpu-adventure-unknown-cpu-reversing/
https://github.com/p4-team/ctf/tree/master/2018-09-29-dragonctf/chains-of-trust
https://github.com/p4-team/ctf/tree/master/2018-08-18-whitehat/re04

a ty myślisz ze dodanie kilku checków w róznych miejscach w czymś pomoże xD
Gdybyś miał jakiekolwiek pojęcie w temacie, to zasugerowałbyś może jedyną z nielicznych faktycznie dość ciężkich metod (i tak do połamania ale dużym kosztem) czyli jakiś vmprotect - generowanie customowej maszyny wirtualnej i enkodowanie binarki za pomocą jej instrukcji. Tylko że tutaj koszt wydajnościowy może być nie do zaakceptowania.

0

Czyli rozumiem, że najważniejsza jest umowa licencyjna a nie same zabezpieczenia?
Trochę się dzisiaj pobawiłem i zauważyłem, że wszystkie stringi jak i parametry które przekazuje np. do system() są widoczne nawet przy otwarciu skompilowanego pliku notatnikiem. Pokazywanie np. z jakim API pod jakim adresem łączy się aplikacja lub parametry które przekazuje się do funkcji wydaje się być bardzo nierozsądne. Tym bardziej że to wszystko zapisane jest plain textem pośród krzaków.
Czy można z tym faktem coś zrobić?

2

Czy można z tym faktem coś zrobić?

Można sobie szyfrować stringi i deszyfrować w trakcie działania programu, ale to niewiele pomaga. Bo mozesz użyć jakiegoś strace albo ltrace albo debuggera albo jeśli aplikacja stuka po http gdzieś to wiresharka i i tak zobaczysz przynajmniej endpointy.
Popatrz sobie np. na https://www.cert.pl/news/single/nymaim-atakuje-ponownie/ masz tu przykład malware które celowo jest wlaśnie pozabezpieczane przed analizą ;)

1

Ważniejsze jest czego sam oczekujesz?
Jeśli chcesz uczyć się reverse engineering itp, to wtedy możesz próbować dla własnej zabawy.

Jeśli chcesz zrobić to by naprawdę zabezpieczyć swoją aplikację, to tracisz czas, bo:

  • sam napisałeś, że aplikacja jest prosta, ergo prościej będzie napisać własną (zapewne lepszą), jeśli ktoś stwierdzi, że warto
  • takie zabezpieczania częściej są wielkim bólem głowy niż skuteczne. Było tak już wiele razy, że DRM-y uczciwym użytkownikom psuły krew, a ci co korzystali z piratów mieli pełnowartościowy produkt 3 miesiące po premierze.
  • jako początkujący powinieneś się skupić na rozwijaniu umiejętności w obszarach, na których ci zależy. Jeśli zależy ci na rozwijaniu swojej aplikacji, to zdobywaj na niej doświadczenie. Zapewniam cię, że dużo wody w Wiśle upłynie, zanim ktoś stwierdzi, że warto kupić twoją aplikację, a jeszcze więcej, zanim ktoś stwierdzi, że warto ją hackować.
0

Shalom'on: ty wywaliłeś się już kompletnie w temacie 'wyszukiwania haseł w zbiorze literek', więc nie pogrążaj się.

Ostatecznie mogę wam nawet podesłać mój stary program,
a wtedy zobaczymy, czy złamiecie zabezpieczenie (przed kopiowaniem):
robimy zakład że nie dacie rady - stawiam całe 10 zł?

2

Tak z ciekawości jak tam z twoimi podstawowymi umiejętnościami?
Czy używasz/znasz

  • debugera
  • kontroli wersji (git)
  • wzorce projektowe: fabryka, obserwator, wizytator
  • piszesz testy do swojego kodu

Im wyżej masz odpowiedzi "nie znam, nie używam", tym gorzej.
W przypadku debuggera każdy musi znać to narzędzie, ale im ktoś leszy tym bardziej używa testów niż debugera.
Początkujący często nie używają, bo nie mają pojęcia o istnieniu takiego narzędzia.

1 użytkowników online, w tym zalogowanych: 0, gości: 1