Reversing Clipper

Clipper – czyli czego się nie nauczyłem

Clipper to język programowania z czasów DOS-a, ściśle związany z operowaniem na bazach danych, można powiedzieć, że to protoplasta Visual FoxPro.

Piszę o tym, ponieważ przed świętami otrzymałem zlecenie na modyfikację starego programu napisanego w środowisku Clipper, modyfikacja miała polegać na zmianie stawki VAT z 22% na 23% i 7% na 8%, czyli popularny ostatnio temat, związany z noworoczną zmianą stawki podatkowej.

Opiszę jedynie jak zabrać się za tego typu oprogramowanie, ponieważ w sieci nie znalazłem praktycznie żadnych materiałów o analizie aplikacji Clippera.

Rozpoznanie

Po czym poznać, że stara aplikacja DOS jest utworzona w Clipperze? Ja poznałem po tym, że jak załadowałem ją do IDA to nic nie rozumiałem z kodu ani żadnych ciekawych tekstowych referencji nie znalazłem, po prostu syf w czystej postaci, nawet sobie pomyślałem, że to jakaś aplikacja z DOSowego piekła rodem.

Przeglądając binarkę pod HIEW dostrzegłem jednak ciekawe informacje:

A więc wiadomo, że to Clipper w wersji 5.2. Mamy jakiś punk zaczepny.

Analiza

Aplikacje w Clipperze kompilowane są do pseudokodu (p-code), więc jeszcze lepiej zapowiadała się analiza, nawet nie wiedziałem, że w czasach DOSu ludzie mieli taką fantazję, żeby już tworzyć podwaliny pod platformę .net 🙂

Jednak ku mojemu zaskoczeniu i długim wyszukiwaniu, udało mi się znaleźć działający dekompilator, co uznałem wręcz za cud (w końcu były święta), ponieważ wiek samego anailzowanego programu jak i dekompilatora był już dość spory.

Odnaleziony dekompilator to Valkyrie 5, stworzony przez tą samą firmę, która jest odpowiedzialna za środowisko CA-Clipper.

Po otworzeniu głównego pliku aplikacji w dekompilatorze, ukaże się nam okno z informacjami i statystykami dla aplikacji:

Co ważne i na co należy zwrócić uwagę, to że aplikacja w Clipperze oprócz funkcji samego Clippera posiada również funkcje napisane w C/Assemblerze, które nie zostaną zdekompilowane, a jedynie uzyskamy dostęp do informacji o ich położeniu w pliku binarnym.

Domyślnym oknem w dekompilatorze jest lista modułów, z których zbudowana jest aplikacja oraz ich funckje:

Składnia języka Clipper nie jest zbyt skomplikowana (przypomina trochę Pascala) i można w miarę szybko ją zrozumieć, co ciekawe i co zwróciło moją uwagę to funkcja EVAL, która pozwala wykonać podany blok kodu źródłowego (jak eval z PHP).

Przykładowa zdekompilowana funkcja:

Oprócz kodu w HLL, można samą funkcję obejrzeć w p-code (i jak się można domyśleć modyfikacje również muszą być dokonywane manipulując na p-code):

Oprócz funkcji napisanych w języku Clipper, wspominałem wyżej, że plik może również zawierać natywny kod, listę tych funkcji możemy podejrzeć po wybraniu Menu -> View -> Externals:

Do ich podglądu należy skorzystać już z HIEW.

Bazy danych

Aplikacje Clipper domyślnie są aplikacjami bazodanowymi, a format plików jakim operują to *.DBF, muszę przyznać, że trochę czasu mi zajęło znalezienie odpowiedniej aplikacji do podglądu tego typu plików i pierwsza z nich, którą polecam to DBF Viewer 2000, a jeśli posiadacie środowisko Visual FoxPro to również z jego poziomu można przeglądać bazy danych w tym formacie, co było małym zaskoczeniem, że obsługiwane są bazy w tak starym formacie.

Uruchamianie

Z aplikacją, z którą ja pracowałem, miałem problem, żeby w ogóle ją uruchomić, pod konsolą DOS w systemie Windows odmawiała posłuszeństwa, DOSBox 0.74 również niewiele pomógł, ratunkiem okazał sie po prostu natywny MS-DOS 6.22 uruchamiany pod VMWare.

Przy okazji próbowałem dobrać się do tej aplikacji jakimś starym debuggerem jednak bez większych efektów, bo jak się okazało Clipper i SoftICE za bardzo się nie lubią, ale na pamiątkę strzeliłem screenshota:

Czego się nie nauczyłem?

Głównie tego jak poprawnie debugować tego typu aplikacje i jak modyfikować więcej niż kilka instrukcji, nie mówiąc o podmianie całych bloków kodu. Clipper należy już z zasadzie do przeszłości, ale mimo wszystko warto czasami zobaczyć jak zbudowane były i jak funkcjonowały stare aplikacje, bo wiele z tych technik (czy zamysłów) jest obecnie wykorzystywanych.

9 komentarzy do “Reversing Clipper”

  1. miałeś cholernego farta, ze valkyrie to ugryzło – i banalne zadanie. ja mniej więcej w tym samym czasie co Ty, modyfikowałem program linkowany jakimś bardzo nowym blinkerem (>=5.0 – nie miał nigdzie sygnatury), wykorzystującym kompresję pliku wykonywalnego. też miałem farta, bo procedury clipperowe były w oddzielnej, nieskompresowanej nakładce. teraz mam ciekawsze zadanie – jedna z kopii programu, którą też trzeba zmodyfikować, zawiera pewne (trudne, a wręcz niemożliwe do przeanalizowania bez znajomości choćby kodu pośredniego) modyfikacje logiki biznesowej i jest zlinkowana blinkerem 4.0 z kompresją.

    Odpowiedz
    • Aleś mnie zaipmonił po 11 latach. Pytanie tylko po coś odgrzebywał taki archaizm? Clipper i bazodanowe systemy z poprzedniego wieku nie były projektowane do obsługi aż tak wielkich klastrów danych jakie obsługiwane są obecnie przez relacyjne bazy danych w architekturze klient-serwer. Co będzie za następną dekadę lub dwie,jaka architektura będzie dominować nie wiadomo ale niepoważnym będzię cofać się do sql kiedy do obsłużenia będą hurtownie danych składające się jottabajtów 🙂

      Odpowiedz
  2. nie wiem czy fart, bo to co miało być do zrobienia znajdowało się też poza clipperowymi źródełkami (externalne procki), a niektóre fragmenty samego Clippera też przyprawiały o ból głowy

    czym się różni ten Blinker 4 od 5?

    Odpowiedz
  3. Valkyrie nie pozwala na modyfikację pcode z tego co ja się orientuję. Jedynie podgląd. Natomiast można zawsze ręcznie dokonać modyfikacji w hex-edytorze.

    Odpowiedz

Dodaj komentarz