
Inżynieria wsteczna i wizualizacja danych. Dekodowanie kodu binarnego systemu ERP
Historia o tym, jak za pomocą kolorowych komórek w VBA złamałem binarny zapis bazy danych i uratowałem wdrożenie systemu przed lawiną błędów.
Wyzwanie
Brak możliwości śledzenia zależności (triggerów) w systemie ERP podczas kluczowego wdrożenia. Dane zapisane w bazie danych w nieczytelnym formacie binarnym.
Rozwiązanie
Inżynieria wsteczna z użyciem VBA do znalezienia wzorców oraz autorska aplikacja w JS/Electron do wizualizacji drzewa zależności.
"Binarek się nie rusza"
Wdrażanie potężnego systemu ERP to zawsze spacer po polu minowym. W firmie WnD wdrażaliśmy oprogramowanie, które miało sterować całą produkcją okien. Handlowiec na froncie wybierał opcje (np. typ profilu, kolor, okucie), a pod spodem działała plątanina triggerów i skryptów, które decydowały o tym, co zostanie wycenione, a potem fizycznie trafi na halę produkcyjną.
Problem polegał na tym, że system był w tym obszarze czarną skrzynką. Nie wizualizował tego w żaden sposób.
Zdarzało się, że zmiana jednej, z pozoru nieistotnej opcji, powodowała lawinę zdarzeń. Do zestawienia trafiały profile, których nikt nie zamawiał, albo brakowało kluczowych elementów. Byliśmy w fazie wdrożenia. Gdybyśmy puścili to na produkcję w takim stanie, koszty reklamacji mogłyby pójść w dziesiątki tysięcy złotych miesięcznie.
Szukanie przyczyny błędu zajmowało dni. Trzeba było ręcznie przeklikiwać setki opcji, a tych stale przybywało. Baza danych (w języku hiszpańskim) nie pomagała. Znalazłem w niej tabelę, która wyglądała na zbiór triggerów, ale kluczowa kolumna zawierała wyłącznie heksadecymalny bełkot (BLOB).
Zapytałem starszych stażem ekspertów od baz danych. Usłyszałem: "Binarek się nie tyka. To strata czasu". Producent oprogramowania też nie zamierzał w tym pomóc.
Dla mnie to był sygnał do startu. Skoro system to czyta, to ja też mogę.
Excel jako narzędzie hakera
Wyciągnąłem surowe dane z bazy SQL i wrzuciłem je do Excela. Zwykłe parsery tekstu pokazywały tylko strzępy słów, w dodatku porozdzielane jakimiś białymi znakami. Ale wiedziałem, że te dane tam są. Musiałem zrozumieć strukturę tego zapisu.
Gapienie się w ciągi pozornie przypadkowych znaków na białym tle kłuło w oczy. Ciężko było cokolwiek z tego wywnioskować. Napisałem skrypt w VBA, który rozbijał ten ciąg na pary znaków - bajty, czyli porcja danych z wartościami (po przekształceniu) od 0 do 255. To daje 256 stanów na dwa znaki. To z kolei określa jeden z 256 znaków ze standardu kodowania ASCII. Już koniec tego informatycznego bełkotu, obiecuję ;)
Był podział, super. Ale czytanie tysięcy komórek z heksami to obłęd. Wpadłem więc na pomysł: niech Excel to pokoloruje.
Krok 1: Generowanie palety
Skrypt VBA przypisał każdej z 256 możliwych kombinacji znaków heksadecymalnych unikalny, losowy kolor RGB.
Krok 2: Mapowanie wizualne
Makro kolorowało tło komórek podczas rozpakowywania binarki. Puste znaki wyczerniałem. Nagle, po przewinięciu arkusza, zobaczyłem wyraźne wzorce (patterny) - bloki startowe, separatory i dane.
Krok 3: Dekodowanie w locie
Do każdej komórki przypiąłem komentarz z przekonwertowanym znakiem ASCII. Przejeżdżając kursorem po wierszu, mogłem czytać ukryte nazwy opcji.

Screen z Excela z kolorowaniem komórek - widzisz komentarz ze zdekodowanym znakiem ASCII?
Oczy odetchnęły, zaczęły wyłaniać się schematy. Z nich wyłuskałem więcej niż tylko nazwy opcji i wartości, ale też parametry liczbowe w konkretnych bajtach, zapisane w inny, bardziej dosłowny sposób.
Zrobiłem jeszcze jedno ułatwienie - makro kolorujące robiło coś jeszcze. Do każdej komórki dodawało mały komentarz - wyświetlane okienko po najechaniu kursorem na komórkę. W niej zdekodowany znak. Przesuwając po wierszu szybko mogłem zobaczyć, co się kryje pod kolejnymi komórkami z hexami.
Wszystko zaczęło układać się w logiczną całość, z wyjątkiem jednego detalu. Między znakami pojawiały się dziwne "krzaki". Po każdym bajcie ze znakiem był zawsze bajt "00". Nie wiedziałem po co. Zrozumiałem o co chodzi, gdy trafiłem na opcję, w której brakowało jednej litery, a zamiast niej były dwa nieoczywiste bajty - bez tego z zerami. To były polskie znaki diakrytyczne, które nie mieszczą się w standardowej tablicy ASCII, a w tych binarkach teksty były zawsze zapisywane właśnie w tym standardzie. Miałem kompletny klucz.
Od bełkotu do interaktywnego grafu
Wiedząc, jak czytać bazę, mogłem zbudować właściwe narzędzie. Dla łatwości użycia w biurze postawiłem na aplikację desktopową, a że piszę w technologiach webowych (wtedy jeszcze czysty JS), to padło na Electron.js.
Napisałem logikę, która łączyła się z bazą, pobierała i dekodowała triggery, po czym budowała z nich interaktywny graf wskazujący dokładnie, co z czym się łączy.
Działało to błyskawicznie. Wrzucałem na wirtualne płótno jedną opcję, a system rekurencyjnie dorysowywał wszystkie powiązania. Widziałem, co ta opcja zmienia (w dół) i jakie inne opcje wpływają na nią (w górę). Rysowało się pełne drzewo zależności.


Screen z aplikacji JS z różowym nagłówkiem i grafem powiązań
Zamiast szukać jednego błędu przez 3 dni, miałem odpowiedź w sekundę. Znalazłem w systemie błędy, o których nikt nawet nie wiedział, że istnieją. Tak przy okazji, testując aplikację. Wiedziałem jak system jest zbudowany, co jest do czego i jak działa, więc wyłapywałem anomalie. Czasem samo pojawienie się jakiejś opcji w kontekście innej było ewidentnym błędem. Bez tego narzędzia, bardzo ciężkie do wykrycia.
Pragmatyzm ponad wszystko
Kierownictwo nie skakało z radości. Nikt mi tego nie zlecił, zrobiłem to z własnej inicjatywy, w dużej mierze po godzinach. Ale dla mnie i dla zespołu wdrożeniowego to był game-changer.
Ten projekt nauczył mnie jednej kluczowej rzeczy: nie ma systemów nie do ruszenia. Jeśli oprogramowanie działa i podejmuje decyzje, to znaczy, że opiera się na logice. A każdą logikę da się zinżynierować wstecznie i zoptymalizować. Czasem wystarczy do tego zwykły Excel i trochę uporu. No dobra, dużo uporu.
