tl; dr - odpowiedź zależy od dokładnie tego, jakie wymagania stawiasz przed pytaniem.
-
Jeśli po prostu chcesz wykryć wszystkie wirusy bez dalszych ograniczeń, a następnie oznacz wszystko jako wirus i gotowe.
-
Jeśli chcesz poprawnie zidentyfikować wszystkie programy jako wirus czy nie, to jest to niemożliwe w przypadku niezwiązanym, ponieważ problem klasyfikacji ogranicza się do problemu zatrzymania.
-
Jeśli chcesz poprawnie zidentyfikować wszystkie programy jako wirusy lub nie, i rozważasz maszynę skończoną, wtedy jest to teoretycznie możliwe, ale nie jest to generalnie wykonalne w praktyce.
-
Jeśli pozwolisz, że komputer może generować przypadkowe błędy, to każdy program może być wirus.
Przypadek 1: Pełne wykrywanie wirusów
Oczywiście oznaczanie wszystkich programów jako wirusów wyłapuje je wszystkie. ( Pok'e'mon! )
Zaczynając od tego przypadku, aby zwrócić uwagę, że nie jest trudno wykryć wszystkie wirusy; raczej konkretnym problemem teoretycznym jest prawidłowe klasyfikowanie programów iff jako wirusów.
Przypadek 2: Niemożliwe jest poprawne sklasyfikowanie w ogólnym, nieograniczonym scenariuszu
Rozważmy program:
doHaltingProblem (); // Sama operacja nie jest wiruseminstallEveryVirusEver (); // Zdecydowanie operacja wirusa, ale czy to się stanie?
W tym przypadku program jest wirusem tylko wtedy, gdy problem z zatrzymaniem zatrzyma się, pozwalając installEveryVirusEver ()
. Tak więc wykrywanie wirusów ogranicza się do problemu zatrzymania w ogólnym, niepowiązanym przypadku.
Przypadek 3: Możliwe przez brutalne wyszukiwanie w ograniczonych scenariuszach
Jeśli programy mają być klasyfikowane jako wirusy -lub-nie mają działać na maszynie skończonej, możesz po prostu zasymulować pracę maszyny z każdego możliwego stanu początkowego. Maszyny skończone w końcu zapętlą się z powrotem do poprzedniego stanu, więc z konieczności jest to analiza skończona (jeśli długa).
Przypadek 4: Na komputerach, na których mogą występować błędy, wirusy mogą pojawiać się spontanicznie
Zakładając, że na komputerze można uruchomić program, który zostałby uznany za wirusa, i istnieje niezerowa szansa na losowe przesunięcie mutacji w ten stan, a następnie powinien ostatecznie dojść do stanu wirusa.
Co jest trochę nudne, ale tylko dla zachowania kompletności.
Dyskusja na temat cytat w pytaniu
Wirusy nie mają „lekarstwa”. Udowodniono matematycznie, że zawsze można napisać wirusa, którego żaden istniejący program antywirusowy nie może zatrzymać.
- „ Sekrety & Lies ” , Bruce Schneier, strona 154
Jak wskazano w powyższym przykładzie (1), możliwe jest oznaczenie wszystkich wirusów po prostu oznaczając wszystko jako wirus; to łatwe. Niemożliwe jest, w przypadku niezwiązanego, określenie, czy każdy możliwy program jest wirusem, czy nie.
Ponadto trudno jest ustalić, czy określone programy są wirusami w przypadkach powiązanych. Na przykład rozważmy program:
var toExecute = decryptByBruteForce ([szyfrogram]); // Odszyfruj następną część programu przez brute-forcerun (toExecute); // Uruchom teraz odszyfrowaną część programu
Jak omówiono w przypadku (3), ten program można sklasyfikować jako wirus lub nie, gdy jest uruchamiany na skończonej maszynie, ale ponieważ wymagałoby to brutalnego wymuszenia zaszyfrowanej wiadomości, jest to raczej mało wykonalne w praktycznych scenariuszach.
Dlatego w rzeczywistych aplikacjach sprowadza się to do problemu heurystyki: programy antywirusowe odgadują, co jest wirusem, a co nie. Lub jeśli chcesz bardziej niezawodnych zabezpieczeń, możesz mieć program antywirusowy oznaczający wszystko, czego nie może udowodnić, że jest bezpieczny, unikając konieczności klasyfikowania każdego możliwego programu.
Niestety, użycie heurystyki stwarza dobrze znanym napastnikom luki w zabezpieczeniach. Bez czytania źródła cytatu podejrzewam, że właśnie do tego problemu próbowali się odnosić.