Jak zmodyfikować wyjście programu, dla którego nie masz kodu źródłowego

89

W naszej firmie mamy mały program (rozmiar .exe 500Kb), który wykonuje obliczenia matematyczne, a na koniec wyrzuca wynik do arkusza kalkulacyjnego Excel, którego używamy do kontynuowania naszego przepływu pracy.

Chcę zmodyfikować kolumny, format odstępów i dodać logikę VBA itp. W arkuszu kalkulacyjnym Excel, ale ponieważ tych parametrów nie można konfigurować w tym programie, wydaje mi się, że jedynym sposobem na modyfikację jest rozbicie / przywrócenie kodu .exe

Nikt nie wie, w jakim języku został zaprogramowany, jedyne, co wiemy, to:

  1. Opracowany ponad 20 lat temu
  2. Deweloper wycofał się 10 lat temu
  3. Aplikacja GUI
  4. Działa autonomicznie
  5. Rozmiar 500Kb

Wszelkie sugestie, jakie opcje mam do czynienia z tego rodzaju problemami? Czy inżynieria odwrotna jest jedyną opcją, czy jest lepsze podejście?

Alec
źródło
149
Czy wiesz, jakie obliczenia wykonuje? Jeśli tak, napisz nową aplikację, przepchnij niektóre dane testowe przez oba, aby sprawdzić, czy nowa działa tak samo, a następnie wyrzuć starą. Następnie wprowadź zmiany, które chcesz wprowadzić.
David Arno
13
Komentarz @DavidArno byłby dobrą odpowiedzią. Odwrotna inżynieria jest możliwa, ale ponowne specyfikowanie i przepisywanie aplikacji będzie znacznie tańsze / łatwiejsze / szybsze.
Dan Pichelman
44
Innym sposobem na zmodyfikowanie tego byłoby pobranie wyniku wygenerowanego przez oryginalny program i przefiltrowanie go w dowolny sposób.
Blrfl
9
@Alec, jeśli otworzysz .exe za pomocą edytora szesnastkowego, możesz uzyskać wskazówki na temat tego, w czym został napisany. Na przykład, nazwa kompilatora może być osadzona. Stamtąd dowiesz się więcej o możliwych opcjach dekompilacji.
GrandmasterB
26
Ewentualnie możesz spróbować znaleźć dżentelmena, który napisał aplikację, i sprawdzić, czy jest gotów przyjść na dzień lub dwa (może kilka godzin dziennie) jako konsultant. Jeśli jest emerytowanym programistą, istnieje spora szansa, że ​​może docenić trochę wydawania pieniędzy w wysokości 100-150 USD / godz., Jednocześnie ciesząc się chwilą odrobiny pracy przez krótki okres czasu.
RLH

Odpowiedzi:

234

Inżynieria wsteczna może stać się bardzo trudna, tym bardziej, jeśli nie tylko chcesz zrozumieć logikę programu, ale zmienić ją i ponownie skompilować. Więc pierwszą rzeczą, której spróbowałbym, jest poszukiwanie innego rozwiązania.

Chcę zmodyfikować kolumny, format odstępów i dodać logikę VBA itp. W arkuszu kalkulacyjnym Excel

Jeśli to jedyna rzecz, której chcesz, a obliczenia wykonane przez program są w porządku, to dlaczego nie napisać programu w wybranym języku (być może makrze Excela), który nazywa twoje starsze „exe”, pobiera dane wyjściowe i przetwarza je dalej.

Doktor Brown
źródło
9
Dlaczego nowy program musi wywoływać stary plik EXE? Dlaczego nie uczynić nowego programu niezależnym, a następnie napisać skrypt, który wywołuje oba i koordynuje dane wyjściowe i wejściowe? Z mojego doświadczenia wynika, że ​​zezwolenie na obsługę języków wiersza poleceń, takich jak bash, PowerShell lub wiersz poleceń, jest na ogół prostsze niż próba samodzielnego kodowania go w języku imperatywnym. W przeciwnym razie +1.
jpmc26
8
@ jpmc26: To prawda, dopóki nie będziesz musiał poradzić sobie z absurdalnymi zasadami cytowania Basha. Tak, są one (w większości) zgodne z POSIX. Nie, nie mają żadnego cholernego sensu. $ FOO nie powinno na przykład dzielić słów.
Kevin
16
@ jpmc26: Nigdy osobiście nie miałem problemów z telefonowaniem subprocess.run().
Kevin
3
@ jpmc26: Jakie orurowanie? To czysta książka kucharska; jeśli chcesz stdout, przekazujesz magiczną PIPEstałą. W przeciwnym razie nie zrobisz tego i zostanie odrzucony. Co tam zrozumieć?
Kevin
3
... Powinienem dodać, że używałem Excela z VBA w przeszłości jako nakładki na narzędzia wiersza poleceń bardzo skutecznie więcej niż raz. Struktura jest zawsze taka sama: arkusz do wprowadzania parametrów jako „interfejs użytkownika biedaka”, przycisk „Start” na tym arkuszu. W kodzie VBA potrzebne jest Shellwywołanie w Excel VBA, takie jak to: stackoverflow.com/questions/8902022/... , można potokować stdout / stderr z narzędzia cmd do osobnych plików, a następnie zastosować formatowanie wyjściowe.
Doc Brown
114

Oprócz udzielonych już odpowiedzi przez Doktora Browna i Telastyna, chciałbym zaproponować alternatywne podejście (przy założeniu, że jest to misja krytyczna).

Jeśli nie znasz obliczeń, które wykonuje, a obliczenia mają (nieco) kluczowe znaczenie dla misji: Zmniejsz oryginalną logikę w .exepliku za pomocą wszelkich niezbędnych środków. W razie potrzeby zdekoduj go za pomocą dekompilatora / deasemblera, takiego jak IDA . Zatrudnij konsultanta (lub grupę konsultantów), jeśli to konieczne.

Jasne, obejdź to na razie, używając ich rozwiązania, ale nie pozwól, aby tak było.

Powód, który sugeruję, jest następujący: Przyznałeś, że obliczenia są bardzo złożone (według inżyniera, z którym rozmawiałeś). Ma to również kluczowe znaczenie dla misji. Jeśli więc jakoś oryginał .exeprzestanie działać z powodu zmian na posiadanych platformach (może 16-bitowe wsparcie zostanie odrzucone?), Właśnie straciłeś kluczową wiedzę .

Teraz nie martwię się o utratę .exe, ale o utratę kodowanej przez nią wiedzy. Tę wiedzę należy odzyskać.

Jak poprzednio: jeśli ta wiedza jest już dostępna, zapisz ją w formacie, który nie zostanie w najbliższym czasie utracony. W przeciwnym razie odzyskaj i zapisz.

Sjoerd Job Postmus
źródło
14
Współczesne dekompilatory faktycznie wytwarzają kod, który zwykle jest dość czytelny, szczególnie jeśli oryginalne źródło było w zwykłym C lub asemblerze, a nie w języku wyższego poziomu.
phyrfox
4
Bardzo dobra uwaga. Ponadto: po prostu załatanie go, aby działało ponownie, będzie działało tylko do momentu, gdy trzeba będzie wprowadzić kolejną poprawkę.
Daniel Jour
33
@phyrfox 20 lat ... programista przeszedł na emeryturę 10 lat temu ... tylko dane wyjściowe to arkusz kalkulacyjny Excel ... Złożyłbym na to pieniądze jako aplikacja VB6.
J ...
10
@micaho: lub firma nadal istnieje, a osoba posiadająca know-how w zakresie weryfikacji wyników i ukrytych założeń właśnie uderzyła ciężarówka. Oczywiście jest to ryzyko biznesowe, więc ostatecznie interesariusze powinni zdecydować. Chciałem tylko podkreślić, że „opakowanie” będzie teraz działać, ale tylko zwiększa dług techniczny.
Sjoerd Job Postmus
22
@J ...: Jeśli to VB6, oryginalny plakat ma szczęście. Możesz łatwo odzyskać kod źródłowy z kompilacji VB6.
Eric Lippert
74

Zapytaj oryginalnego programistę, jeśli to możliwe.

Kilka tygodni temu skontaktowała się ze mną firma, w której pracowałem 10 lat temu, z tym samym pytaniem o plik mdb opracowany w połowie lat 90.

Paolo
źródło
52
To jest prawdziwy nisko wiszący owoc. Wszyscy (łącznie ze mną) romantycznie wykorzystują trudne umiejętności programistyczne, takie jak inżynieria odwrotna, reimplementacja funkcjonalności programu lub dodawanie warstw do przetwarzania danych. W rzeczywistości najlepszym miejscem do rozpoczęcia jest przyjazny e-mail, który może wrócić za godzinę z lokalizacją kodu źródłowego lub innego idealnego rozwiązania.
user1717828
2
Kiedy jestem w domu z 10-letnią aplikacją, ja również odpalam deasembler, ale w godzinach pracy cel jest inny ^^
Paolo
2
Pamiętasz coś na ten temat? :)
Ángel
2
oczywiście! niestety firma przechodzi 3 przejęcia i scalanie, więc wiele informacji zostało utraconych, a część kopii zapasowych znalazła się w zgubionej torbie ... prace rozwojowe były na miejscu na ich komputerach, więc nie mam kopii źródła i to wszystko.
Paolo
1
Przeskanuj plik EXE pod kątem osadzonych ciągów, które mogą zawierać nazwę programisty lub coś takiego. To łatwiejsze niż pełny demontaż!
JDługosz
55

Wszelkie sugestie, jakie opcje mam do czynienia z tego rodzaju problemami?

Jeśli wszystko, co chcesz zrobić, to zmodyfikować dane wyjściowe, dlaczego po prostu nie użyć kompozycji?

Zamiast modyfikowania czarnej skrzynki nie można łatwo uzyskać dostęp, należy utworzyć nowy program, który trwa wyjście Excel, i robi swoją formatowanie / kolumna zmienia się zbyt . Następnie możesz stworzyć nowy plik exe / skrypt, który wywołuje kolejno dwa programy, więc użytkownikowi końcowemu wydaje się, że istnieje tylko jeden program, który wykonuje całą pracę - nawet jeśli są to dwa odrębne kroki pod maską.

Telastyn
źródło
2
@Alec To, czy java jest odpowiednim językiem, czy nie, zależy głównie od ilości danych, które musisz obsłużyć / ilości obliczeń, które musisz wykonać. Jeśli oba są niskie, Java jest w porządku. Jeśli jeden z nich jest krytyczny, lepiej zejdź do C lub C ++. Ponieważ jednak wydaje się, że używasz tylko danych, które i tak mieszczą się w arkuszu kalkulacyjnym Excel, nie sądzę, aby było w nich wystarczająco dużo danych, aby uczynić java złym wyborem (Excel prawdopodobnie wybuchłby, zanim zrobi to Twoja aplikacja).
cmaster
18
@cmaster pomysł, że Java nie pozwala na ciężkie obliczenia, jest przestarzały. Najgorsze odniesienia wymienione tutaj nie jest nawet 4x (w większości są 2x lub mniej), a jeśli jednocyfrowy skalarne to punkt złamania, oszczędności w zakresie bezpieczeństwa (co przekłada się bezpośrednio na dolary Developer) jest więcej niż prawdopodobne będzie zrównoważyć spadek wydajności .
corsiKa
8
@Alec dowolny język będzie działał. VBA wydaje się dobrym wyborem, ponieważ już tak dobrze integruje się z programem Excel.
Captain Man
4
@corsiKa To zależy całkowicie od skali Twojej aplikacji. Jeśli jedno uruchomienie zużywa kilkadziesiąt tysięcy godzin pracy procesora, współczynnik 2 lub 4 staje się wygórowany: Przekłada się to bezpośrednio na liczbę wyników, które można uzyskać z wielomilionowej maszyny. Ponadto takie aplikacje zwykle działają w trybie awaryjnym, więc zbieranie śmieci jest czystą trucizną dla ich wydajności, małe przerwy mnożyłyby się przez liczbę procesów. Mówię wam, takie aplikacje istnieją i na pewno nie są napisane w Javie. Po prostu nie są używane przez przeciętną firmę internetową.
cmaster
7
@cmaster Mówimy o kilku prostych obliczeniach, a nie o pełnym silniku gry AAA z globalnym oświetleniem w czasie rzeczywistym, fizycznym renderowaniem, animowanymi rzadkimi oktami wokseli, uniwersalną symulacją pola fizyki i tym podobne. Bez obrazy, ale wstawienie tutaj jakiegokolwiek argumentu Wydajność RE jest zła. Łatwość użycia powinna być nr 1, a ponieważ ktoś używa C ++ od kilku lat, jest to ostatni język, który poleciłbym w tym przypadku.
3

Są firmy, które specjalizują się właśnie w tego rodzaju problemach. Używają zastrzeżonego kodu do dekompilacji kodu natywnego na język wysokiego poziomu, a następnie wykorzystują ludzką wiedzę specjalistyczną, aby był użyteczny (np. Nadając zmiennym odpowiednie nazwy).

Kilka lat temu mój pracodawca wykorzystał to do migracji natywnego kodu komputera mainframe S / 390 na serwery Linux. Daliśmy im plik binarny, dali nam kod źródłowy w C.

To, czy jest to konieczne w twoim przypadku, zależy od ciebie. Jeśli zależy ci tylko na formacie wyjściowym, możesz po prostu masować wydruk po jego wytworzeniu. Jednak, jak zauważyli inni, ukrywanie logiki biznesowej w binarnym obiekcie blob może stanowić ciągłe ryzyko.

szczupły
źródło
3

Napisz proste opakowanie wokół programu, przechwytując jego wynik. Nie jest skomplikowane robić tak wiele języków (na przykład Java , C ++ , Python , .NET ). Analizuj dane wyjściowe i generuj kolejną, w pożądanej formie. Użytkownik zadzwoni do twojego nowego programu. Stary plik wykonywalny pozostanie obok niego, a nawet może zostać automatycznie wyodrębniony z zasobu przed jego wywołaniem.

To rozwiązanie oczywiście działa wystarczająco dobrze tylko wtedy, gdy dane wyjściowe są dobrze skonstruowane, więc można je łatwo przeanalizować.

To, że jest to aplikacja GUI, nie stanowi problemu z blokowaniem. Możesz go uruchomić, wygenerować dane wyjściowe, a następnie automatycznie zaksięgować po zakończeniu tego GUI.

h22
źródło
3
Czym różni się to od najczęściej głosowanej odpowiedzi Doc Browna?
Laf
Nie zgadzam się z założeniem, że odpowiedź Doca jest źle napisana. To jasne i zwięzłe.
Maszt
1
Jeśli zajrzysz do tekstu tej odpowiedzi, zobaczysz, że jedyna część informacyjna stanowi dokładnie koniec ostatniego zdania „, które nazywa twoje dziedzictwo„ exe ”, przenosi wyniki i przetwarza je dalej”.
h22
2
Nie jest to downvoter i nie rozumiesz, dlaczego to -3 ... jest znowu w Meta? ale osobno odradzałbym skandalowanie czyjejś odpowiedzi za „zawiera wiele rozmyślających bzdur”, gdy (A) to subiektywna ocena, a (B) w mojej subiektywnej opinii, twoja zawiera właśnie to!
underscore_d
Można to również przepisać, ponieważ „zawiera nieinformacyjne ogólne rozmowy, które odwracają uwagę od tematu marnującego czas czytelników”, jeśli w ten sposób wygląda to bardziej pomocne. Zawiera wskazówkę dotyczącą właściwego podejścia w drugiej połowie ostatniego zdania. To nie miało być obraźliwe. Komentarz usunięty.
h22
1

Napisz kilka testów, które wykonują jak najwięcej przypadków na starym kodzie. Znajdź przypadki narożne, przetestuj nieprawidłowe dane wejściowe i przetestuj prawidłowe dane wejściowe.

Określ poprawne dane wyjściowe w różnych przypadkach, a następnie spróbuj napisać implementację spełniającą te same testy .

Nie poszedłbym drogą inżynierii odwrotnej. Odwrotny kod maszynowy jest niezwykle skomplikowany i powinieneś już wiedzieć, jaki jest cel exe. Inżynieria odwrotna to trochę za dużo pracy dla tego, czego szukasz.

Jeśli oprogramowanie zostało opracowane przez jednego faceta 20 lat temu, prawdopodobnie nie jest to coś, co wymaga dużo nowoczesnej mocy. Program GUI, który rozciągnął maszynę 20 lat temu, ledwo zarejestruje się na nowoczesnej maszynie, więc prawdopodobnie patrzysz na coś, co można stosunkowo łatwo odtworzyć.

Carlos
źródło
0

Spróbuj odtworzyć exe. Tylko w celu znalezienia logiki obliczeniowej lub przynajmniej uzyskania rzetelnej wskazówki, co faktycznie robi, a jeśli Twoja inżynieria odwrotna doprowadzi cię do tego punktu, możesz napisać nową aplikację w oparciu o tę logikę obliczeniową. Poza tym nie widzę innego wyjścia.

Łatwiej powiedzieć niż zrobić, inżynieria wsteczna exe utworzona 20 lat temu jest prawdziwym wyzwaniem.

Mukesh Adhvaryu
źródło
12
Randka exe nie powinna mieć tak naprawdę znaczenia
Ángel
1
W rzeczywistości, gdy optymalizatory stają się coraz mądrzejsze z każdym rokiem, inżynieria wsteczna staje się coraz trudniejsza.
MSalters