Znalezienie plików identycznych jest dość proste. Wystarczy porównać ich sumy kontrolne. Dwa identyczne pliki dają tą samą sumę kontrolną (oczywiście pod pojęciem suma kontrolna rozumiem hash). Dla pewności można zastosować dwie funkcje skrótu - MD5 i SHA1 są w zupełności do tego wystarczające, nawet mimo (bardziej lub mniej) potencjalnych kolizji. Problem pojawia się wtedy, gdy trzeba zidentyfikować pliki podobne.
Trochę podobne pliki...
Niestety, w przypadku plików nie istnieje taka prosta definicja podobieństwa, jak na przykład w przypadku podobieństwa trójkątów. W pewnych przypadkach można jednak przyjąć, że pliki są podobne, gdy mają dużo podobnych fragmentów. Zagmatwane? Trochę.W każdym razie istnieje metoda określana jako fuzzy hashing, jest również dostępne narzędzie, które koncepcję tą implementuje: ssdeep.
Można sprawdzić jego skuteczność. Skoro kiedyś pozbierałem trochę (prawdopodobnie podobnych do siebie plików) w ramach zabawy z tamagotchi, to myślę, że jest to dość dobry zbiór danych do testów. Na początek można wygenerować listę hashy dla testowego zestawu danych:
ssdeep -b * > hashes.txt
A następnie porównać wybrany plik z bazą:
ssdeep -bm hashes.txt 044bfda21be6cb1f85f4bccc8e59c2e2 044bfda21be6cb1f85f4bccc8e59c2e2 matches 044bfda21be6cb1f85f4bccc8e59c2e2 (100) 044bfda21be6cb1f85f4bccc8e59c2e2 matches 142076bc5b7c7e5cded7c7904dc04f8c (94)
Jak łatwo się spodziewać plik sam do siebie jest bardzo podobny, ssdeep wykazał jednak, że jeden plik spośród zebranych jest bardzo podobny. Co na ten temat powie antywirus?
044bfda21be6cb1f85f4bccc8e59c2e2: Trojan.SdBot-4693 FOUND ----------- SCAN SUMMARY ----------- Known viruses: 311141 Engine version: 0.93 Scanned directories: 0 Scanned files: 1 Infected files: 1 Data scanned: 0.13 MB Time: 6.094 sec (0 m 6 s) -------------------------------------- Completed -------------------------------------- 142076bc5b7c7e5cded7c7904dc04f8c: W32.Virut.ii FOUND ----------- SCAN SUMMARY ----------- Known viruses: 311141 Engine version: 0.93 Scanned directories: 0 Scanned files: 1 Infected files: 1 Data scanned: 0.13 MB Time: 5.625 sec (0 m 5 s) -------------------------------------- Completed --------------------------------------
Jak widać według ClamAV wirusy są różne. Rezultaty Virustotal:
Tutaj jest już nieco inaczej (większa próbka antywirusów). Jak widać (w rezultatach) w przypadku obu plików powtarzają się rozpoznania jako (mogłem coś przeoczyć):
- Win32/IRCBot.worm.variant,
- Win32:Rbot-DFQ,
- Backdoor.Rbot.QG,
W ramach testu jeszcze jeden przypadek:
ssdeep -bm hashes.txt b3f407787fb515096b18d997e864f0fd b3f407787fb515096b18d997e864f0fd matches 26774a0f08acb4f18ad1d5f14c0fa14d (90) b3f407787fb515096b18d997e864f0fd matches 27584aa3b9511c2c90e1bef83ce69d56 (90) b3f407787fb515096b18d997e864f0fd matches 3a34b2c5dd8aff6013f2fe82d5a06a8c (91) b3f407787fb515096b18d997e864f0fd matches 3b2920eaadb36ffc9177b1d19a2fc3e9 (91) b3f407787fb515096b18d997e864f0fd matches 3bba849c038dbb222708578dc01a36f5 (91) b3f407787fb515096b18d997e864f0fd matches 4049a6b328ad94aaa330c2aaf28f4983 (91) b3f407787fb515096b18d997e864f0fd matches 51438bfd9f39b99b082938f47bb25f5e (91) b3f407787fb515096b18d997e864f0fd matches 5238be2d4db891abada534f04bf0247b (91) b3f407787fb515096b18d997e864f0fd matches 63d42b203f37f51a77c1c723cccaa7a8 (91) b3f407787fb515096b18d997e864f0fd matches 703113254d84fb29834fa036a6f3ffd4 (94) b3f407787fb515096b18d997e864f0fd matches 736f899b16116697f9eb6f80d8b53998 (71) b3f407787fb515096b18d997e864f0fd matches 88da3d0f727e94ef70b1d7f742533caa (97) b3f407787fb515096b18d997e864f0fd matches b3f407787fb515096b18d997e864f0fd (100) b3f407787fb515096b18d997e864f0fd matches c97ddb99821d162e7305cdee66d3e42d (91) b3f407787fb515096b18d997e864f0fd matches dc81094f14ba7b4e13d1bc7690bedf39 (90) b3f407787fb515096b18d997e864f0fd matches e71aab4c10c304d3bef21647d9ee4a1a (90)
Jak widać grupa podobnych plików jest znacznie większa. W tym przypadku nawet ClamAV stwierdza, że pliki są rzeczywiście podobne:
26774a0f08acb4f18ad1d5f14c0fa14d: W32.Virut.ci FOUND 27584aa3b9511c2c90e1bef83ce69d56: W32.Virut.ba FOUND 3a34b2c5dd8aff6013f2fe82d5a06a8c: W32.Virut.di FOUND 3b2920eaadb36ffc9177b1d19a2fc3e9: W32.Virut.ia FOUND 3bba849c038dbb222708578dc01a36f5: W32.Virut.di FOUND 4049a6b328ad94aaa330c2aaf28f4983: W32.Virut.di FOUND 51438bfd9f39b99b082938f47bb25f5e: W32.Virut.da FOUND 5238be2d4db891abada534f04bf0247b: W32.Virut.di FOUND 63d42b203f37f51a77c1c723cccaa7a8: W32.Virut.da FOUND 703113254d84fb29834fa036a6f3ffd4: Exploit.DCOM.Gen FOUND 736f899b16116697f9eb6f80d8b53998: Exploit.DCOM.Gen FOUND 88da3d0f727e94ef70b1d7f742533caa: W32.Virut.da FOUND b3f407787fb515096b18d997e864f0fd: W32.Virut.ii FOUND c97ddb99821d162e7305cdee66d3e42d: W32.Virut.di FOUND dc81094f14ba7b4e13d1bc7690bedf39: W32.Virut.ii FOUND e71aab4c10c304d3bef21647d9ee4a1a: W32.Virut-17 FOUND
Jakie korzyści można mieć z narzędzia typu ssdeep? Cóż, obecnie istnieją bazy known good i known bad, które zawierają informacje o znanych plikach, tych dobrych i tych złych. W trakcie analizy pozwalają one na łatwiejszą identyfikację tych plików, którymi się (nie)trzeba zajmować. Problem w tym, że zarówno dobre, jak i złe pliki mutują. W przypadku dobrych plików, może to być na przykład instalacja poprawki, w przypadku tych złych - drobna modyfikacja wirusa. Wykorzystanie narzędzi typu ssdeep pozwala trochę uniezależnić się od bazy dokładnych sum kontrolnych i korzystać z nieco rozmytej logiki. Można mieć na przykład "rozmytą" bazę znanego złego oprogramowania i z jej pomocą identyfikować pliki podobne, które są być może nowymi wersjami znanych szkodników. Trzeba pamiętać tylko, że to jest metoda, której wyniki należy traktować z nieco ograniczonym zaufaniem.