www.aresluna.org/attached/terminology/articles/rekonstrukcja
Attached

(Note: This page is available in Polish language only. If you would like it translated to English, please let me know. Sorry for the inconvenience)


Rekonstrukcja

Jak korzystać z obcych, dobrych wzorów? Oto pytanie, jakie stawiają przed czytelnikiem materiały publikowane w tym numerze w dyskotece.

Autor testowanego programu, Roland Wacławek (dalej zwany RW), określa “Pelikan” jako “dogłębną adaptację” jednego z czołowych programów do redagowania: MS-Word 3.0. Adaptacji tej RW dokonał bez zgody i wiedzy firmy Microsoft. Testowi towarzyszy swoisty manifest RW, w którym uchyla on rąbka tajemnic warsztatu, uważając swą działalność za nową gałąź sztuki programowania.

Propozycja testowania “Pelikana” postawiła nas wobec decyzji: zachować moralną czystość i przemilczeć znaczące na naszym rynku zjawisko, czy też publicznie je przeanalizować, co nieuchronnie wiąże się ze zwróceniem uwagi czytelników na omawiane produkty. Wybraliśmy drugą możliwość. Ostatecznej oceny moralnej dokonają potencjalni nabywcy, kupując i używając ten program lub rezygnując z niego.

Zbierzmy teraz argumenty za i przeciw wybranej przez RW (a także Zbigniewa Kasprzyckiego z firmy XOR, autora “Pismaka”, czyli spolszczonej wersji Chiwritera) metodzie postępowania.

Przeciw: Jest to handel cudzym dorobkiem z naruszeniem polskiego prawa autorskiego, zakazującego nieautoryzowanych przeróbek cudzych dzieł (polskich i obcych), nawet jeśli autor nie występuje w obronie swych praw.

Za: Formalnie RW nie sprzedaje programu MS-Word, lecz osobny program dostosowujący go do potrzeb klienta. Pochodzenie adaptowanej kopii MS-Word jest sprawą etyki użytkownika.

Przeciw: RW wie, że żaden z klientów nie ma legalnej kopii MS-Word. Otrzymują oni gotowy, przerobiony program, zawarte zaś w instrukcji pouczenie o konieczności nabycia legalnej kopii MS-Word traktują jako puste słowa.

Za: A gdzie ją kupić? RW nie przerabia programów, których polskie wersje oferowane są w Polsce legalnie za złotówki. Dlaczego klient ma płacić za reklamę, koszty sprzedaży i serwisu na obcym rynku?

Przeciw: Niech więc kupi program opracowany w kraju i tu sprzedawany. Popierajmy własny przemysł!

Za: Po co powtórnie odkrywać Amerykę? Dobre programy pisano w świecie latami i powtarzanie tej pracy w Polsce jest bez sensu. Oryginalność takich opracowań bywa wątpliwa, a jakość, w tym także niezawodność, znacznie ustępuje światowym standardom.

Przeciw: Tworzą one jednak narodową bazę oprogramowania podstawowego, co może oszczędzić krajowi wiele dewiz, które inaczej trzeba by z czasem wydać na autoryzowane kopie cudzych programów. Nawet ci konkurenci RW, którzy również naśladują obce wzory, ale zachowując pozory, utrudniają przyszłe restrykcje prawne wobec użytkowników swych wyrobów.

Za: Sami przy tym narażają się na przykry proces i miano oszusta i plagiatora. RW poznaje adaptowane programy na tyle dokładnie, że z czasem będzie go stać na prawdziwe “projektowanie od tyłu” (reverse engineering) – tworzenie produktów własnych, nie gorszych od wzorców.

Przeciw: Całe to spolszczanie w ogóle nie ma sensu. Łatwiej poznać kilkadziesiąt słów angielskich, które mają przynajmniej w informatyce ustalone znaczenie, niż domyślać się, “co autor miał na myśli” używając pewnych słów rodzimego pochodzenia.

Za: O tym, co lepsze, decydują klienci, kupując polskie i spolszczone programy lub rezygnując z nich. Niemcy, Francuzi, a nawet Holendrzy używają wyłącznie narodowych wersji oprogramowania. Angielskie terminy mogą być łatwiejsze dla fachowca, ale nie dla przeciętnego użytkownika (sekretarki). Napisana w Polsce, po polsku i z myślą o problemach polskiego użytkownika instrukcja przydatna jest nawet dla fachowca.

Dalsze głosy w tym dialogu z pewnością dopiszą w listach nasi Czytelnicy.

Redakcja

O co tu chodzi?

Analiza i adaptacja obcej technologii jest dziedziną inżynierską samą w sobie (na Zachodzie wymyślono nawet dla niej nazwę: Reverse engineering). “Łamanie” gier może być zajęciem dla amatorów. Adaptacja oprogramowania profesjonalnego wymaga metod profesjonalnych.

Poziom adaptacji tylko pozornie wydaje się sprawą gustu. Manipulacja w kodzie maszynowym programu – bo na tym przecież polega przeróbka – jest sprawą trudną i złożoną. Można przy tym łatwo wprowadzić uszkodzenia i usterki, które albo ujawnią się katastroficznie dopiero po pewnym czasie, po użyciu specyficznej funkcji programu, bądź staną się przyczyną drobnych, ale trudnych do wyjaśnienia i dokuczliwych “wybryków” programu w codziennej pracy.

Oceniamy adaptację

W ofertach firm uwypuklane są zalety, a problemy ujawniają się dopiero po zakupie. Jak ocenić poziom adaptacji? Cennych danych o technice adaptacji może dostarczyć już łatwy do szybkiego sprawdzenia sposób spolszczenia konwersacji. Oto kilka przykładowych pytań kontrolnych:

– Czy polskie komunikaty są naturalne, czy też wyglądają na produkty Madejowego łoża? Wymiana znaków w komunikatach metodą 1:1 jest prymitywnie prosta, ale daje efekty trudne do zaakceptowania dla osób o pewnej wrażliwości językowej. Widać to zwłaszcza w krótkich napisach, złożonych z pojedynczych słów. Jeśli polski odpowiednik jest nie dłuższy niż angielski oryginał, to pół biedy (np. file = plik, error = błąd). W przeciwnym razie – tragedia (np. end, run, key). Aby ten problem rozwiązać, trzeba znacznie więcej wysiłku. Na ogół nie obejdzie się bez przesuwania lub kompresji fragmentów kodu, albo przynajmniej reorganizacji wskaźników (najpierw trzeba je znaleźć!). Niekiedy konieczna jest rekonstrukcja całego bloku programu.

– Czy program dopuszcza odpowiedzi: Tak/Nie zamiast np. Yes/No? To dobry sprawdzian, gdyż przeróbka taka jest wprawdzie z reguły dość prosta, ale wymaga już elementarnej znajomości języka maszynowego. Nierozwiązanie tego problemu jest świadectwem haniebnego partactwa.

– Wiele programów pozwala wybrać opcję w menu nie tylko przez jej podświetlenie, ale i przez podanie pierwszej litery nazwy, co znakomicie ułatwia obsługę. Jeśli przerobiono tylko napisy w menu nie interesując się mechanizmem wyboru opcji, to wynik może być wysoce irytujący.

– Czy program zapewnia operowanie polskimi znakami na ekranie i w wydrukach bez potrzeby przeróbki sprzętu? Jeżeli program pracuje w trybie graficznym, to zwykle zawiera własne wzorce czcionki, które można znaleźć i przerobić.

W programach obsługujących ekran w trybie znakowym sprawa jest trudniejsza. Wymiana sprzętowego generatora znaków w komputerze lub drukarce znakomicie ułatwia życie programiście, ale niestety nie użytkownikowi. Można spróbować całkowicie przerobić mechanizmy obsługi ekranu, tak aby program funkcjonował w trybie graficznym. Niestety, większość zaawansowanych aplikacji wpisuje dane wprost do pamięci obrazu. Przeróbka jest wtedy bardzo żmudna i skomplikowana, gdyż konieczne jest nie tylko uchwycenie wszystkich fragmentów programu, w których bezpośredni dostęp do pamięci obrazu ma miejsce (może ich być kilkadziesiąt!), ale i napisania własnych, zastępczych procedur obsługi ekranu. Co więcej, aby program nie działał ślamazarnie, procedury te muszą być starannie optymalizowane pod kątem szybkości pracy. Metodę tę zastosowano m.in. przy spolszczaniu dBase III+ (dBASE POLONUS).

1. A screen from dBASE POLONUS: polish letters were obtained by changing screen mode from text to graphical. Instead of increased intensity – bolder face.
1. A screen from dBASE POLONUS: polish letters were obtained by changing screen mode from text to graphical. Instead of increased intensity – bolder face.
Nie we wszystkich programach przeróbka na tryb graficzny jest zresztą możliwa. Przykładem są liczne programy rezydujące, jak np. SideKick, które muszą koegzystować z innymi programami. W ich przypadku wymiana generatora znaków faktycznie jest konieczna.

Jeżeli adaptacja dopuszcza stosowanie polskich liter, powinna także umożliwić ich wprowadzanie z klawiatury, np. za pomocą osobnego, rezydującego programu obsługi.

W przypadku edytorów tekstów, arkuszy kalkulacyjnych, baz danych itd. dochodzą następne, ważkie pytania:

– Czy program sortuje i indeksuje alfabetycznie z uwzględnieniem polskich liter? Pytanie to dotyczy nie tylko baz danych; w większości arkuszy kalkulacyjnych i w wielu edytorach tekstu także występują elementy sortowania (np. przy tworzeniu skorowidza).

– Czy spolszczony program potrafi automatycznie zamieniać małe polskie litery na duże i odwrotnie, tak jak czyni to z literami alfabetu angielskiego? Ten pozornie błahy problem jest w istocie ważniejszy niż sortowanie według polskiego alfabetu. Tak np. błędnie działająca funkcja UPPER i LOWER w adaptacji dBase III+ może skutecznie uniemożliwić odnalezienie w bazie danych nazwisk: Łabudek i Bączek (wystarczy napisać: łabudek i BĄCZEK).

– Czy program rozpoznaje polskie znaki diakrytyczne jako litery? Czy poprawnie rozpoznaje litery duże i małe? Przykład: funkcje ISALPHA, ISLOWER i ISUPPER w DBase III+.

Jak to się robi?

Z wyjątkiem operacji najprostszych, jak spolszczenie meldunków, opcji menu i odpowiedzi Tak/Nie, pozostałe wymagają z reguły głębokiej ingerencji w kod programu. Jakimi narzędziami wykonuje się takie przeróbki? Otóż nie jest to tylko prywatna sprawa wykonawcy przeróbek: rodzaj użytego narzędzia istotnie wpływa na jej rzetelność. Na początek generalna zasada: stosowanie do przeróbek dużych programów wyłącznie odpluskwiacza (ang. debugger) lub podobnie prymitywnego narzędzia (PCTOOLS itd.) dyskredytuje wykonawcę, nie dlatego, że jest to “w złym tonie”, ale że przeróbka jest niewiarygodna.

Nawet przy przerabianiu samych napisów w tekście metodą 1:1 palec może zbłądzić i zmodyfikować któryś ze wskaźników albo rozkazów. Człowiek jest “urządzeniem” stochastycznym i nie zawsze może utrzymać koncentrację uwagi – zwłaszcza gdy praca jest nużąca i monotonna (a czymże jest przerabianie napisów?). Jakże łatwo jest np. przeoczyć bajt zerowy, oddzielający dwa łańcuchy, i wpisać w jego miejsce spację? Mówimy tu tylko o błędach przypadkowych. Szereg błędów jest wynikiem błogiej niewiedzy. Mój znajomy po przeróbce napisu w pewnym programie bardzo się dziwił, że program przestał funkcjonować. Przyczyna: ogranicznikiem napisu był znak $, jak tego wymaga funkcja usługowa nr 9 MS-DOS. Znajomy sądził, że ogranicznikiem musi być bajt zerowy, i skwapliwie zastąpił “zbędny” symbol $ innym znakiem. Za napisem występowały co prawda bajty zerowe, ale był to zupełny przypadek...

Aby móc sprawnie i bez ryzyka “głupich” błędów przerabiać duży program, potrzebne są odpowiednie narzędzia programistyczne, nieraz dość wymyślne. Programy te z grubsza można podzielić na 2 grupy:

  • służące do analizy, “rozgryzania” programu,
  • służące do właściwej modyfikacji kodu programu.

Jeśli idzie o programy analityczne, często można posłużyć się gotowymi odpluskwiaczami (AFD, Periscope itd.). Ładujemy SideKick, a następnie np. AFD i śledzimy pracę programu krok po kroku, protokołując i natychmiast opisując rozszyfrowane fazy pracy w SideKicku, wykorzystując jego funkcję importu danych z ekranu i wbudowany edytorek. SideKick pozwala na bieżącą korektę notatek, co jest o tyle cenne, że pierwsza analiza rzadko jest w pełni trafna – po zbadaniu kolejnych partii programu wyniki trzeba zweryfikować. W praktyce analiza programu zazwyczaj odbywa się równolegle na dwóch komputerach, z których jeden często bywa “dozbrajany” w sprzęt wspomagający śledzenie pracy programu maszynowego.

Twórcy wielu programów zadali sobie jednak sporo trudu, aby obrzydzić życie włamywaczom, używającym klasycznych odpluskwiaczy. Program taki prowadzi dynamiczne zmiany wektorów przerwań używanych przez odpluskwiacz, nr 2 i 3, kontroluje wektor przerwań klawiatury (INT 9), co i raz wykonuje ekwilibrystyczne skoki z modyfikacją rejestrów segmentowych – wszystko po to, aby “oślepić” odpluskwiacz. Wtedy trzeba sięgać po oprogramowanie specjalne, często tworzone do jednorazowego użytku.

2. EDPOL (polonized WINDOWS WRITE) i GRAFIK (polonized WINDOWS PAINT) on the desktop of fully polonized system MS-WINDOWS.
2. EDPOL (polonized WINDOWS WRITE) i GRAFIK (polonized WINDOWS PAINT) on the desktop of fully polonized system MS-WINDOWS.
Dotychczas milcząco zakładaliśmy, że mamy do czynienia z “czystym” programem maszynowym, wygenerowanym np. przez kompilator języka C lub Pascal lub przez makroasembler. Niestety, analiza na poziomie języka maszynowego nie zawsze wystarcza. Oto przykład. Podczas analizy programu MS-WORD 3.0 z zamiarem jego spolszczenia (PELIKAN) okazało się, że wszystkie podstawowe funkcje nie są wprost realizowane przez program maszynowy, ale przez maszynę wirtualną, operującą językiem podobnym do języka FORTH. Cóż było robić: najpierw trzeba było ów język rozszyfrować, a potem – napisać odpowiednie oprogramowanie do analizy zapisanych w nim procedur, zawartych w programie MS-WORD. Analiza cudzego programu może być sama w sobie pasjonującym przeżyciem i okazją do wzbogacenia własnego warsztatu programistycznego (ach, jak cudownie byłoby mieć wersje źródłowe!). Czasem też udaje się poprawić błędy w programie oryginalnym.

Oprogramowanie do modyfikacji kodu najczęściej jest pisane dla spolszczania jednego, określonego programu. W programach graficznych jednym z głównych zadań jest ewentualna przeróbka wzorców czcionek, do której trzeba sporządzić stosowny edytor. Pół biedy, jeżeli wzorce czcionek są zapisane w modułach o stałych rozmiarach, np. po 8, 12 lub 14 bajtów na znak. W bardziej zaawansowanych programach występuje jednak pismo proporcjonalne, w dodatku o różnych rozmiarach i dość wymyślnie zakodowanych wzorcach. Nie zawsze są to wzorce matrycowe – trafiają się też i wektorowe. Za przykład niech posłuży spolszczanie systemu WINDOWS z programem PageMaker. W sumie trzeba było zmodyfikować ok. 110 kompletnych zbiorów wzorców czcionki różnych krojów i rozmiarów – w każdym po 18 znaków. Większość to kroje proporcjonalne, część – wektorowe. Napisany specjalnie do tego celu edytor liczy ok. 3500 wierszy programu pascalowego.

Wyższa szkoła jazdy

Najtrudniejsze są modyfikacje kodu programu. Większość modyfikacji w kodzie programu prowadzi do wzrostu jego złożoności. Skąd wziąć miejsce na dodatkowe rozkazy? Jeżeli miejsca nie trzeba zbyt wiele, a program był kompilowany z języka wysokiego poziomu, drogą starannej optymalizacji kodu udaje się przeważnie wygospodarować potrzebne kilka do kilkudziesięciu bajtów, co wystarcza tylko na drobne poprawki. Jeżeli trzeba dołączyć procedury o większych rozmiarach, konieczne jest zgrupowanie tych procedur w osobnym pliku, ładowanym do pamięci przed uruchomieniem programu zasadniczego. Najprostsza i dość efektywna metoda zapewniania łączności programu z procedurami dodatkowymi polega na wykorzystaniu zbywających wektorów przerwań programowych.

Twórcy niektórych programów byli tak uprzejmi, że wydzielili fragmenty istotne z punktu widzenia dialogu z użytkownikiem w osobne pliki. W idealnym przypadku teksty występują tam wraz z tablicami wskaźników lub są zorganizowane jako lista. Wtedy można pokusić się o skompilowanie tego fragmentu programu od nowa, co jest rozwiązaniem najpewniejszym i najwygodniejszym, gdyż nie nakłada ograniczeń na rozmiar meldunków. Przedtem trzeba jednak “rozgryźć” dokładnie strukturę danych w takim pliku i zmajstrować odpowiedni kompilator...

Większość programistów nie myśli niestety o biednych włamywaczach i wkomponowuje meldunki wprost w kod programu. Na szczęście meldunki te tworzą często zwarty blok (bloki) o dającej się rozpoznać strukturze, co pozwala zastosować metodę rekompilacji. Tym razem jednak objętość bloku jest limitowana. Jak poradzić sobie ze wzrostem objętości meldunków? Metoda najprostsza polega na skróceniu meldunków mało istotnych i występujących sporadycznie i oddaniu wygospodarowanej pamięci meldunkom częstym i ważnym. W praktyce często okazuje się, że wiele meldunków w programie jest prawie lub całkowicie identycznych. Można wtedy pozostawić w nim tylko jedną kopię takiego meldunku, a wskaźnik do niego wpisać zamiast wskaźników meldunków podobnych. Przed takim manewrem trzeba jednak rozpoznać, czy wszystkie meldunki należą do jednego segmentu, gdyż w przeciwnym razie...

3. A sample screenshot from DRUKARNIA – polonized PageMaker system. It was necessary to change whole 110 fonts...
3. A sample screenshot from DRUKARNIA – polonized PageMaker system. It was necessary to change whole 110 fonts...
Przerabiając duży program trzeba pamiętać, że globalna objętość meldunków sięga kilkudziesięciu kilobajtów, a razem z suflerem (helpem) – stu kilkudziesięciu i więcej... Należy też liczyć się z tym, że edycję trzeba będzie wielokrotnie ponawiać. Najlepsza metoda polega na pisaniu nowego bloku meldunków za pomocą standardowego edytora tekstu, jego kompilacji i wstawieniu w przerabiany program za pomocą skonstruowanego w tym celu narzędzia programistycznego. Zaletą tej metody, oprócz komfortu pracy i możliwości skupienia się na tekście zamiast na liczeniu bajtów, jest gwarancja prawidłowej struktury rekompilowanego modułu programu. O ile oczywiście nie spartaczyliśmy naszego kompilatora i wyposażyliśmy go w odpowiednią diagnostykę błędnej struktury kompilowanych tekstów...

Dodatkowym, choć nie całkiem oczywistym urokiem modyfikacji meldunków i menu jest konieczność wymyślania sensownych odpowiedników dla specyficznych terminów angielskich. Jak np. zwięźle nazwać po polsku clipboard, croptool lub kerning? Autorowi spolszczenia programów nowej generacji przypada rola pioniera terminologii oraz pewność, że cokolwiek wymyśli, dostarczy innym jakże lubej pożywki do krytyki.

Przerabianie meldunków byłoby mimo wszystko miłym zajęciem, gdyby nie fakt, iż czasem są one skomprymowane – często powtarzające się frazy, albo nawet sylaby, są reprezentowane w meldunkach przez jedno- lub dwubajtowe kody. Wtedy najpierw należy rozpoznać i przekonstruować słownik fraz, a dopiero potem przystąpić do rekonstrukcji samych meldunków. Bez odpowiednich narzędzi do edycji i rekompilacji nie da się tutaj wiele wskórać.

4. Polonized MS-Windows.
4. Polonized MS-Windows.
W nowoczesnych programach z rozbudowanym dialogiem graficznym oprócz przerabiania meldunków trzeba często modyfikować piktogramy (np. zamiana stylizowanego rysunku litery R (right) na P (prawo) i ilustracje z wrysowanymi obcojęzycznymi napisami). Bez specjalnego edytora – ani rusz. Często jednak wysiłek włożony w narzędzie programistyczne opłaca się. Tak np. po zakończeniu żmudnych i obfitujących w potknięcia prac nad edytorem menu, okien dialogowych i komunikatów do PageMakera okazało się, że po drobnych przeróbkach nadaje się on także do przeróbek innych aplikacji systemu WINDOWS. W konsekwencji prace nad edytorem-rekompilatorem trwały wiele miesięcy, ale za to właściwa przeróbka prostszych aplikacji WINDOWS trwała po 2-5 dni – łącznie ze wstępnym testowaniem. Graficzny edytor pól dialogowych pozwolił w ciągu kwadransa całkowicie przerobić dowolne okienko dialogowe, ze zmianą rozmiarów i położenia poszczególnych pól i samego okienka włącznie.

Jak widać, porządna adaptacja programu wymaga zarówno odpowiedniego uzbrojenia technicznego, jak i – a może przede wszystkim – know-how. Aby biegle odczytywać kod maszynowy, trzeba mieć solidną praktykę w samodzielnym pisaniu programów asemblerowych, aby umieć na podstawie skompilowanego kodu programu w C lub Pascalu rozszyfrować sens poszczególnych procedur i zarys struktury danego fragmentu programu w języku źródłowym, oprócz wyobraźni potrzebna jest wprawa w pisaniu programów w tych językach, a przede wszystkim – znajomość stosowanych algorytmów i metod programowania. Przydaje się też wiedza o samych kompilatorach, zwłaszcza zaś o generacji kodu.

Powierzchownej adaptacji napisów może przy odrobinie szczęścia podjąć się nawet partacz. Natomiast gruntowna i konsekwentna adaptacja programu to mordercza harówka, o wielkim stopniu trudności.

Jako ilustracja pracochłonności głębokiej adaptacji programu niech posłuży MS-WORD – PELIKAN. Prace nad nim trwały prawie 8 miesięcy, z czego 3 poświęcono na analizę kodu, ponad 2 – na stworzenie oprogramowania modyfikującego, sama przeróbka trwała 3 tygodnie, resztę czasu poświęcono na testowanie i poprawki. W fazie analitycznej sporządzono bogato skomentowane zapisy programu, będące wynikiem analizy programu maszynowego i programu w języku maszyny wirtualnej, o łącznej objętości prawie 400 KB (w wersji ostatecznej – korekt nikt nie zliczy). Ogólna objętość oprogramowania do analizy i modyfikacji kodu przekroczyła objętość samego oryginału WORD 3.0 (fakt faktem, nikt nie troszczył się o optymalność tego oprogramowania).

Roland Wacławek

Źródło: “Komputer,” popularny miesięcznik informatyczny, nr 2/89 (35), str. 29-31



Page added on 1st April 2003.

Copyright © 2002-2005 Marcin Wichary