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:
- Opracowany ponad 20 lat temu
- Deweloper wycofał się 10 lat temu
- Aplikacja GUI
- Działa autonomicznie
- 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?
Odpowiedzi:
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.
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.
źródło
subprocess.run()
.PIPE
stałą. W przeciwnym razie nie zrobisz tego i zostanie odrzucony. Co tam zrozumieć?Shell
wywoł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.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
.exe
pliku 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ł
.exe
przestanie 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.
źródło
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.
źródło
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ą.
źródło
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.
źródło
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.
źródło
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ć.
źródło
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.
źródło