jak zrobić silnik antywirusowy

wysyłanie

ocena użytkowników 4.54 (13 głosów)

wprowadzenie

podczas roamingu po forach technicznych często widzę, że niektórzy ludzie (i wielu nie bardzo doświadczonych) pytają o „jak zrobić program antywirusowy”, czasami z niezbyt dostosowanymi językami (bat, PHP, …) i mają błędne wyobrażenie o tym, czym jest program antywirusowy i jak powinien być zbudowany.

widziałem też wiele „oprogramowania antywirusowego” stworzonego przez dzieci, z bardzo nielicznymi jeszcze w szkole ludźmi i około 4 godzin dziennie kodowania przez kilka tygodni. I 'm not telling kiddies are not skilled, but I’ m telling building an antivirus engine needs or lot of wykwalifikowanych ludzi z pełnym etacie pracy plus dużo czasu na wydanie przyzwoitego oprogramowania lub dużo pieniędzy, aby zapłacić im 🙂 (w przypadku, gdy nie są wolontariuszami).

omówię tutaj wytyczne dotyczące podstawowego kodowania antywirusowego, Dla Windows i w C / C++. Można znaleźć tutaj wskazówki do projektowania silnika antywirusowego lub po prostu dowiedzieć się, jak większość z nich jest zbudowana.

Ochrona

aby uzyskać dobrą ochronę, program antywirusowy musi mieć co najmniej jeden sterownik, aby móc uruchamiać kod w jądrze i ogólnie mieć dostęp do interfejsów API jądra. Począwszy od Visty, Microsoft zrozumiał, że przemysł antywirusowy potrzebuje kluczy do wejścia do jądra i aktywacji filtrów w strategicznych miejscach, takich jak system plików, rejestr i sieć. Nie zdziw się, jeśli budowanie antywirusa dla Systemów Pre-Vista może być prawdziwym bólem, ponieważ nie został zaprojektowany do tego.

  • jednak w systemach Pre-Vista firmy antywirusowe używały funkcji podobnych do rootkitów, aby chronić drzwi (nawet jeśli nie było to zalecane przez Microsoft) i chronić system. Używali tego, co nazywamy „Hookami” (objazdy API w celu filtrowania).
  • w systemie Vista+ Microsoft udostępnił interfejsy API do wstawiania sterownika niskiego poziomu pomiędzy wywołaniami userland a interfejsami API jądra. W ten sposób łatwo jest zarejestrować produkt antywirusowy do jądra. Więcej, tego rodzaju system oparty na rejestracji pozwala nam wysyłać nasze bezpieczeństwo systemu na warstwy, gdzie kilka produktów o różnych celach może współżyć. Nie było tak w przypadku hooków, ponieważ ich implementacja była całkowicie zależna od produktu.

Uwaga: Nie będę opisywał obejść z hookami dla Systemów Pre-Vista, ponieważ jest to łatwe do znalezienia w Internecie, i ponieważ potrzebuje cały rozdział, aby wyjaśnić, jak zaczepić, gdzie zaczepić i tak … ale musisz wiedzieć, że to ten sam pomysł niż API jądra, z wyjątkiem tego, że musisz zaimplementować sobie to, co Microsoft dostarczył na systemach Vista+.

aby dowiedzieć się więcej o sterownikach kodowania, możesz sprawdzić, czy przydatne linki:
http://msdn.microsoft.com/en-us/library/windows/hardware/gg490655.aspx
http://www.codeproject.com/Articles/9504/Driver-Development-Part-1-Introduction-to-Drivers

aby dowiedzieć się więcej o hookach, możesz sprawdzić ten podstawowy przykład:
http://www.unknowncheats.me/forum/c-and-c/59147-writing-drivers-perform-kernel-level-ssdt-hooking.html

proces

pierwszą rzeczą, przed którą należy chronić użytkownika, jest uruchomienie złośliwych procesów. To jest podstawowa rzecz. Program antywirusowy powinien zarejestrować wywołanie zwrotne pssetcreateprocessnotifyroutinex. W ten sposób, przy każdym tworzeniu procesu, a zanim główny wątek zacznie działać (i spowoduje złośliwe rzeczy), antywirusowe wywołanie zwrotne jest powiadamiane i otrzymuje wszystkie niezbędne informacje.

otrzymuje nazwę procesu, obiekt pliku, PID i tak dalej. Ponieważ Proces jest w toku, sterownik może powiedzieć swojej usłudze, aby analizowała pamięć procesu pod kątem złośliwych informacji. Jeśli coś znajdzie, sterownik po prostu ustawi CreationStatus na FALSE i powróci.

NTSTATUS PsSetCreateProcessNotifyRoutineEx( _In_ PCREATE_PROCESS_NOTIFY_ROUTINE_EX NotifyRoutine, _In_ BOOLEAN Remove);
VOID CreateProcessNotifyEx( _Inout_ PEPROCESS Process, _In_ HANDLE ProcessId, _In_opt_ PPS_CREATE_NOTIFY_INFO CreateInfo);
typedef struct _PS_CREATE_NOTIFY_INFO { SIZE_T Size; union { ULONG Flags; struct { ULONG FileOpenNameAvailable :1; ULONG Reserved :31; }; }; HANDLE ParentProcessId; CLIENT_ID CreatingThreadId; struct _FILE_OBJECT *FileObject; PCUNICODE_STRING ImageFileName; PCUNICODE_STRING CommandLine; NTSTATUS CreationStatus;} PS_CREATE_NOTIFY_INFO, *PPS_CREATE_NOTIFY_INFO;

wątki

w tym samym pomyśle niż w przypadku procesów, wątki mogą być sposobem na szkodliwe rzeczy, aby spowodować szkody. Na przykład, można wprowadzić kod do procesu legit, i rozpocząć zdalny wątek na tym kodzie wewnątrz kontekstu procesu(łatwe do naśladowania? 🙂 ). W ten sposób legalny proces może robić złośliwe rzeczy.

możemy filtrować nowe wątki za pomocą wywołania zwrotnego pssetcreatethreadnotifyroutine. Za każdym razem, gdy tworzony jest wątek, program antywirusowy jest powiadamiany o TID i PID. W ten sposób może zajrzeć do kodu adresu początkowego wątku, przeanalizować go i zatrzymać wątek lub wznowić go.

NTSTATUS PsSetCreateThreadNotifyRoutine( _In_ PCREATE_THREAD_NOTIFY_ROUTINE NotifyRoutine);
VOID(*PCREATE_THREAD_NOTIFY_ROUTINE) ( IN HANDLE ProcessId, IN HANDLE ThreadId, IN BOOLEAN Create );

obrazy

trzecie zagrożenie dynamiczne dotyczy obrazów, które można załadować do pamięci. Obraz jest plikiem PE, EXE, DLL lub sys. Aby być powiadamianym o załadowanych obrazach, wystarczy zarejestrować PsSetLoadImageNotifyRoutine. To wywołanie zwrotne pozwala nam otrzymywać powiadomienia, gdy obraz zostanie załadowany do pamięci wirtualnej, nawet jeśli nigdy nie zostanie wykonany. Następnie możemy wykryć, kiedy proces próbuje załadować bibliotekę DLL, załadować sterownik lub uruchomić nowy proces.

wywołanie zwrotne pobiera informacje o pełnej ścieżce obrazu (przydatne do analizy statycznej), a tym bardziej, moim zdaniem, adres bazowy obrazu (do analizy w pamięci). Jeśli obraz jest złośliwy, program antywirusowy może użyć małych sztuczek, aby uniknąć wykonania, takich jak parsowanie obrazu w pamięci i przejście do punktu wejścia, a następnie wywołanie kodu opcode zespołu „ret”, aby go anulować.

NTSTATUS PsSetLoadImageNotifyRoutine( _In_ PLOAD_IMAGE_NOTIFY_ROUTINE NotifyRoutine);
VOID (*PLOAD_IMAGE_NOTIFY_ROUTINE)( __in_opt PUNICODE_STRING FullImageName, __in HANDLE ProcessId, __in PIMAGE_INFO ImageInfo );
typedef struct _IMAGE_INFO { union { ULONG Properties; struct { ULONG ImageAddressingMode : 8; //code addressing mode ULONG SystemModeImage : 1; //system mode image ULONG ImageMappedToAllPids : 1; //mapped in all processes ULONG Reserved : 22; }; }; PVOID ImageBase; ULONG ImageSelector; ULONG ImageSize; ULONG ImageSectionNumber;} IMAGE_INFO, *PIMAGE_INFO;

system plików

gdy każda dynamiczna rzecz jest zabezpieczona, program antywirusowy powinien być w stanie powiadomić użytkownika o złośliwych rzeczach w locie, nie tylko wtedy, gdy mają się rozpocząć. Program antywirusowy powinien mieć możliwość skanowania plików, gdy użytkownik otworzy folder, archiwum lub gdy zostanie pobrany na dysk. Co więcej, program antywirusowy powinien być w stanie się chronić, zabraniając żadnemu programowi usuwania jego plików.

sposobem na zrobienie tego wszystkiego jest zainstalowanie sterownika w systemie plików, a dokładniej minifiltra starszego filtra (old way). Tutaj porozmawiamy o minifiltrze.

minifilter jest specyficznym rodzajem sterownika, zdolnym do rejestrowania wywołań zwrotnych przy każdej operacji odczytu/zapisu wykonanej w systemie plików (główne funkcje IRP). IRP (Interrupt Request Paquet)jest obiektem używanym do opisania operacji odczytu / zapisu na dysku, która jest przesyłana wraz ze sterownikiem. Minifiltr zostanie po prostu włożony do tego stosu i otrzyma IRP, aby zdecydować, co z nim zrobić (operacja allow/deny).

aby uzyskać mały przykład minifiltra, sprawdź ten przydatny link lub ten. Wytyczne microsoft są tutaj.

znajdziesz również 2 Przykłady dokumentacji WDK tutaj i tutaj.

podstawowe wywołanie zwrotne minifiltra wygląda tak. Istnieją 2 rodzaje połączeń zwrotnych, operacji przed i po operacji, które są w stanie filtrować przed i po zapytaniu. Oto pseudo kod przedoperacyjny:

FLT_PREOP_CALLBACK_STATUS PreOperationCallback (__inout PFLT_CALLBACK_DATA Data, __in PCFLT_RELATED_OBJECTS FltObjects, __deref_out_opt PVOID *CompletionContext){ ... if ( all_good ) { return FLT_PREOP_SUCCESS_NO_CALLBACK; } else { // Access denied Data->IoStatus.Information = 0; Data->IoStatus.Status = STATUS_ACCESS_DENIED; return FLT_PREOP_COMPLETE; } }

rejestr

rejestr jest jednym z najbardziej krytycznych miejsc do strzeżenia. Istnieje wiele sposobów, aby złośliwe oprogramowanie utrzymywało trwałą rękę na systemie, rejestrując pojedyncze (lub kilka) klucze / wartości w rejestrze. Najbardziej znane miejsca to Klucze do biegania i usługi. Jest to również miejsce, w którym program antywirusowy może zostać pokonany (wraz z systemem plików), po prostu usuwając klucze sterownika/usługi, aby nie uruchamiał się ponownie przy rozruchu systemu.

to nie jest prawdziwa konieczność dla antywirusa, aby chronić miejsca restartu, większość z nich nie. ale muszą chronić swoje klucze rejestru instalacji, aby uniknąć łatwego pokonania przez złośliwe oprogramowanie. Można to zrobić rejestrując CmRegisterCallback.

wywołanie zwrotne daje wystarczająco dużo informacji, aby uzyskać pełną nazwę klucza, rodzaj dostępu (Utwórz, Zmień nazwę, Usuń,…) i PID wywołującego. W ten sposób łatwo jest przyznać dostęp lub nie do połączenia, ustawiając pole Status po wywołaniu zwrotnym.

NTSTATUS CmRegisterCallbackEx(_In_ PEX_CALLBACK_FUNCTION Function,_In_ PCUNICODE_STRING Altitude,_In_ PVOID Driver,_In_opt_ PVOID Context,_Out_ PLARGE_INTEGER Cookie,_Reserved_ PVOID Reserved);
EX_CALLBACK_FUNCTION RegistryCallback;NTSTATUS RegistryCallback( _In_ PVOID CallbackContext, _In_opt_ PVOID Argument1, _In_opt_ PVOID Argument2){ ... }Argument1 = typedef enum _REG_NOTIFY_CLASS { RegNtDeleteKey, RegNtPreDeleteKey = RegNtDeleteKey,...Argument2 = typedef struct _REG_POST_OPERATION_INFORMATION { PVOID Object; NTSTATUS Status; PVOID PreInformation; NTSTATUS ReturnStatus; PVOID CallContext; PVOID ObjectContext; PVOID Reserved;} REG_POST_OPERATION_INFORMATION, *PREG_POST_OPERATION_INFORMATION;

sieć (Firewall)

aby chronić drzwi całego ruchu internetowego, który może być ogromny w niektórych systemach (serwery, użytkownicy ogromnej przepustowości) bez spowolnienia przez przełączanie kontekstu, które ma miejsce w userland, nie zaleca się instalowania zapory sieciowej, która nie ma podstawowego Sterownika, z wyjątkiem niektórych filtrów przeglądarki internetowej, które mogą być wystarczające dla ruchu http, ale które nie chronią przed złośliwym oprogramowaniem komunikacja w/w.

aby mieć poprawną implementację Firewalla, należy zakodować NDIS, TDI lub inną metodę dla sterownika filtrowania IP niskiego poziomu. NDIS / TDI jest trochę trudne do zrobienia i wymagałoby dużo wiedzy (więcej niż inne filtry moim zdaniem).

w każdym razie, oto kilka wskazówek, aby rozpocząć kodowanie takiego sterownika, wytyczne microsoft i stary samouczek codeproject (ale nadal dobry do czytania), przykład zapory NDIS i przykład zapory TDI. Oto również dobry tekst o sztuczce obejścia zapory NDIS i małe wyjaśnienie na temat stosu sterowników sieciowych,

ochrona użytkownika

ochrona użytkownika nie jest koniecznością, ale może być dodatkowym modułem przeciwko bankierom trojańskim, a dokładniej przeciwko szpiegom procesów. Są one zazwyczaj wstrzykiwane do każdego procesu, z kilku powodów.

po pierwsze, są w stanie (na żądanie) zabić proces, jeśli został zidentyfikowany jako złośliwe oprogramowanie (nie powinno to się zdarzyć, ponieważ AVs mają go zatrzymać przed uruchomieniem). Zawsze łatwiej jest zatrzymać proces, gdy jesteś w jego kontekście.

po drugie są w stanie chronić krytyczne procesy, takie jak przeglądarki internetowe, przed zaczepianiem złośliwych programów, które mogą objeżdżać i filtrować połączenia API w celu gromadzenia haseł, informacji bankowych i przekierowywania przepływu Internetu do serwerów złośliwego oprogramowania. Obserwują tylko modyfikację IAT, splicing, a także mogą sami ustawić Hooki, aby uniknąć LoadLibray złośliwego DLL, a tym samym zabronić pewnych metod wstrzykiwania kodu.

łatwym sposobem na wstrzyknięcie biblioteki protector DLL do wszystkich procesów jest użycie klucza rejestru AppInitDll do rejestracji biblioteki protector DLL. Załaduje bibliotekę DLL do każdego rozpoczętego procesu w systemie, gdy tylko połączą się z użytkownikiem 32.dll image (większość z nich robi).

silnik analizy

silnik analizy jest jedną z najważniejszych części, jest odpowiedzialny za analizę próbek plików/pamięci pochodzących ze sterowników. Jeśli musi być szybki (nawet z ogromną bazą danych) i powinien być w stanie obsłużyć większość typów plików (Samorozpakowane pliki wykonywalne, archiwa-RAR, ZIP, spakowane pliki – UPX,…), a zatem powinien mieć wiele modułów do tego:

  • rozpakowywanie: moduł ten musi być w stanie wykryć i rozpakować większość znanych pakujących (UPX, Armadillo, ASPack, …)
  • Mechanizm podpisu: baza danych antywirusa zawiera miliony podpisów, a silnik powinien być w stanie szybko wyszukać je w próbce. Tak więc, bardzo potężny algorytm powinien być jego częścią. Kilka przykładów : AhoCorasick, RabinKarp, algorytmy dopasowywania strun.
  • piaskownica : ten moduł nie jest konieczny, ale byłby plusem, aby móc uruchamiać próbki w ograniczonej pamięci, bez wpływu na system. Może to pomóc w rozpakowaniu próbek zapakowanych nieznanymi pakerami i pomóc silnikowi heurystycznemu (zobacz później) wykryć wywołania API, które mogą być uznane za podejrzane lub złośliwe. Niezła piaskownica.
  • silnik heurystyczny : jak wspomniano powyżej, silnik heurystyczny nie szuka podpisów, ale raczej szuka podejrzanych zachowań (tj. przykład, który otwiera połączenie na stronie internetowej hxxp: / / malware_besite. com). można to zrobić przez Analizę statyczną lub przez piaskownicę.

składnia podpisu

składnia podpisu to „słownik” języka, który rozumie silnik podpisu. To sposób na sformalizowanie wzoru, który należy znaleźć, jak go przeszukać i gdzie go przeszukać w próbce. Składnia musi być wystarczająco prosta, aby naukowcy mogli ją zrozumieć, wystarczająco mocna, aby poradzić sobie z każdym przypadkiem użycia i łatwa do przeanalizowania w celu uzyskania lepszych osiągów silnika.

VirusTotal opracował dobrą składnię i silnik (projekt Yara), który jest open source. To powinien być dobry wskaźnik do tworzenia własnej składni, lub po prostu z niej korzystać. Oto również dobry blog o tym, jak tworzyć podpisy dla antywirusa.

przykład podpisu:

rule silent_banker : banker{ meta: description = "This is just an example" thread_level = 3 in_the_wild = true strings: $a = {6A 40 68 00 30 00 00 6A 14 8D 91} $b = {8D 4D B0 2B C1 83 C0 27 99 6A 4E 59 F7 F9} $c = "UVODFRYSIHLNWPEJXQZAKCBGMT" condition: $a or $b or $c}

Self-protection

self protection jest bardzo ważne dla antywirusa, aby uniknąć pokonania przez złośliwe oprogramowanie i nadal chronić użytkownika. Dlatego program antywirusowy powinien być w stanie chronić własną instalację i utrzymywać trwałość przy ponownym uruchomieniu.

istnieje kilka miejsc do ochrony: pliki, klucze rejestru, procesy/wątki, pamięć.

  • Ochrona plików jest zaimplementowana w minifiltrze, ze szczególnymi zasadami dotyczącymi plików programu antywirusowego (Brak dostępu przy usuwaniu, zmianie nazwy, przenoszeniu, zapisywaniu).
  • Ochrona rejestru jest dokonywana w filtrze rejestru, z odmową dostępu dla kluczy rejestru sterownika i usługi.
  • wątki sterowników są chronione, ponieważ nie można rozładować modułu jądra bez awarii systemu
  • , aby móc chronić usługę, która jest procesem użytkownika, 2 rozwiązania:
  1. najłatwiej byłoby dodać reguły błędów w Menedżerze usług i ustawić każdą regułę błędu na „restart service”. W ten sposób, gdy usługa nie jest zatrzymywana przez Service manager, uruchamia się ponownie. Oczywiście usługa nie powinna być w stanie przyjmować poleceń, dopóki system nie uruchomi się ponownie (lub nie zatrzyma).
491838-428-487-263x300
  1. drugą metodą, która jest bardziej ogólna, byłoby ustawienie wywołań zwrotnych na uchwytach procesów za pomocą ObRegisterCallbacks.

ustawiając ObjectType na Psprocesstype, a operację na OB_OPERATION_HANDLE_CREATE, otrzymasz zwrotną operację przed i po, i jesteś w stanie zwrócić ACCESS_DENIED do ReturnStatus, jeśli zapytany proces ma GrantedAccess, który ma prawa do zakończenia procesu (lub prawa zapisu procesu lub cokolwiek, co może prowadzić do awarii/zabicia), i oczywiście jeśli Proces jest jednym, którego program antywirusowy musi chronić (jego usługa na przykład).

oczywiście, należy również chronić duplikat uchwytu i PsThreadType, aby uniknąć jakiejkolwiek metody zakończenia, która wymaga chwycenia uchwytu procesu lub wątku. Oto mały przykład użycia tego wywołania zwrotnego.

NTSTATUS ObRegisterCallbacks( _In_ POB_CALLBACK_REGISTRATION CallBackRegistration, _Out_ PVOID *RegistrationHandle);
typedef struct _OB_CALLBACK_REGISTRATION { USHORT Version; USHORT OperationRegistrationCount; UNICODE_STRING Altitude; PVOID RegistrationContext; OB_OPERATION_REGISTRATION *OperationRegistration;} OB_CALLBACK_REGISTRATION, *POB_CALLBACK_REGISTRATION;
typedef struct _OB_OPERATION_REGISTRATION { POBJECT_TYPE *ObjectType; OB_OPERATION Operations; POB_PRE_OPERATION_CALLBACK PreOperation; POB_POST_OPERATION_CALLBACK PostOperation;} OB_OPERATION_REGISTRATION, *POB_OPERATION_REGISTRATION;
VOID ObjectPostCallback( _In_ PVOID RegistrationContext, _In_ POB_POST_OPERATION_INFORMATION OperationInformation);
typedef struct _OB_POST_OPERATION_INFORMATION { OB_OPERATION Operation; union { ULONG Flags; struct { ULONG KernelHandle :1; ULONG Reserved :31; }; }; PVOID Object; POBJECT_TYPE ObjectType; PVOID CallContext; NTSTATUS ReturnStatus; POB_POST_OPERATION_PARAMETERS Parameters;} OB_POST_OPERATION_INFORMATION, *POB_POST_OPERATION_INFORMATION;
typedef union _OB_POST_OPERATION_PARAMETERS { OB_POST_CREATE_HANDLE_INFORMATION CreateHandleInformation; OB_POST_DUPLICATE_HANDLE_INFORMATION DuplicateHandleInformation;} OB_POST_OPERATION_PARAMETERS, *POB_POST_OPERATION_PARAMETERS;
typedef struct _OB_POST_CREATE_HANDLE_INFORMATION { ACCESS_MASK GrantedAccess;} OB_POST_CREATE_HANDLE_INFORMATION, *POB_POST_CREATE_HANDLE_INFORMATION;

GUI (Graphical User Interface)

jest to widoczna część góry lodowej. Moim zdaniem jedna (być może) najważniejsza część, jeśli chcesz sprzedać swój produkt. Użytkownicy kochają to, co piękne, łatwe w obsłudze, intuicyjne. Nawet jeśli nie jest w 100% wydajny. GUI musi być seksowne.

GUI jest tylko pustą powłoką, wykonuje tylko obróbkę graficzną i wysyła/odbiera polecenia do rdzenia (usługi). Wyświetla również paski postępu, co jest analizowane, zapewnia konfigurację, a więc … oto interfejs Avast. Seksowne, prawda? 🙂

avast

Architektura

globalna architektura może wyglądać tak:

  1. GUI: Brak praw administracyjnych, słaby
  2. Guard DLL(s) : Ochrona przeglądarki internetowej, średni
  3. serwis: prawa administratora. Służy jako brama do kodu jądra i podejmuje decyzje wraz z niektórymi bazami danych, STRONG
  4. Driver(s) : Kernel filters, STRONG

GUI nie potrzebuje żadnych uprawnień administracyjnych, tylko wykonuje działania użytkownika i przesyła je do serwisu. Wyświetla również status produktu. Nic więcej, to nie jest jego cel. Jeśli GUI zostanie zabity, nie stanowi to problemu, ponieważ usługa powinna być w stanie go ponownie uruchomić.

biblioteki DLL strażników (jeśli istnieją) są masowo wstrzykiwane do wszystkich procesów i powinny być w stanie szukać hooków i/lub złośliwych wątków. Powinny być dość trudne do rozładowania lub pokonania. Nie są one krytyczne, ale ważne.

usługa jest rdzeniem produktu. Powinien być nie do zabicia, a przynajmniej powinien być w stanie samodzielnie uruchomić się na kill. Usługa jest odpowiedzialna za komunikację między wszystkimi modułami produktu, wysyła polecenia do sterowników, pobiera polecenia od użytkownika i zapytuje bazę danych do analizy próbki. To jest mózg.

sterowniki jądra są również krytyczne. Są to macki, które zbierają informacje o wszystkim, co dzieje się w systemie, i przekazują je do służby w celu podjęcia decyzji. Są również w stanie odmówić dostępu do miejsc strzeżonych, na podstawie decyzji służby.

podsumowanie

stworzenie silnego, niezawodnego i stabilnego silnika antywirusowego To skomplikowane zadanie, które wymaga doświadczonych osób z bardzo silną wiedzą w zakresie programowania jądra systemu windows, programowania aplikacji windows, projektowania GUI, architektury oprogramowania, analizy złośliwego oprogramowania, …

budowanie stabilnych sterowników to również skomplikowane zadanie, ponieważ małe ziarenko piasku może zawiesić cały system. Wymaga testów, testów i wielu testów. Kiedy silnik jest gotowy i działa, Wystarczy zatrudnić naukowców do analizy złośliwych programów i dodać podpisy do bazy danych 🙂 na co czekasz? Dalej! 😀

linki

  • http://www.symantec.com/connect/articles/building-anti-virus-engine

Leave a Reply

Twój adres e-mail nie zostanie opublikowany.