Antywirus uznaje mój program za niebezpieczny - UrlDownloadToFile

0

Witam, dawno mnie tu nie było...

Mam problem gdyż antywirus (wbudowany w Win10 oraz inne zewnętrzne) wykrywa mój program jako niebezpieczny z racji tego że wykonuje polecenia programisty.

Pobieram z internetu (UrlDownloadToFile) z mojego serwera plik ini a następnie wyświetlam na formie w labelach informacje zawarte w nim. Jest to mini (ok 20 pozycji) baza danych w formie:

[temat1] 
Nazwa=aaa
Autor=bbb
Wersja=ccc
[temat2] 
Nazwa=aaa
Autor=bbb
Wersja=ccc

Jak rozwiązać ten problem aby antywirus się nie burzył? Bo w takim przypadku mało kto zdecyduje się uruchomić ten program.

0

Kilka rzeczy których możesz spróbować od razu (proszę napisz jeżeli coś działa):

  • zmien rozszerzenie pobieranego pliku z .ini na neutralne .dat
  • jeżeli plik pobierasz za pomocą wget lub curl lub powershella to antywirus ma prawo narzekać. pobierz plik za pomocą jakiejś biblioteki http i zapisz w katalogu programData a nie na C: lub w katalogu użytkownika
  • z racji tego że wykonuje polecenia programisty. - jeżeli twój program pozawala na zdalne wykonywanie komend, to ehmm... jest podejrzany i jak bym czegoś takiego nie chciał na moim kompie - za duże ryzyko
  • upewnij się że jeżeli pobierasz ze strony https to masz poprawny certyfikat, oraz że domena nie jest na jakieś liście podejrzanych stron
  • podpisz plik exe
0

Zmienię rozszerzenie i pisze czy działa.

Pobieram za pomocą urldownloadtofile

Te niby polecenia to wyświetlanie zawartości ini w labelach

Serwer to konto na https://www.000webhost.com

0

rozwiązanie:
wszystkie procedury wyświetlające automatycznie zawartość pobranych plików z onCreate formy zostały przeniesione do onClick buttona i teraz jest ok.

2

Jak będziesz pchał logikę do zdarzeń komponentów, to daleko na takim wózeczku nie zajedziesz.

0

To jak niby wywołać jakiś kod po kliknięciu buttona lub przy otwieraniu programu twoim zdaniem jak nie w zdarzeniu?

3

@greenmag po prostu logikę aplikacji trzymaj w innych klasach, a nie ma formatce. To jest kod spaghetti który bardzo ciężko się taki kod utrzymuje i rozwija. W zasadzie jest to antywzorzec projektowy. W dodatku utrudnia pisanie testów. Jednym z punktów dobrej architektury systemu jest oddzielenie logiki od warstwy prezentacji danych.

0

Ależ ja właśnie mam to oddzielone (lecz wywołanie i tak występuje ze zdarzeń).
Napisałem tylko tyle że wywołanie nie mogłem mieć z onCreate formy a z onClick przycisku.
Gdy wywołałem od razu te procedury przy starcie programu w onCreate antywirus wykrywał zagrożenie.
To była czysta nadinterpretacja użytkownika furious programming.

1
greenmag napisał(a):

Gdy wywołałem od razu te procedury przy starcie programu w onCreate […]

Nie, OnCreate to nie jest start programu. Program nie ma nic wspólnego z modułami zawierającymi kod formularza, bo jest wykonywany w głównym pliku projektu (czyli .dpr lub .lpr, w zależności którego środowiska używasz). Widząc, że najwyraźniej nie rozumiesz jak to wszystko działa, założyłem, że logikę masz wrzuconą do wygenerowanych zdarzeń. Miło, że się pomyliłem.

Logika powinna być wydzielona do osobnych modułów i przechowywana w klasach niezależnych od formularzy i od siebie nawzajem. W przypadku tworzenia programików testowych, szybciej jest wygenerować sobie zdarzenia i w nich wszystko zapisać, ale do dużych projektów takie podejście się nie nadaje i warto o tym wspomnieć, nawet jeśli nie dotyczy to konkretnie Twojego projektu.

Najciekawszym sposobem tworzenia programów okienkowych jest całkowite pozbycie się generowanych zdarzeń. To oznacza, że w module formularza jest tylko deklaracja jego klasy i nic więcej. Cała logika siedzi sobie w oddzielonych klasach, które to podłączają własne zdarzenia pod te formularza i jego komponentów.

0
furious programming napisał(a):

Najciekawszym sposobem tworzenia programów okienkowych jest całkowite pozbycie się generowanych zdarzeń. To oznacza, że w module formularza jest tylko deklaracja jego klasy i nic więcej. Cała logika siedzi sobie w oddzielonych klasach, które to podłączają własne zdarzenia pod te formularza i jego komponentów.

Bardzo ciekawe, ale niestety coś takiego mi się nigdy nie udało. Zawsze muszę pisać ręcznie te zdarzenia On.... kontrolek formularza. W sumie to nawet nie miałbym sensownego pomysłu na taki mechanizm.

0
Mr.YaHooo napisał(a):

Bardzo ciekawe, ale niestety coś takiego mi się nigdy nie udało.

Nic nie szkodzi. O ile wspomniałem, że jest to wg mnie najciekawszy sposób na tworzenie aplikacji okienkowych, to należy zaznaczyć, że sposób ten nie jest przeznaczony dla każdego projektu. Poza tym nie jest ”natywny” dla Free Pascala czy Delphi, bo całe LCL/VCL opiera się właśnie o zdarzenia znajdujące się w modułach formularzy. Dlatego całkowite odcięcie logiki od formularzy (jak pisałem w poprzednim poście), bez wyraźnej potrzeby i konkretnego pomysłu, jest bezcelowe.

W sumie to nawet nie miałbym sensownego pomysłu na taki mechanizm.

Zamiast generować zdarzenia w module formularza, tworzy się je w zewnętrznej klasie. W tych zdarzeniach wykonuje się jakąś tam logikę. Podczas tworzenia instancji formularza, przypisuje się je do odpowiednich zdarzeń odpowiednich komponentów. Wychodzi na to samo co w przypadku standardowych eventów, ale różnica polega na tym, że można wykorzystać dowolny formularz do triggerowania danych działań.

Zwykle zdarzenia formularza, oprócz wykonywania logiki, zmieniają też stan innych komponentów znajdujących się na formularzu. Np. zmiana zaznaczenia radiobuttona powoduje zablokowanie/odlokowanie innego komponentu lub ich całej grupy. Aby mieć możliwość wykonania takich działań poza modułem formularza, referencje tych komponentów muszą być również gdzieś przechowywane.

Ogólnie temat rzeka, raczej nie na ten wątek. Sam nigdy nie wykorzystałem w pełni takiego podejścia, ale wielokrotnie zastanawiałem się nad tym jak takie coś wykonać i kiedy byłoby to przydatne. A że w praktyce mi się coś takiego nigdy nie przydało, to cóż… ;)

0

Jeśli kogoś interesuje temat (a nie jak podpinać zdarzenia) to napisze jeszcze że po przejechaniu programu upx-em antywirus jest bardziej bezlitosny i znów go blokuje.
Więc ostatnio ten fakt najprawdopodobniej rówierz miał znaczenie...

0

A do czego Ci potrzebny UPX? W jakim celu kompresujesz plik wykonywalny?

0

Ten program ma być dodatkiem do programu który tłumaczę (ma wyświetlać między innymi polskie tłumaczenia wtyczek do niego) . Tłumaczony program ma max 1.5mb. Mój o którym piszemy ma rozmiar bez kompresji ok 550kb. Nie chciałem aby mały dodatek był ponad 1/3 rozmiaru właściwego programu. Po kompresji jest ok 200kb. Wiem że w dzisiejszych czasach 200 czy 500kb to bez znaczenia ale było to podyktowane właśnie tym (choć nie jest to konieczne).

2
greenmag napisał(a):

Wiem że w dzisiejszych czasach 200 czy 500kb to bez znaczenia […]

W takim razie skoro wiesz, że nie ma to znaczenia (bo nie ma, nawet najmniejszego), to nie kombinuj i nie kompresuj go. Dla głupich kilkuset kilobajtów ryzykujesz, że heurystyka w antywirusach oflaguje exeka jako zagrożenie i zamiast cokolwiek zyskać, wkurzysz tylko użytkowników i utrudnisz im życie.

2
furious programming napisał(a):
Mr.YaHooo napisał(a):

Bardzo ciekawe, ale niestety coś takiego mi się nigdy nie udało.

A mi się dziwne (nawet bardzo) wydało to co napisałeś.
Zawsze uważałem Cię za co najmniej doświadczonego programistę, a tu wychodzi na to że nie wiesz co to jest MVC.

No chyba, że masz zupełnie co innego na myśli.
Jeśli tak, to co to takiego?

Nic nie szkodzi. O ile wspomniałem, że jest to wg mnie najciekawszy sposób na tworzenie aplikacji okienkowych

Dlaczego najciekawszy?

, to należy zaznaczyć, że sposób ten nie jest przeznaczony dla każdego projektu.

Dlaczego nie dla każdego?
Podejście, jakie wtłacza nam Delphi do głów od 25 lat (czyli RAD) nadaje się co najwyżej do bardzo prostych aplikacji albo prototypów.
Tak, wiem co napisałem.
Tak, zdaję sobie sprawę, że sposobem RAD (czyli dzierga się formatki w edytorze i oprogramowuje onClicki) powstało wiele bardzo dużych aplikacji.
I tak wiem, jakie problemy za tym idą.

Poza tym nie jest ”natywny” dla Free Pascala czy Delphi, bo całe LCL/VCL opiera się właśnie o zdarzenia

Jak wszystko inne podobne rozwiązania, opierają się na zdarzeniach.
Nie zawsze to nazywa się tak samo i działa identycznie, ale co do zasady to wszystko obsługuje zdarzenia.

znajdujące się w modułach formularzy.

Tak robi IDE, kiedy się dwukliknie na zdarzeniu.
Co nie znaczy że to jakiś wymóg, a raczej przyjęta konwencja działania IDE.

Dlatego całkowite odcięcie logiki od formularzy (jak pisałem w poprzednim poście), bez wyraźnej potrzeby i konkretnego pomysłu, jest bezcelowe.

No nie.
Bezcelowe są tak autorytarne stwierdzenia ;)
A pomysł (a raczej strategia albo lepiej - architektura) potrzebny jest zawsze.

Tak czy siak, tego typu podejście jest zasadne raczej zawsze, zwłaszcza kiedy dany projekt będzie się rozwijał i należy go utrzymywać.
Im większe potrzeby w zakresie elastyczności (np. różne widoki tych samych danych dla różnych klientów naszej aplikacji), tym korzyść z separacji poszczególnych odpowiedzialności (jak we wzorcach MVC czy MVVM) kodu programu jest większa.

W sumie to nawet nie miałbym sensownego pomysłu na taki mechanizm.

Zamiast generować zdarzenia w module formularza,

Generować?
Masz na myśli to, że szablon metody obsługi zdarzenia generowany jest przez IDE po dwukliku na zdarzeniu?

tworzy się je w zewnętrznej klasie. W tych zdarzeniach wykonuje się jakąś tam logikę. Podczas tworzenia instancji formularza, przypisuje się je do odpowiednich zdarzeń odpowiednich komponentów. Wychodzi na to samo co w przypadku standardowych eventów, ale różnica polega na tym, że można wykorzystać dowolny formularz do triggerowania danych działań.

Generalnie, zgoda.
Co prawda uprościłeś to okrutnie, ale OK.

Jest tylko jeden tyci problemik w VCL/LCL (i w FMX również).
Otóż, tam metoda obsługi \darzenia może być tylko jedna. I kropka.
Co przy takich rozwiązaniach jest pierwszym problemem, który należy rozwiązać.
Zgodnie z wzorcem MVC kod obsługujący zdarzenia to Controller.
I prędzej czy później zajdzie potrzeba posiadania wielu kontrolerów dla tej samej instancji formularza, a to oznacza, że dla jednego OnClicka może być więcej niż jedna metoda, która na niego reaguje.

Można to rozwiązać dwojako; albo zapewnimy sobie mechanizm tzw. multicast events, który pozwoli na obsługę wielu metod obsługi tego samego zdarzenia, albo pójdziemy w kierunku rozwiązań, które teraz są najlepiej znane jako Flux/Redux.

Wg mnie bardzo dobrym rozwiązaniem tego problemu wydaje się wykorzystanie idei message bus, a dla Delphi mamy nawet coś niezłego, czyli DEB.

Zwykle zdarzenia formularza, oprócz wykonywania logiki, zmieniają też stan innych komponentów znajdujących się na formularzu. Np. zmiana zaznaczenia radiobuttona powoduje zablokowanie/odlokowanie innego komponentu lub ich całej grupy. Aby mieć możliwość wykonania takich działań poza modułem formularza, referencje tych komponentów muszą być również gdzieś przechowywane.

Wybacz, ale to jest masło maślane.
Jak chcesz mieć obiekt Button klasy TButton bez utworzonego obiektu klasy TButton?
Te referencje są **ZAWSZE ** dostępne.
W przypadku wyklikanego w IDE formularza, są zagregowane i dostępne publicznie w obiekcie klasy danego formularza.

Ogólnie temat rzeka, raczej nie na ten wątek.

Prawda ;)

Sam nigdy nie wykorzystałem w pełni takiego podejścia, ale wielokrotnie zastanawiałem się nad tym jak takie coś wykonać i kiedy byłoby to przydatne.
A że w praktyce mi się coś takiego nigdy nie przydało, to cóż… ;)

Od ponad 10 lat rozwijam aplikacje w ten sposób.
I faktycznie, temat jest ogromny.

Ale jakby ktoś coś chciał pokombinować i ma zacięcie, to proszę jest gotowiec znany jako MVVM Starter Kit.
Są pewne różnice pomiędzy MVC a MVVM, ale oba opierają się na tej samej idei.
Poza tym, MVVM wydaje się bardziej dopasowane do idei RAD.

0
wloochacz napisał(a):

Dlaczego najciekawszy?

Bo inny niż standardowy, inni niż ten, który zwykle widuję w lazarusowych projektach. To stricte subiektywna opinia.

Dlaczego nie dla każdego?
Podejście, jakie wtłacza nam Delphi do głów od 25 lat (czyli RAD) nadaje się co najwyżej do bardzo prostych aplikacji albo prototypów.

No właśnie — sam odpowiedziałeś na to pytanie.

Im większe potrzeby w zakresie elastyczności (np. różne widoki tych samych danych dla różnych klientów naszej aplikacji), tym korzyść z separacji poszczególnych odpowiedzialności (jak we wzorcach MVC czy MVVM) kodu programu jest większa.

Otóż to. A kiedy nie potrzeba elastyczności, to korzyść z implementacji któregokolwiek wzorca jest prawie żadna. Prawie, bo walory edukacyjne istnieją i z tego powodu warto się nad tym pochylić.

Generalnie, zgoda.
Co prawda uprościłeś to okrutnie, ale OK.

No tak, dlatego że ten wątek to nie miejsce na długie rozprawki w temacie wzorców.

Fajnie by było kiedyś stworzyć wątek poświęcony wzorcom, wrzucić na tapet jakiś niewielki projekt napisany zgodnie z danym wzorcem (np. ten podlinkowany) i podyskutować na ten temat. Choć dla mnie bardziej wartościowe od samej dyskusji, byłoby pobranie źródeł, otworzenie ich w IDE i przeanalizowanie sobie całego kodu. A potem kompilacja, uruchomienie programu i sprawdzenie pod debuggerem co i jak działa. Bo samo czytanie artykułów jakoś zawsze mnie zniechęca i powoduje mętlik w głowie. :D

0
wloochacz napisał(a):

A mi się dziwne (nawet bardzo) wydało to co napisałeś.
Zawsze uważałem Cię za co najmniej doświadczonego programistę, a tu wychodzi na to że nie wiesz co to jest MVC.
No chyba, że masz zupełnie co innego na myśli.
Jeśli tak, to co to takiego?

Może źle to doprecyzowałem. Znam ten wzorzec. Jednak ja zrozumiałem post @furious programming w ten sposób, że zdarzenia z innej klasy podpinane są niejako automatycznie podczas działania programu. Oczywiście sam oddzielam logikę od prezentacji. Jednak niestety w przypadku większej liczby kontrolek na formatce np. 20-30 trzeba ręcznie pisać dla większości kontrolek typu TEdit zdarzenia, które tylko po prostu wywołują odpowiednie zdarzenia z logiki programu. Po prostu brakuje mi wygodnego bindowania kontrolek wraz ze zdarzeniami do obiektów. Strasznie mi się to nie podoba, ale może jeszcze znajdę sensowne rozwiązanie nie wymagające pisania zdarzeń dla każdej kontrolki ręcznie.

wloochacz napisał(a):

Podejście, jakie wtłacza nam Delphi do głów od 25 lat (czyli RAD) nadaje się co najwyżej do bardzo prostych aplikacji albo prototypów.
Tak, wiem co napisałem.
Tak, zdaję sobie sprawę, że sposobem RAD (czyli dzierga się formatki w edytorze i oprogramowuje onClicki) powstało wiele bardzo dużych aplikacji.
I tak wiem, jakie problemy za tym idą.

Niedawno sam się o tym przekonałem dostając w spadku apkę na jakieś 30 okienek. Istna masakra. W wolnej chwili muszę to jakoś etapami refaktoryzować. Ale nie będzie łatwo. I dlatego uważam, że pod tym względem Delphi/C++ Builder jest szkodliwy. Nie dość, że sam nakłania do pisania kodu spaghetti, to jeszcze ciężko o sensowne materiały uczące jak tworzyć ładną architekturę szczególnie w tych językach.

wloochacz napisał(a):

Od ponad 10 lat rozwijam aplikacje w ten sposób.
I faktycznie, temat jest ogromny.

Coś tam nie raz wspominałeś i naprawdę podziwiam, za te rozwiązanie. Chociaż domyślam się, ze wymagało ono wiele czasu na takie dopracowanie i pewnie nie od razu się udało wybrać tak dobry sposób podejścia do tematu.

wloochacz napisał(a):

Ale jakby ktoś coś chciał pokombinować i ma zacięcie, to proszę jest gotowiec znany jako MVVM Starter Kit.
Są pewne różnice pomiędzy MVC a MVVM, ale oba opierają się na tej samej idei.
Poza tym, MVVM wydaje się bardziej dopasowane do idei RAD.

Warto poczytać, na pewno skorzystamy ;)

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