Steganografia w Excelu

Steganografia to nauka o sposobach ukrywania tajnego komunikatu w niepozornej informacji w taki sposób, aby obecność komunikatu nie została wykryta. W przypadku kryptografii mamy pewność, że tajna informacja została ukryta, natomiast w przypadku steganografii próbuje się ukryć fakt prowadzenia komunikacji.

Steganografia ma długą historię. Jednym z jej przykładów jest tekst zapisany atramentem sympatycznym. Atrament sympatyczny powoduje, że tekst jest niewidoczny do czasu, aż nie podgrzejemy kartki, lub nie użyjemy odpowiedniego środka chemicznego.

W formie cyfrowej informacje są ukrywane najczęściej w zdjęciach. Modyfikując najmniej znaczący bit składowych koloru piksela można w jawnym komunikacie przemycić tajną informację w taki sposób, aby oko ludzkie nie zauważyło, zmian dokonanych w pliku. Najlepiej do tego celu nadają się pliki grafiki rastrowej.

Excel i VBA (Visual Basic for Applications)

Excel (jak również inne programy z pakietu MS Office) ma możliwość rozbudowania własnej funkcjonalności dzięki makrom. Makra można „nagrywać” a Excel nagraną sekwencję czynności zamieni na kod VBA. Można również od razu pisać makra w „czystym” VBA.

Język VBA to nic innego jak uproszczona wersja języka Microsoft Visual Basic niestety, ale dość mocno jest okrojony względem oryginału. Od prawie dwóch dekad następcą Visual Basic’a jest VB.NET jednak w pakiecie Office pod tym względem nic się nie zmieniło i dalej mamy archaiczny VBA.

Wstępne informacje o makrze

Pobierz opisywane makro (35 KB)

W ramach pracy zaliczeniowej z pewnego przedmiotu napisałem dwa proste makra (w wspomnianym wyżej języku VBA) służące do ukrywania i wydobywania tajnych dokumentów w arkuszu Excela. Tajny komunikat został zapisany poprzez dokonywanie drobnych modyfikacji koloru dwóch najmniej znaczących bitów dla dwóch składowych koloru R (Red) i G (Green) dla koloru czcionki w kolejnych komórkach.

Dlaczego komunikat ukrywam tylko w dwóch składowych a nie we wszystkich trzech? Odpowiedź jest prosta: 2 składowe razy dwa bity daje nam 4 litery zakodowane w jednej komórce Excela. Więc jeden bajt jest zakodowany w dwóch sąsiadujących komórkach. Gdybym używał wszystkich 3 składowych, to wtedy jeden bajt byłby zakodowany w 1,5 komórki i algorytm byłby nieco bardziej skomplikowany.

Budowa makra

Bez bicia przyznaje się, że kod może nie jest zbyt elegancki, gdyż nie używam VBA na co dzień. Makro napisałem jako ciekawostkę, aby nieco się podszkolić w VBA (dawno, dawno temu bawiłem się Visual Basiciem więc przesiadka na VBA nie była jakaś bolesna).

Kod został podzielony na 4 moduły (lubię mieć porządek)

  • DeKoduj – w tym module znajduje się procedura o nazwie OdpalDekoduj, która z sprawdza, czy w aktywnym arkuszu znajduje się jakaś ukryta zawartość i jeśli tak, to prosi o podanie nazwy pliku i lokalizacji, gdzie dane mają zostać zapisane. W module znajduje się kilka funkcji pomocniczych oraz kilka stałych.
  • Funkcje – tutaj są funkcje wspólne dla obu kluczowych procedur (kodującej i dekodującej)
  • Koduj – w tym module znajduje się procedura o nazwie OdpalKoduj, która to prosi nas o wskazanie pliku a następnie „ukryje” go w aktywnym arkuszu Excela.
  • OpenSave – w tym module znajdują się funkcje wyświetlające okna dialogowe w których wybiera się nazwę pliku (OpenDialog oraz SaveDialog). W oryginalnej wersji te funkcje korzystały z windowsowego API32 (GetOpenFileName oraz GetSaveFileName) znajdujące się w pliku comdlg32.dll). Niestety mój nowy Excel jest 64 bitowy i te funkcje API nie działają, a ja doszedłem do wniosku, że korzystanie z WinAPI 32 w VBA to chyba przeżytek i skorzystałem z innego rozwiązania. Niestety, ale funkcja SaveDialog nie pozwala na wpisanie domyślnej nazwy nowo zapisywanego pliku a inne rozwiązania w VBA mnie nie zadowalały.

Ograniczenia

Niestety, ale makro jest bardzo powolne (pamiętaj zakodowanie 1 bajta z pliku wymaga zmiany koloru tekstu w dwóch komórkach, tak więc chcąc zakodować plik mający 1 MB trzeba zmienić kolor tekstu w ponad 2 milionach komórek!) Na moim komputerze (procesor Intel Core i7-3632QM 2.20 GHz) 100 KB plik kodował się około 39-43 sekund! Czyli zakodowanie pliku o astronomicznym rozmiarze 1 MB trwałoby ponad 5 minut! Z tego też wprowadziłem ogranicznie maksymalnego rozmiaru pliku na 8 MB. Makro nie nadaje się do ukrywania dużych plików (np. skanów dokumentów), ale krótką notatkę napisaną w notatniku czy Wordzie można zakodować.

100 KB plik zakodowany w Excelu zajmuje nieco ponad 1000 wierszy. W Nowym Excelu arkusz może się składać z nieco ponad miliona wierszy, więc gdyby usunąć ograniczenie rozmiaru do 8 MB okazuje się, że maksymalny plik, jaki możemy zakodować może mieć rozmiar około 100 MB (w przypadku zapisania pliku w formacie XLS arkusz ma tylko 65535 wierszy, więc wtedy można zakodować plik o rozmiarze około 6 MB).

Innym ograniczeniem jest fakt, że w jednym wierszu kodujemy 100 bajtów (jeśli dojdziemy do 200 kolumny, to następne znaki będą kodowane w kolejnym wierszu). Co prawda Excel pozwala na użycie 65535 kolumn, ale jeśli ktoś by zapisał dokument w starym formacie Excelowym tj. z rozszerzeniem XLS, to wtedy jest ograniczenie do raptem 256 kolumn.

Kolejnym ograniczeniem jest duży rozmiar pliku XLSM. Otóż czysty plik bez zakodowanej zawartości zajmuje niespełna 40 KB. Po zakodowaniu w nim pliku o rozmiarze 100 KB (zawierającego losowe znaki) jego rozmiar wzrósł do około 800-900 KB.

Uruchamianie makra

Aby uruchomić makro po prostu otwórz plik ukrywanie-danych.xlsm (śmiało możesz mu zmienić nazwę na inną, ale aby działały makra musi być rozszerzenie xlsm). Następnie w Excelu może się pojawić żółty pasek z informacją o zablokowaniu makr. Należy kliknąć w przycisk Włącz zawartość.

Po uruchomieniu Excela naciśnij kombinację klawiszy Alt + F8 (lub na karcie Widok kliknij w przycisk Makra i z rozwijanego menu wybierz pozycję Wyświetl Makra).

Pojawi się okno dialogowe Makra. Zaznacz makro OdpalKoduj i kliknij w przycisk Uruchom.

Następnie zostaniesz poproszony o wskazanie pliku, który ma zostać zakodowany w arkuszu. Należy się uzbroić w cierpliwość. Gdy makro zakoduje dany plik, pojawi się stosowny komunikat.

Możesz zapisać zmiany i zamknąć Excela a następnie wysłać ten niepozorny plik znajomemu na maila. Znajomy z kolei wykonuje te same czynności co Ty, z tą różnicą, że on uruchamia makro o nazwie OdpalDekoduj.

Podsumowanie

Znając język VBA można napisać dość ciekawe makra. Niestety z powodu powolności to makro nie nadaje się do ukrywania we wnętrzu Excela dużych plików. Ten artykuł należy potraktować jako ciekawostkę, która być może zmobilizuje kilka osób do poznania języka VBA.

Ten wpis został opublikowany w kategorii Kącik hakera i oznaczony tagami , , . Dodaj zakładkę do bezpośredniego odnośnika.

Dodaj komentarz

Twój adres email nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *

Witryna wykorzystuje Akismet, aby ograniczyć spam. Dowiedz się więcej jak przetwarzane są dane komentarzy.