Úvod do Alternate Data Stream (ADS)

 


Alternatívne data streamy sú možnosti a skvelý spôsob ako ukryť malware v systéme viacerými spôsobmi
tak, že sa malware schová za iný existujúci súbor. Navyše neexistuje moc antivírusových programov, ktoré
ich sú schopné odhaliť.

Možný príklad malwaru využívajúceho ADS:
1, infikovaný súbor malware.exe ktorom sa nachádza malware začne tým že si zostaví zoznam všetkých súborov s
    príponou .exe v priečinku C:\Windows
2, získa si veľkosť jedného z nich (napr. test.exe)
3, presunie súbor test.exe do inej zložky a vytvorí si jeho záložnú kópiu (.bak)
4, skopíruje malware.exe do priečinku kde sa nachádzal test.exe a premenuje sa na jeho názov.
   Samozrejme teraz má menej bytov ako originálny test.exe súbor, preto si musí pridať na jeho koniec toľko null bytov
   aby sa rovnal vo veľkosti originálnemu súboru test.exe.
   Tiež si nastaví ikonu originálneho test.exe súboru.
5, záložná kópia (.bak) sa premenuje na original.exe a presunie cez ADS za súbor test.exe, čo je vlastne
   malware (test.exe:original.exe)
6, teraz sa pri každom spustení programu bude užívateľovi javiť že nedošlo k žiadnej zmene (max. sa program spustí o
   trocha neskôr), ale s programom original.exe sa spustí aj malware (test.exe)

V príklade naprogramujeme použitie ADS pre súbor C:\ads\test.txt

Pri projektu je nutné nainštalovať cez Nuget Packages balík CodeFluentRuntimeClient.

 

  using CodeFluent.Runtime.BinaryServices;
  using System;
  using System.Collections;
  using System.Collections.Generic;
  using System.IO;
  using System.Linq;
  using System.Text;
  using System.Threading.Tasks;

  namespace ADS_stream
  {
    class Program
    {
        static void Main(string[] args)
        {
            FileStream stream = NtfsAlternateStream.Open(@"C:\ADS\test.txt:hidden.txt", 
                           FileAccess.Write, FileMode.OpenOrCreate, FileShare.None);
                            stream.Close();

            FileStream stream1 = NtfsAlternateStream.Open(@"C:\ADS\test.txt:ukryte.txt",
                             FileAccess.Write, FileMode.OpenOrCreate, FileShare.None);
            stream1.Close();

            NtfsAlternateStream.WriteAllText(@"C:\ADS\test.txt:hidden.txt", 
                                          "Write text to hidden file 1");
            NtfsAlternateStream.WriteAllText(@"C:\ADS\test.txt:ukryte.txt", 
                                          "Write text to hidden file 2");

            string text1 = NtfsAlternateStream.ReadAllText(@"C:\ADS\test.txt:hidden.txt");
            string text2 = NtfsAlternateStream.ReadAllText(@"C:\ADS\test.txt:ukryte.txt");

            Console.WriteLine("Result from hidden file: " + text1);
            Console.WriteLine("Result from hidden file: " + text2);

            Console.WriteLine("List of ADS connected to test.txt: ");
            IEnumerable adsStreams = NtfsAlternateStream.EnumerateStreams(@"C:\ADS\test.txt");

            foreach (NtfsAlternateStream ads in adsStreams)
            {
                Console.WriteLine(ads.Name);
            }

            Console.ReadLine();
        }
    }
  }