Zabezpieczanie programu

0

Witam!

Piszę aplikację w C# i ze względów bezpieczeństwa chciałbym pobrudzić trochę w pliku exe, żeby nie dało się zrozumieć zdekompilowanego kodu. Są do tego programy, jakieś tam 'obfuscatory', ale problem polega na tym, że chciałbym, aby mój program mógł obsługiwać wtyczki, zewnętrzne skrypty, itp. Skoro skrypt używa nazw zmiennych, klas i 'namespaców' z pliku exe, to się nie skompiluje, jeśli będę tak bruździł.

Macie pomysł, jak można zabezpieczyć tego typu program? Znacie jakieś dobre strony lub artykuły na temat zabezpieczeń ogólnie? Jak robić zabezpieczenia dla programów internetowych (tzn. jak serwer ma sprawdzić, czy aplikacja nie jest zmieniona)?

Dzięki.

0

W visual'u 2k8(we wcześniejszych może też - nie wiem) jest opcja, która pozwala zabezpieczyć(zaszyfrować) swoje dzieło, aczkolwiek nie mam pojęcia na ile to jest skuteczne.... Może powiedz co ma robić Twoja aplikacja i co chesz zabezpieczyć to łatwiej będzie pomóc...

0

Aplikacja jest dość rozbudowana :) Robię pewną gierkę, której strukturę najchętniej ukryłbym przed potencjalnym odbiorcą. Wiadomo, że to nie jakiś mega projekt, którego źródło warte jest miliony, ale jak własne, to niech nikt łap w to nie wsadza. Żeby zapewnić jakąś dowolność w edycji poziomów bez zmiany pliku exe lub ponownej instalacji z nowymi zasobami, część kodu musi (no nie musi, ale raczej lepiej żeby mogła) ładować się z osobnych plików. Chodzi m.in. o różne skrypty, itp.

Jeśli ktoś otworzy pliki lub zdekompiluje exe, dostaje cały kod z nazwami klas, funkcji i dlatego może się łatwo domyślić, co do czego służy (taki już ten .NET). To pierwsza rzecz. Natomiast druga dotyczy połączenia z serwerem. Interesuje mnie, jak są tworzone gry internetowe, w których nie da się hackować (albo mówiąc inaczej, jak ktoś hackuje, można to wykryć). Wszystkie dane ciągle zapisują na serwerze i tyle?

0

Używam 2k5 i z tego co wiem, nie ma tam opcji szyfrowania.

0

W 2k8(może już czas na zmiane?) jest i nazywa się to obfuscator o ile dobre pamiętam..... Poszukaj może w 2k5 tez jest :)

Co do poziomów: może po prostu zapisywać je w oddzielnych plikach np w folderze /levels i gra przy każdym uruchomieniu będzie sprawdzać co tam się znajduje i ładować te poziomy. Dochodzi Ci wymyślenie + zaimplementowanie jakiegoś formatu tych plikó, ale za to możesz np. później napisać edytor poziomów do gry i będziesz mógł bez problemu tworzyć nowe poziomy w dość przyjemny(chociaz to jeszcze zależy od jakości edytora :] ) sposób.

0

Z grami internetowymi jest latwo, wystarczy trzymac na serwerze md5 poszczegolnych plikow. Przy zmianie pliku zmienia sie jego skrot md5. Przy starcie wystarczy obliczyc skrot kazdego pliku, porownac z wartoscia na serwerze i po sprawie. Of coz potencjalny cracker moze zawsze 'wylaczyc' porownanie, itp.

0

up: Można np. zaimplementować kilka(naście/dziesiąt) algorytmów liczących skróty plików i przy każdym uruchomieniu używać innego(losowego) albo nawet kilku(a potem wysyłać i porównywac np. xor wynikJednego, wynikDrugiego). Jest to oczywiśie do złamania, ale cracker będzie miał x razy więcej roboty.

0

@cyriel: test uruchomienia i tak nastepuje po odebraniu wyniku sprawdzenia na serwerze, wiec mnogosc algorytmow nic nie daje.

0

Dzięki za aktywny udział w dyskusji :)

@cyriel
Edytor już mam, format mapy też obczajony z grubsza. :) Samej gry też co nieco. Z mapami robię mniej więcej tak, jak mówisz, ale wszystkie dane są spakowane w jednym pliku. Kompilowanie potrzebne mi do czegoś innego. Załóżmy, że mam 10 potworów i każdy zachowuje się inaczej. Jakoś każdemu trzeba wsadzić osobny 'mózg'. Najłatwiej zrobić to przez wywołanie skompilowanego kodu. Co prawda, da się wymyślić specjalny format sztucznej inteligencji, ale można się wykończyć :) Każda instrukcja musiałaby mieć oddzielny identyfikator i do tego parametry, to i tamto, itd. A co gdyby potworów było 150? Jeśli się chce zapewnić systemowi gry duże możliwości (bez ciągłych updatów samego systemu), to format AI musiałby być tak rozbudowany, jak C#, dlatego uciekam od tego rozwiązania. Poza tym, takie skrypty się mogą się przydać. Nie tylko do potworów.

Musiałbym chyba ręcznie pozmieniać nazwy zmiennych i funkcji (tak w sumie działa ten obfuscator), zarówno w aplikacji, jak i skryptach i zapamiętać, że jak chcę np. atak, to wywołuję funkcję __2_sd() :D

Z tym md5 ciekawa sprawa. Stuprocentowej pewności, że ktoś nie przełamie zabezpieczeń chyba nie ma, prawda?
Wydaje mi się, że jeśli wykonać wielokrotny test skrótu (tak jak mówi cyriel) w różnych miejscach gry i za każdym razem niezależnie szykować pakiety do serwera, to może mieć znaczenie. Zawsze musi być wysłana ta sama wartość.

0
croc napisał(a)

Dzięki za aktywny udział w dyskusji :)

@cyriel
Edytor już mam, format mapy też obczajony z grubsza. :) Samej gry też co nieco. Z mapami robię mniej więcej tak, jak mówisz, ale wszystkie dane są spakowane w jednym pliku. Kompilowanie potrzebne mi do czegoś innego. Załóżmy, że mam 10 potworów i każdy zachowuje się inaczej. Jakoś każdemu trzeba wsadzić osobny 'mózg'. Najłatwiej zrobić to przez wywołanie skompilowanego kodu. Co prawda, da się wymyślić specjalny format sztucznej inteligencji, ale można się wykończyć :) Każda instrukcja musiałaby mieć oddzielny identyfikator i do tego parametry, to i tamto, itd. A co gdyby potworów było 150? Jeśli się chce zapewnić systemowi gry duże możliwości (bez ciągłych updatów samego systemu), to format AI musiałby być tak rozbudowany, jak C#, dlatego uciekam od tego rozwiązania. Poza tym, takie skrypty się mogą się przydać. Nie tylko do potworów.

Musiałbym chyba ręcznie pozmieniać nazwy zmiennych i funkcji (tak w sumie działa ten obfuscator), zarówno w aplikacji, jak i skryptach i zapamiętać, że jak chcę np. atak, to wywołuję funkcję __2_sd() :D

Z tym md5 ciekawa sprawa. Stuprocentowej pewności, że ktoś nie przełamie zabezpieczeń chyba nie ma, prawda?
Wydaje mi się, że jeśli wykonać wielokrotny test skrótu (tak jak mówi cyriel) w różnych miejscach gry i za każdym razem niezależnie szykować pakiety do serwera, to może mieć znaczenie. Zawsze musi być wysłana ta sama wartość.

Sądzę, że jakbyś np. użył LUA to byś nie miał tego problemu.

0

johny_bravo: Ja <ort>myślełem </ort>o wysłaniu wyniku do serwera, wtedy to serwer by sprawdzał.

0

@cyriel: owszem, ale w efekcie to i tak lokalna aplikacja decyduje czy sie uruchomi (juz po calej procedurze ustalania poprawnosci skrotu). Wystarczy w takim razie usunac to ostatnie sprawdzenie (lub kilka ostatnich, jak sugerowal autor), zeby aplikacja ruszyla.

@autor: 100% pewnosci nigdy nie ma. Istnieje nieskonczenie mala szansa, ze brute-force zlamie za pierwszym podejsciem nawet najtwardszy klucz.

0

Stuprocentowej pewności, że ktoś nie przełamie zabezpieczeń chyba nie ma, prawda?
Nigdy. Każde zabezpieczenie można złamać i jest to tylko kwestia czasu i umiejętności.

Tworzysz gre internetową czy "stacjonarną"?

0

@Rev.pl

Pomyślę nad LUA lub czymś podobnym. Ale czy nie obniży to wydajności?

@cyriel

Wolałbym, żeby gra była internetowa, chociaż nie wiem czy dam radę, to się okaże. Na razie jest stacjonarna.

No i właśnie, jak się to robi, że np. w rpg-ach sieciowych programista może uniemożliwić nielegalne tworzenie dowolnych broni? Do tego przecież nie wystarczy md5. Serwer wszystko przelicza i kontroluje? Tak samo jeśli ktoś obrywa w internetowej strzelance i wartość obrażeń od pocisku jest losowana z pewnego przedziału, to nie może się wylosować lokalnie, inna dla każdego gracza.

0

W rpgach sieciowych info o postaci są na serwerze.

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