Skocz do zawartości
  • 👋 Witaj na MPCForum!

    Przeglądasz forum jako gość, co oznacza, że wiele świetnych funkcji jest jeszcze przed Tobą! 😎

    • Pełny dostęp do działów i ukrytych treści
    • Możliwość pisania i odpowiadania w tematach
    • System prywatnych wiadomości
    • Zbieranie reputacji i rozwijanie swojego profilu
    • Członkostwo w jednej z największych społeczności graczy

    👉 Dołączenie zajmie Ci mniej niż minutę – a zyskasz znacznie więcej!

    Zarejestruj się teraz

Zabezpieczenie aplikacji


Rekomendowane odpowiedzi

Opublikowano

Witam. Chciałbym się dowiedzieć a zarazem nauczyć jak mogę zabezpieczyć jakiś program tak aby każdy użytkownik tworzył swoje konto i np. kupował jakieś rzeczy na te konto (za prawdziwe pieniądze, coś w postaci premium lub upoważnienia do korzystania z programu). Próbowałem to robić przez PHP i MYSQL ale nie bardzo to wychodziło bo komunikację aplikacji c# z php można było łatwo przechwycić i zmienić odpowiednio tak aby korzystać za darmo. Może istnieje jakiś poradnik/ tutorial jak takie coś wykonać? Jeżeli nie przez PHP i MYSQL to w jaki inny ciężki sposób do złamania dla zwykłego usera?

 

Trochę pomyślałem i wcale c# nie musi wysyłać żadnych informacji na stronie tylko wystarczy aby sprawdzał. Przykładowo po kupieniu czegoś na stronie panelu użytkownika zmienia się napis na PREMIUM, aplikacja w c# sprawdza czy rzeczywiście się zmienił, jeżeli tak to ma przywileje, jeżeli nie to dalej jest to samo. Tylko nie mogę wymyślić jak zrobić aby aplikacja c# sprawdzała czy użytkownik rzeczywiście jest w bazie danych. Może wystarczy wtedy zwykła próba zalogowania aplikacji do panelu z podanymi danymi i jeżeli aplikacja wykryje panel lub coś co nie jest dostępne dla niezalogowane użytkownika to wtedy zaloguje pomyślnie. Przejdzie taki tok myślenia?

Jedyny działający bot do Gladiatusa 2015!!!

https://www.facebook.com/Gbot.vertek

Opublikowano

Sprawdzaj na zasadzie sesji + id użytkownika + szyfrowanie, dobre jest md5.

Przyda się także dobry obfuscator, gdybyś chciał do C# to pisz pw mam na sprzedanie(gdybyś chciał).

Sprawdzaj także czy użytkownik nie łączy się przez proxy, pobieraj nie tylko id dysku ale także dane systemowe i id procesora.

 

 

MD5:

 

 

        public static string CryptMd5(string password)
        {
            System.Security.Cryptography.MD5CryptoServiceProvider x = new System.Security.Cryptography.MD5CryptoServiceProvider();
            byte[] bs = System.Text.Encoding.UTF8.GetBytes(password);
            bs = x.ComputeHash(bs);
            System.Text.StringBuilder s = new System.Text.StringBuilder();
            foreach (byte b in bs)
            {
                s.Append(b.ToString("x2").ToLower());
            }
            password = s.ToString();
 
            return password;
 
        }
Opublikowano

Łączenie z mysql robisz przez php - Czyli tutaj już możesz bezpiecznie przesyłać dane z bazy do skryptu

Odpowiednie zakodowanie/zaszyfrowane (nie wiem jak to można profesjonalnie nazwać) pozwala przesyłać dane między skryptem a aplikacją.

Później możesz użyć np. confusera do zabezpieczenia aplikacji

Przykłady:

http://pl.wikipedia.org/wiki/Szyfr#Rodzaje_algorytm.C3.B3w_szyfruj.C4.85cych_z_kluczem
http://pl.wikipedia.org/wiki/Kryptografia_asymetryczna

Tylko nie wiem czy php jest w stanie odszyfrować to.. xD

Nie wiem czy to by działało, ale raczej tak :)

 

@Arkeus

Prostszy sposób bez kupowania w aplikacji xD

Opublikowano

Confuscer jest niczym, DE4. odpakuje wszystkie obfuscatory na rynku.

 

Własnie o to mi chodziło, że musi zrobić bazę czysto na php a dopiero z poziomu php komunikować się z apilkacją.

Opublikowano

Confuscer jest niczym, DE4. odpakuje wszystkie obfuscatory na rynku.

 

Własnie o to mi chodziło, że musi zrobić bazę czysto na php a dopiero z poziomu php komunikować się z apilkacją.

de4dot nie obsługuje confusera :<
Opublikowano

Właśnie bo prościej mi będzie zrobić wszystkie zakupy na stronie, nie z aplikacji. Bo jeżeli zakupy będą na stronie a w aplikacji tylko sprawdzanie danych i tego czy zakupy były zrobione to nie potrzebuje żadnego kodowania i innych rzeczy, tak?

 

Do zabezpieczenia aplikacji, tzn. kodu przed próbą dekompilacji (czy jak to się nazywa) mam jakiś net4reactor czy coś innego, przy próbie dekompilacji programu kod jest widoczny ale jest dość znacząco zmieniony i niemożliwy do przeczytania w pełni.

 

Powiedzcie tylko czy mój pomysł, który napisałem w pierwszym poście podziałałby i na jak długo, ewentualnie jakie problemy mogą mnie spotkać bo poza sprzedażą premium do aplikacji raczej nic nie będzie czyli tylko zrobiłbym komunikacją httpwebrequestem lub webbrowserem do sprawdzenia poprawności wprowadzonych danych i statusu premiowanego konta. Wszystko odbywałoby się na stronie a aplikacja miałaby za zadanie tylko sprawdzać, nic nie będzie tworzyć ani wysyłać do bazy czy na stronę.

 

Pytam bo chciałbym coś takiego zrobić, spróbować i w ogóle zobaczyć jak to wyjdzie, jak z zaawansowaniem czegoś takiego i jak to będzie wyglądać xD.

Jedyny działający bot do Gladiatusa 2015!!!

https://www.facebook.com/Gbot.vertek

Opublikowano
de4dot nie obsługuje confusera :< 

 

 

Przecież de4dot source jest dostępne, na torgu bodajże ktoś już dopisywał funkcje min. na confuscera..

Opublikowano

Właśnie zrobiłem wersje testową, która jest możliwa tylko raz do użycia ale jak wiadomo ludzie będą tworzyć nowe konta i dawać czadu na wersji testowej. Jeżeli pobiorę adres IP to łatwo będzie im go zmienić i znów dawać czadu. Co i jak mogę pobrać takiego unikalnego z komputera, że jedynie format może to zmienić? nie zwykłe resety kompa czy inne rzeczy.

 

Z góry dzięki

Jedyny działający bot do Gladiatusa 2015!!!

https://www.facebook.com/Gbot.vertek

Opublikowano

Ale mówiłeś zrobić to w c#. A ja chcę w php pobierać te dane i przesyłać do bazy danych, nie chce w żaden sposób łączyć aplikacji z php bo później będę miał problemów więcej niż się spodziewam :D. Z tego co czytam to nie da się w PHP pobrać hardware id ani żadnych innych unikalnych rzeczy komputera, trzeba zrobić jakieś bezpieczne wysyłanie informacji z aplikacji do php i do bazy danych ale tego to nie potrafię zrobić.

 

@Edit

 

Może zrobić coś takiego, że aplikacja zapamięta pierwsze logowanie a dokładnie login i nie pozwoli zalogować się na inne konto dopóki nie minie dzień lub coś innego. Przejdzie coś takiego?

Jedyny działający bot do Gladiatusa 2015!!!

https://www.facebook.com/Gbot.vertek

Opublikowano

Nie kombinuj, informacje systemowe pobiera się z poziomu aplikacji desktopowych, na php średnio da radę.

Opublikowano

@Vertek

@Arkeus

 

Witam. Chciałbym się dowiedzieć a zarazem nauczyć jak mogę zabezpieczyć jakiś program tak aby każdy użytkownik tworzył swoje konto i np. kupował jakieś rzeczy na te konto (za prawdziwe pieniądze, coś w postaci premium lub upoważnienia do korzystania z programu). Próbowałem to robić przez PHP i MYSQL ale nie bardzo to wychodziło bo komunikację aplikacji c# z php można było łatwo przechwycić i zmienić odpowiednio tak aby korzystać za darmo. Może istnieje jakiś poradnik/ tutorial jak takie coś wykonać? Jeżeli nie przez PHP i MYSQL to w jaki inny ciężki sposób do złamania dla zwykłego usera?

 

Komunikacja MySQL - PHP - C# wcale nie jest zła, ważne aby to odpowiednio zabezpieczyć.

 

Najważniejsze jest to aby zabezpieczyć się przed atakami SQL injection - są łatwe do wykonania, pozwalają zmieniać wszystkie wartości w bazie danych (nawet ją usunąć), ale tak samo łatwo jest się przed tym zabezpieczyć, choć myślę, że to już zrobiłeś, ponieważ jest to jedna z podstaw przy pisaniu takiej aplikacji.
Podobnie ważne jest szyfrowanie wysyłanych danych od PHP <-> C# np. algorytmem AES, używając kluczy o długości 256 bitów.
http://pl.wikipedia.org/wiki/Advanced_Encryption_Standard

Od strony samej aplikacji/gry najważniejsze jest zabezpieczenie przed modyfikacją pamięci (użytkownicy z reguły do tego używają programu Cheat Engine).

Zapoznaj się na jakiej zasadzie działa przykładowo program PunkBuster:

http://pl.wikipedia.org/wiki/PunkBuster

 

Trochę pomyślałem i wcale c# nie musi wysyłać żadnych informacji na stronie tylko wystarczy aby sprawdzał. Przykładowo po kupieniu czegoś na stronie panelu użytkownika zmienia się napis na PREMIUM, aplikacja w c# sprawdza czy rzeczywiście się zmienił, jeżeli tak to ma przywileje, jeżeli nie to dalej jest to samo. Tylko nie mogę wymyślić jak zrobić aby aplikacja c# sprawdzała czy użytkownik rzeczywiście jest w bazie danych. Może wystarczy wtedy zwykła próba zalogowania aplikacji do panelu z podanymi danymi i jeżeli aplikacja wykryje panel lub coś co nie jest dostępne dla niezalogowane użytkownika to wtedy zaloguje pomyślnie. Przejdzie taki tok myślenia?

 

Mógłby przejść, jakbyś jeszcze to dopracował, ale jest to znacznie gorszy i łatwiejszy do obejścia sposób. Poza tym tak jak wyżej, trzeba to odpowiednio zabezpieczyć.
 
Ok, da się zrobić, żeby po przelaniu pieniędzy/wysłaniu SMS'a pojawiał się napis Premium (wystarczy API jakiegoś serwisu obsługującego płatności + np. PHP i C#). Ale jak zrobisz, żeby po wyłączeniu i ponownym włączeniu tej aplikacji/gry był dalej napis Premium? Zapisywanie, czy użytkownik jest Premium w rejestrze/w pliku to zły pomysł i jest to bardzo duży błąd, a sam napisałeś, że dodatkowo chciałbyś się łączyć z bazą danych i to sprawdzać, więc w zasadzie to jest to samo co wyżej, tylko z gorszymi zabezpieczeniami (wystarczyło by np. zablokować dostęp do internetu dla tej aplikacji, jeśli już byś sobie np. "pożyczył" plik przechowujący to, że jesteś Premium od kolegi + obejść jakoś logowanie), dodatkowo jest to niepotrzebne obciążanie komputera. Twój pierwszy pomysł był znacznie lepszy.
 
 
PS. Nie zapomnij pod koniec zaciemnić kodu / zaszyfrować go, bo inaczej Twoje zabezpieczenia będzie można łatwo obejść. (zapoznaj się np. z programem .NET Reflector to zobaczysz, co miałem na myśli)
PS2. Tak z ciekawości: piszesz program/grę? Visual Studio / Unity / Ogre / notatnik, czy jeszcze coś innego?
 

 

Sprawdzaj na zasadzie sesji + id użytkownika + szyfrowanie, dobre jest md5.

Przyda się także dobry obfuscator, gdybyś chciał do C# to pisz pw mam na sprzedanie(gdybyś chciał).

Sprawdzaj także czy użytkownik nie łączy się przez proxy, pobieraj nie tylko id dysku ale także dane systemowe i id procesora.

 

 

MD5:

 

 

        public static string CryptMd5(string password)
        {
            System.Security.Cryptography.MD5CryptoServiceProvider x = new System.Security.Cryptography.MD5CryptoServiceProvider();
            byte[] bs = System.Text.Encoding.UTF8.GetBytes(password);
            bs = x.ComputeHash(bs);
            System.Text.StringBuilder s = new System.Text.StringBuilder();
            foreach (byte b in bs)
            {
                s.Append(b.ToString("x2").ToLower());
            }
            password = s.ToString();
 
            return password;
 
        }

 

 

MD5 obecnie nie jest bezpiecznym algorytmem (nawet na Wikipedii jest napisane, że stosowanie go w nowych rozwiązaniach nie jest zalecane). Jest bardzo szybki, ale także łatwy do złamania i wygenerowane hash'e są dość krótkie. Do hashowania haseł poleciłbym SHA-2 (512) lub SHA-3 (512). Natomiast do szyfrowania, tak jak napisałem wyżej, chyba obecnie najlepiej stosować AES (256).

 

Właśnie bo prościej mi będzie zrobić wszystkie zakupy na stronie, nie z aplikacji. Bo jeżeli zakupy będą na stronie a w aplikacji tylko sprawdzanie danych i tego czy zakupy były zrobione to nie potrzebuje żadnego kodowania i innych rzeczy, tak?

 

Do zabezpieczenia aplikacji, tzn. kodu przed próbą dekompilacji (czy jak to się nazywa) mam jakiś net4reactor czy coś innego, przy próbie dekompilacji programu kod jest widoczny ale jest dość znacząco zmieniony i niemożliwy do przeczytania w pełni.

 

Powiedzcie tylko czy mój pomysł, który napisałem w pierwszym poście podziałałby i na jak długo, ewentualnie jakie problemy mogą mnie spotkać bo poza sprzedażą premium do aplikacji raczej nic nie będzie czyli tylko zrobiłbym komunikacją httpwebrequestem lub webbrowserem do sprawdzenia poprawności wprowadzonych danych i statusu premiowanego konta. Wszystko odbywałoby się na stronie a aplikacja miałaby za zadanie tylko sprawdzać, nic nie będzie tworzyć ani wysyłać do bazy czy na stronę.

 

Pytam bo chciałbym coś takiego zrobić, spróbować i w ogóle zobaczyć jak to wyjdzie, jak z zaawansowaniem czegoś takiego i jak to będzie wyglądać  xD.

 
Jeśli nie zależy Ci na bezpieczeństwie w aplikacji i zabezpieczeniu komunikacji, to nie, nie potrzebujesz. Będzie trochę prościej, jeśli zakupy będą na stronie, ale nadal zabezpieczenia są potrzebne. Poza tym kodowanie, hashowanie a szyfrowanie to 3 zupełnie inne terminy, więc staraj się tego nie mylić. Ten net4reactor nie zabezpiecza kodu, tylko go zaciemnia.
http://pl.wikipedia.org/wiki/Zaciemnianie_kodu
 

Już mówiłem, hardware id + id procesora + informacje systemowe

Nie kombinuj, informacje systemowe pobiera się z poziomu aplikacji desktopowych, na php średnio da radę.

 

W samym PHP nie da rady.

3657428369.png
Opublikowano

Myślę, że przed SQL injection jestem zabezpieczony. Mam tylko problem ze zrozumieniem tego szyfrowania AES i sposobu jak go przenieść do c#. Moglibyście mi przedstawić jakiś przykład użycia tego? W jedną i w drugą stronę.

 

Nie wiem też jak ma wyglądać komunikacja między aplikacją a stroną (C# > PHP). Wcześniej robiłem to w postaci wczytywania odpowiednich linków ale to jest strasznie łatwe do złamania, innego pomysłu dotyczącego wymiany danych między aplikacją a stroną nie mam. Mógłby ktoś podpowiedzieć też jak to zrobić? Łączyć się aplikacją bezpośrednio z bazą to też nie bardzo bo musiałbym w aplikacje wprowadzić dane do bazy a wtedy łatwo byłoby wyciągnąć te dane do bazy.

 

Odnośnie zaciemniania kodu to mam ten .NET Reactor. Zaciemnienie kodu to już jest jakieś zabezpieczenie bo byle jaki użytkownik już wiele nie zrobi, gorzej jak trafi się jakiś doświadczony gracz.

 

Piszę program, chcę opanować do perfekcji wszelką BEZPIECZNĄ komunikację między stroną/bazą a aplikacją.

Jedyny działający bot do Gladiatusa 2015!!!

https://www.facebook.com/Gbot.vertek

Opublikowano

Po stronie serwera postaw sobie dowolny proces który będzie nasłuchiwał na określonym porcie, klient niech się łączy w ten sposób z serwerem. Komunikację zabezpiecz szyfrowaniem AES a sam klucz przeslij zaszyfrowany w RSA. Możesz tez poczytać sobie o innych sposobach szyfrowania, np o protokole Diffiego-Hellmana do negocjacji klucza itp.
Cały dowcip z takimi sprawami 'premium' polega na tym, żeby nie robiła tego aplikacja kliencka. Jeśli user posiadający premium ma dostać jakąś dodatkową zawartość, tabelkę, wykres, funkcje w grze... cokolwiek, to taka zawartość powinna być generowana server-side. Wtedy użycie technologii reverse engineeringu nic użytkownikowi nie da. Po zalogowaniu do aplikacji, aplikacja może odpytać serwer o to, czy premium jest aktywne i w zależności od tego np dodać kilka opcji do menu, włączyć dodatkowe buttony itp, ale kliknięcie tych buttonow lub wybranie opcji menu spowodują tylko i wyłącznie wysłanie żądania na serwer, tam nastąpi ponowna weryfikacja premium i ewentualne odesłanie danych.

 

Niestety, nikt ci tu nie poda gotowego kodu, co najwyżej dostaniesz lepsze lub gorsze koncepcje.

Powyższy sposób obsługi żądań gracza działa z powodzeniem od prawie 2 lat w mojej grze. Przyjąłem koncepcje cienkiego klienta, czyli każdy klik w opcję, ikonę, mapę itp powoduje wygenerowanie requesta do serwera a tam podejmowana jest odpowiednia akcja, przeważnie jest to związane z wygenerowaniem jakiejś odpowiedzi do gracza (okno dialogowe, konkretna akcja w grze, zmiana stanu klienta gry). Dzięki temu nie muszę się w ogóle martwic o zabezpieczanie klienta przed narzędziami do hackowania, bo to tak, jak bys chciał zhackować link na stronie internetowej w swojej przeglądarce - podmienisz parametr na inny, ale dobrze zabezpieczony serwer go odrzuci.

pasek_4oo_6o.jpg

Aktualny poziom zła: 75 punktów ostrzeżeń.
Achievements:
  • 22 zajebiste posty oznaczone czerwonym kółeczkiem
  • 1 urażony modek - dwa razy! (Istny Diabeł)
  • 4365 userów forum, którym powiedziałem smutną prawdę
Opublikowano

Przy cienkim kliencie ten problem nie istnieje - co z tego, że ominiesz logowanie, skoro w tym momencie serwer nie rozpozna użytkownika i tym samym nie wygeneruje dla niego właściwych akcji?

 

Logowanie w takich systemach polega na nawiązaniu połączenia socketowego oraz przesłaniu danych (user/hasło). Po stronie serwera do socketa podłącza się wtedy obiekt reprezentujący usera i zawierający jego wszystkie dane, z uprawnieniami i stanem premium włącznie. Dobrze napisany serwer (powtarzam: dobrze napisany) dopóki nie otrzyma danych o użytkowniku nie będzie reagował na żaden inny request otrzymany z danego socketa.

pasek_4oo_6o.jpg

Aktualny poziom zła: 75 punktów ostrzeżeń.
Achievements:
  • 22 zajebiste posty oznaczone czerwonym kółeczkiem
  • 1 urażony modek - dwa razy! (Istny Diabeł)
  • 4365 userów forum, którym powiedziałem smutną prawdę
  • 1 miesiąc temu...
Opublikowano

Tylko zrozum że każda aplikacja która jest pisana w językach .NET da się zobaczyć ich src wiec ziomek może mieć twój cały program i usunąć z niego logowanie lub sfałszować pakiet wysyłany do strony.

Opublikowano

Musisz najpierw odpakować aplikację, po ch** odkopałeś temat skoro dyskusja jest zamknięta a Twój wywód był poruszany wcześniej i to nie przez jedną osobę ?

Opublikowano

Przy cienkim kliencie ten problem nie istnieje - co z tego, że ominiesz logowanie, skoro w tym momencie serwer nie rozpozna użytkownika i tym samym nie wygeneruje dla niego właściwych akcji?

Co za problem kupić premium(trial, cokolwiek) i zabawić się w spoofing?

 

I pierw trzeba zadać sobie jedno ważne pytanie: "Opłaca mi się zabezpieczyć te wypociny?"

 

@edit, dopiero teraz zobaczyłem date O_o Sorry.

Nie pomagam na PW, od tego macie forum!!!

 

#PHP-things

 

 

08FMpDu.png

 

Opublikowano

Ok, złota łopata poszła juz do kogos innego, wiec nawijamy dalej.

 

Co miał by taki spoofing dać? Musiał byś sie podszyć na poziomie protokołu tcp/ip pod innego klienta, ktory jest w danym momencie zalogowany. Jesli po stronie serwera uzytkownik (obiekt reprezentujacy usera, zawierajacy info o uprawnieniach itp) jest powiązany 1-1 z socketem, na którym się połączył (i przez który wysłał wcześniej swój login/hasło) to mamy rozpoznawanie uprawnien per konkretne połaczenie. Atakujacy musiał by się bawić w man-in-the-middle, które oczywiście było by utrudnione przez fakt szyfrowania danych, de facto musiał by się wpiąć w taka transmisje już na samym początku.

 

Ja wiem, jest to do zrobienia, da się. Są ludzie, którzy to umieją. Ale gra sieciowa lub programik, gdzie premium kupuje się za 5zł to nie jest odpowiedni target na takie ataki. Zabezpieczenie, które opisałem i które stosuje w swojej grze jest bardzo bardzo bardzo na wyrost. Istnieje tylko dla tego, że po prostu chciałem się pobawić. A opisuje je, ponieważ jest dobrym przykładem rozwiązania problemu.

W każdym razie, jesli premium ma dać coś konkretnemu uzytkownikowi to wpięcie się z atakiem na konto (i premium) ofiary spowoduje, ze atakujacy uzyje funkcji premium... w kontekście konta ofiary! czyli np wymieni walutę premium na feature, które zostanie przypsane do konta ofiary. Jak? Request od klienta (pod ktorego podszywa się atakujący), serwer wykona polecenie myśląc, że pochodzi ono od ofiary, uzyje obiektu przypisanego do socketa (ofiara), wszelkie akcje ida na konto ofiary, mamy dosłownie relacje 1-1 pomiedzy socketem i id_gracza. Dotyczy to wszystkiego, w szczególnosci zapisów do bazy. Oczywiscie soft po stronie serwera musi byc odpowiednio napisany ;)

pasek_4oo_6o.jpg

Aktualny poziom zła: 75 punktów ostrzeżeń.
Achievements:
  • 22 zajebiste posty oznaczone czerwonym kółeczkiem
  • 1 urażony modek - dwa razy! (Istny Diabeł)
  • 4365 userów forum, którym powiedziałem smutną prawdę
Opublikowano

Szyfrowanie? Chyba jedno z najłatwiejszych do złamania zabezpieczeń, wystarczy analiza call stack'a z funkcji winsock'a.

A potem? Serwer który:

A) Emuluję oryginał

B ) Odsyła na sztywno zapisane pakiety. Ten sposób nie zadziała z grami MMO, ale to chyba logiczne(??).

 

No i jedna najważniejsza zasada: Wszystkie zabezpieczenia da się złamać, są tylko takie których się nie opłaca.

Nie pomagam na PW, od tego macie forum!!!

 

#PHP-things

 

 

08FMpDu.png

 

Zarchiwizowany

Ten temat przebywa obecnie w archiwum. Dodawanie nowych odpowiedzi zostało zablokowane.

×
×
  • Dodaj nową pozycję...