Elektroda.pl
Elektroda.pl
X
Proszę, dodaj wyjątek www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

[Delphi] Zabezpieczenie przed wielokrotynm wykonaniem programu.

Unrak 03 Mar 2012 14:25 2517 18
  • #1 03 Mar 2012 14:25
    Unrak
    Poziom 8  

    Witam

    Potrzebuje waszej pomocy, chciałbym napisać program do konkursu (Coś na zasadzie Informatycznego Konkursu Bóbr"). Dokładnie chodzi mi o logowanie.
    Każdy użytkownik dostanie swój login, oraz hasło. Problem w tym że każdy ma mieć możliwość jednokrotnego logowania się do programu. Myślałem nad 3 rozwiązaniami:
    1. Będzie mógł kilka razy się zalogować jednak przy każdym logowaniu dostaje maila z w którego treści jest jego login, jak stworzyć sam proces wysyłania ? Coś żeby nie użytkownik nie musiał się logować na swoją pocztę, automatycznie mail leci z programu do mnie.
    2. Stworzyć gdzieś plik, w którym zapisałbym informację że program był uruchamiany, przy kolejnych logowaniach program sprawdzałby czy taki plik istnieje, co jest w nim zapisane. Stworzenie pliku w tym samym folderze gdzie znajduję się program raczej odpada, bo będzie to zbyt łatwe do ominięcia. Czy dobrym rozwiązaniem było by stworzenie pliku gdzieś wśród plików systemowych ? Jak to zrobić dla różnych wersji systemu ?
    3. Stworzenie wpisu w rejestrze. Tutaj chyba by było najciężej. Kompletnie nie wiem jak to zrobić, jak odczytać, jak się za to zabrać ^^

    Co według was było by najlepsze i jak to zrobić ?
    Mnie najbardziej odpowiadał by sposób nr 1, ewentualnie 2.

    Z góry dziękuje za pomoc.
    Pozdrawiam Unrak

    0 18
  • Pomocny post
    #2 03 Mar 2012 21:59
    JmL(TM)
    Poziom 24  

    Poczytaj troche o aplikacjach "Client & Server" i tzw. socket'ach. Zapisywanie danych jak najbardziej mozesz zrobic w rejestrze. Przy odrobinie wysilku wszystkie przyklady i wiecej informacji bez problemu znajdziesz w sieci... :D

    0
  • Pomocny post
    #4 03 Mar 2012 23:28
    JmL(TM)
    Poziom 24  

    Dżyszla napisał:
    To ma być program na jednym komputerze, czy typowy klient-serwer?


    Wnioskujac po tym:

    Unrak napisał:
    1. Będzie mógł kilka razy się zalogować jednak przy każdym logowaniu dostaje maila z w którego treści jest jego login, jak stworzyć sam proces wysyłania ? Coś żeby nie użytkownik nie musiał się logować na swoją pocztę, automatycznie mail leci z programu do mnie.


    ...to raczej nie ;)

    Poza tym to faktycznie autor napisal to strasznie zawile i mniemam ze chodzi o kontrole ilosci uruchomien danego programu na dowolnym komputerze. Przy uruchomieniu programu, aplikacja wysyla zapytanie i otrzymuje "kod aktywacyjny" i albo sie uruchamia albo jest blokowana - czy dobrym tropem podazam?

    0
  • #5 04 Mar 2012 00:08
    Unrak
    Poziom 8  

    Dżyszla napisał:
    To ma być program na jednym komputerze, czy typowy klient-serwer?

    Ma to być program na jednym komputerze.

    JmL(TM) napisał:
    Zapisywanie danych jak najbardziej mozesz zrobic w rejestrze.

    Jakieś wskazówki gdzie tego szukać ? Ewentualnie od czego zacząć. :)

    JmL(TM) napisał:
    Poza tym to faktycznie autor napisal to strasznie zawile i mniemam ze chodzi o kontrole ilosci uruchomien danego programu na dowolnym komputerze.

    Aplikacja ma działać na jednym komputerze (każdemu uczestnikowi konkursu zostanie wysłany plik do uruchomienia). Jako że ma to działać tylko na tym danym komputerze, dane do konta planuję zapisać w kodzie programu i on będzie sobie sam sprawdzał czy takie istnieją. Jeżeli tak to przechodzi dalej (do rozwiązywania zadań), jeśli nie zamyka się.
    Żeby zapobiec wielokrotnemu wykonaniu testu przez jedną osobę, muszę to jakoś zabezpieczyć. Wymyśliłem/wyszukałem 3 sposoby, które opisałem powyżej tylko nie umiem ich wykonać.

    Da radę zrobić to sposobem pierwszym ?
    Określić jedną ścieżkę do pliku ze sposobu drugiego ?
    No ewentualnie jak zrobić wpis w rejestrze, czy mogę stworzyć tam taki wpis, który zapamięta login wpisany w aplikacji.

    0
  • Pomocny post
    #6 04 Mar 2012 01:07
    Dżyszla
    Poziom 42  

    Jeśli to ma być na jednym komputerze i jak się domyślam - wiele jego instancji, to posłuż się mutexami.

    Kod: delphi
    Zaloguj się, aby zobaczyć kod
    Proste, skuteczne. (Oczywiście - kod w DPR)

    0
  • Pomocny post
    #7 04 Mar 2012 11:40
    JmL(TM)
    Poziom 24  

    Pierwsze juz masz podane na tacy przez Dżyszla a co to tego:

    Unrak napisał:
    No ewentualnie jak zrobić wpis w rejestrze, czy mogę stworzyć tam taki wpis, który zapamięta login wpisany w aplikacji.


    Mozesz rowniez wykorzystac pliki .ini i nie koniecznie musza miec takie rozszerzenie zeby nie bylo tak "jawnie". Rowniez sa latwe w obsludze [w sumie latwiejsze niz obsluga rejestru]. W jakim jezyku chcesz to pisac?

    0
  • #9 04 Mar 2012 16:14
    Unrak
    Poziom 8  

    Dżyszla napisał:
    Jeśli to ma być na jednym komputerze i jak się domyślam - wiele jego instancji, to posłuż się mutexami.
    Kod: delphi
    Zaloguj się, aby zobaczyć kod
    Proste, skuteczne. (Oczywiście - kod w DPR)

    Z tego co wyszukałem, mutexy zapobiegają wielokrotnemu uruchomieniu aplikacji w jednym momencie. Mi chodzi o jednokrotne uruchomienie aplikacji na jednym komputerze - zawsze. Raz uruchomisz i więcej razy się nie będzie dało: nawet jak się usunie i pobierze jeszcze raz.

    JmL(TM) napisał:
    Pierwsze juz masz podane na tacy przez Dżyszla a co to tego:

    Unrak napisał:
    No ewentualnie jak zrobić wpis w rejestrze, czy mogę stworzyć tam taki wpis, który zapamięta login wpisany w aplikacji.


    Mozesz rowniez wykorzystac pliki .ini i nie koniecznie musza miec takie rozszerzenie zeby nie bylo tak "jawnie". Rowniez sa latwe w obsludze [w sumie latwiejsze niz obsluga rejestru]. W jakim jezyku chcesz to pisac?

    O dodatkowych plikach napisałem w sposobie drugim, ten sposób wydaje mi się najprostszy i na pewno sobie z nim poradzę, jednak nie wiem jak określić ścieżkę do pliku, gdzie go mogę umieścić żeby program działał u każdego i nie był gdzieś na wierzchu. ^^

    0
  • Pomocny post
    #10 04 Mar 2012 16:18
    Dżyszla
    Poziom 42  

    A, to trzeba było tak od razu!

    To jednak najlepiej ukryć informację w rejestrze systemowym. Nie będziesz miał problemów z prawami dostępu (oczywiście zakładam, że nie użyjesz żadnej zastrzeżonej gałęzi) i raczej mało osób grzebać będzie - mniej niż w przypadku "dziwnych" plików.

    0
  • #11 04 Mar 2012 18:49
    Unrak
    Poziom 8  

    Kod: delphi
    Zaloguj się, aby zobaczyć kod

    Jakbyście mogli przeczytać komentarze i powiedzieć czy dobrze rozumuje. ^^

    0
  • Pomocny post
    #12 04 Mar 2012 18:50
    dkow
    Poziom 14  

    Jedna z propozycji to użycie jakiegoś serwera bazy danych.
    Program uruchomiany na komputerze łączy się z nim i sprawdza czy może działać dalej.
    Dodatkowo zbieramy o nim wszystkie dane ip, daty, użytkownik, nazwę komputera, ile razy był uruchamiany, nadajemy uprawnienia, monitorujemy czy w tej chwili jest program włączony itd.
    Np. baza danych PostgreSQL + ZeosLib (ja to używam) lub coś innego

    0
  • #13 04 Mar 2012 20:30
    Dżyszla
    Poziom 42  

    Onrak - odpowiadając na pytania z kodu:
    1. Tak, ale tylko dla danego zalogowanego użytkownika. Lepiej użyj HKEY_LOCAL_MACHINE
    2. True odpowiada za możliwość utworzenia klucza (BTW - nie twórz tak wprost - umieść to w SOFTWARE)
    3. To tworzy String, czyli ciąg tekstowy. Od DWord jest WriteInteger
    4. Nie, będzie błąd. Nie możesz odczytać wartości tekstowej jak liczbowej.
    5. Zapomniałeś jeszcze o eleganckim CloseKey.

    Oczywiście takie rozwiązanie zabezpiecza tylko jeden komputer. Jeśli chcesz mieć niezależnie od komputera, to musisz uciec się w takie rozwiązanie, jak kolega wyżej napisał.

    0
  • #14 04 Mar 2012 22:30
    Unrak
    Poziom 8  

    Cytat:
    (BTW - nie twórz tak wprost - umieść to w SOFTWARE)

    Jak to tam umieścić ? ^^

    Kod: delphi
    Zaloguj się, aby zobaczyć kod


    Ewentualnie mógłby mi ktoś taki przykład na szybko zrobić. Jak naciśnie się przycisk to sprawdza czy istnieje klucz/ciąg jeśli tak to wywala wiadomość "Klucz istnieje", jeśli nie tworzy go w "HKEY_CURRENT_USER/Software/Konkurs" z wartością "1". - To już dam radę przerobić na własne potrzeby. ^^

    Cytat:
    Jedna z propozycji to użycie jakiegoś serwera bazy danych.

    Podejrzewam że przydało by mi się coś o tym wiedzieć. Nie umiem dobrze zrobić wpisu do rejestru, a mam się połączyć z bezą danych ?

    0
  • #15 04 Mar 2012 22:36
    Dżyszla
    Poziom 42  

    Jak to jak ? Tak samo jak strukturę katalogów! SOFTWARE\Konkurs

    HKEY_CURRENT_USER to wycinek z HKEY_USERS (podobnie jak HKEY_CLASSES to wynicek z HKEY_LOKAL_MACHINE\Classes).

    Wszystko, czego potrzebuje to ValueExists do sprawdzenia istnienia wartości i ReadString do odczytania.

    0
  • Pomocny post
    #16 04 Mar 2012 23:05
    JmL(TM)
    Poziom 24  

    Dżyszla napisał:
    JmL - wg mnie, to czy rejestr czy INI to obsługa jest tak samo łatwa, a klasy obsługujące w dużej części wręcz wymienne :) Ale to tylko taka dygresja.


    I tu sie wcale nie zgodze... Moze w Delphi nie ma roznicy [Delphi to i tak jedna wielka sieczka w kodzie] ale bazujac na czystym WinAPI - asm/c++ wiecej zabawy jest z obsuga rejestru niz obsluga pikow .ini. Do odczytu wartosci z pliku .ini wystarczy wywolanie jednej funkcji [Kernel32.dll] a zeby zrobic to samo z rejestrem [Advapi32.dll] najpierw trzeba: otworzyc, odczytac wartosc, zamknac czyli w sumie tak jak z obsluga pliku co jest rowne z dodatkowa zabawa w kodzie ;)

    Prosty przyklad odczytu z pliku .ini:

    Kod: cpp
    Zaloguj się, aby zobaczyć kod


    A tak w ogole wracajac to tematu to chyba najprosciej byloby zapisywac zmiany w jakims pliku np. .dll'ce czy .exe'ku i dolaczyc/zmienic jeden bajt np. na koncu takiego pliku wpisujac tam okreslona wartosc i program po uruchomieniu bedzie sprawdzal rozmiar pliku i ta wartosc. Zmiany w rejestrze jest latwo "wytropic" i usunac/zmienic wartosc a tym samym obejsc zabezpieczenie...

    0
  • #17 04 Mar 2012 23:57
    Unrak
    Poziom 8  

    Kod: delphi
    Zaloguj się, aby zobaczyć kod


    Pytanie w komentarzu ^^

    0
  • #18 05 Mar 2012 07:25
    Dżyszla
    Poziom 42  

    @JmL - ale autor chciał, aby przeinstalowanie programu też nic nie dało :) Chyba, że zakładasz podrzucenie fałszywego pliku do jakiegoś Windows\System :)

    @Autor:
    1. =true? Masło maślane :P Zupełnie zbędne :)
    2. No ale generalnie to właśnie tak, jak zrobiłeś. Z jedną różnicą - nie określa się głównej gałęzi w ten sposób! Tak samo Masz ustawić RootKey i wszelkie odwołania odnoszą się do tej gałęzi już.
    3. Nie zwalniasz X.

    0
  • #19 05 Mar 2012 23:26
    JmL(TM)
    Poziom 24  

    Dżyszla napisał:
    @JmL - ale autor chciał, aby przeinstalowanie programu też nic nie dało :) Chyba, że zakładasz podrzucenie fałszywego pliku do jakiegoś Windows\System :)


    Tak, wiem bardzo dobrze co mial na mysli autor i ja wlasnie w odniesieniu do tego pisalem... Nie chodzi mi o modyfikacje "wlasnego" pliku wykonywalnego [.exe] i nie jest konieczne podrzucanie/kopiowanie czegos do systemowych plikow. Mialem na mysli modyfikacje istniejacych plikow. Co prawda np. od XP w gore systemy sprawdzaja pliki i w razie wiekszych zmian zaraz je przywroca ale np. zrobilem maly test z kalkulatorem pod XP i bez problemu mozna zmienic 1 bajt i system pozostawi plik "w spokoju". Przyklad ponizej:

    [Delphi] Zabezpieczenie przed wielokrotynm wykonaniem programu.

    Wybralem "wolne" miejsce troche za naglowkiem pliku .exe i jest to offset [0x035F] naprawde przypadkowy [chodzilo tylko o test] ale mozna jakis plik wziac pod lupe np. w Win32dasm czy IDA i wybrac bardziej rozsadne miejsce gdzie mozna w pliku zapisac swoje dane... wiec nawet po usunieciu i ponownym zainstalowaniu naszego programu juz sie on nie uruchomi gdyz plik z naszymi danymi pozostanie na stale na danym komputerze i jest to na pewno trudniejsze do "wytropienia" niz zwykly wpis w rejestrze. Choc generalnie tego typu zabezpieczenia i tak mozna latwo ominac patch'ujac skoki np. z asm JNE na asm JE i po zabezpieczeniu :twisted:

    0