CybertFlow Logo
CybertFlow

Automatyzacja Biznesu

Inżynieria wsteczna i wizualizacja danych. Dekodowanie kodu binarnego systemu ERP
Wróć do realizacji
R&D / Projekt AutorskiKlient: WnD (Grupa Oknoplast)

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.

256
KOLORÓW W VBA
0
WSPARCIA PRODUCENTA
100%
ZMAPOWANYCH ZALEŻNOŚCI

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.

1

Krok 1: Generowanie palety

Skrypt VBA przypisał każdej z 256 możliwych kombinacji znaków heksadecymalnych unikalny, losowy kolor RGB.

2

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.

3

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.

wnd-reverse-engineering-excel.jpg
Kliknij aby powiększyć

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.

wnd-reverse-engineering-app_1.png
wnd-reverse-engineering-app_2.jpg

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.

256
KOLORÓW W VBA
0
WSPARCIA PRODUCENTA
100%
ZMAPOWANYCH ZALEŻNOŚCI