Як змінити вихід програми, для якої у вас немає вихідного коду


89

У нашій компанії у нас є невелика програма (розмір .exe 500Kb), яка робить математичний обчислення, і врешті-решт вона викладає результат на таблицю Excel, яку ми використовуємо для продовження робочого процесу.

Я хочу змінити стовпці, формат інтервалу та додати логіку VBA і т.д. на таблицю Excel, але оскільки ці параметри не налаштовуються в цій програмі, мені здається, єдиний спосіб змінити це - руйнування / повернення інженера .exe

Ніхто не знає, на якій мові вона була запрограмована, єдине, що ми знаємо:

  1. Розроблений 20+ років тому
  2. Розробник вийшов на пенсію 10 років тому
  3. Застосування графічного інтерфейсу
  4. Працює окремо
  5. Розмір 500Kb

Будь-які пропозиції, які варіанти у мене є для вирішення подібних проблем? Чи є зворотна інженерія єдиним варіантом, чи є кращий підхід?


149
Чи знаєте ви, який розрахунок він виконує? Якщо так, напишіть нову програму, просуньте кілька тестових даних, щоб перевірити, чи працює нова, те саме, а потім викиньте стару. Потім внесіть зміни, які ви хочете внести.
Девід Арно

13
Коментар @DavidArno стане гарною відповіддю. Можлива зворотна інженерія, але переосмислення та перезапис програми буде набагато дешевше / простіше / швидше.
Ден Пішельман

44
Інший спосіб змінити його - це взяти результат, який виробляє оригінальна програма, і відфільтрувати його до того, що вам потрібно.
Blrfl

9
@Alec, якщо ви відкриєте .exe за допомогою шестигранного редактора, ви можете отримати підказки про те, про що було написано. Наприклад, ім’я компілятора може бути вбудовано. Звідти ви дізнаєтесь більше про можливі варіанти декомпіляції.
гросмайстерB

26
Крім того, ви можете спробувати знайти джентльмена, який написав заявку, і побачити, чи бажає він приїхати на день-два (можливо, пару годин щодня) в якості консультанта. Якщо він пенсійний розробник, є помірний шанс, що він може оцінити невелику витрату грошей з розрахунку 100-150 доларів / год.
RLH

Відповіді:


234

Зворотна інженерія може стати дуже важкою, навіть більше, якщо ви не просто хочете зрозуміти логіку програми, а змінити і перекомпілювати її. Тому перше, що я спробую, це шукати інше рішення.

Я хочу змінити стовпці, формат інтервалу і додати логіку VBA і т.д. в таблиці Excel

Якщо це єдине, що ви хочете, і розрахунок, зроблений програмою, чудовий, чому б не написати програму на обраній вами мові (можливо, макрос Excel), яка називає ваш спадщину "exe", приймає вихід і обробляє його далі.


9
Чому нова програма повинна викликати старий EXE? Чому б просто не зробити нову програму незалежною, а потім написати сценарій, який викликає і координує вихід і вхід? Мій досвід говорить про те, що дозволяти мови командного рядка, такі як bash, PowerShell або командний рядок, керувати координатами процесу, як правило, простіше, ніж намагатися кодувати його самостійно необхідною мовою. В іншому випадку +1.
jpmc26

8
@ jpmc26: Це правда, поки вам не доведеться мати справу з абсурдними правилами цитування Баша. Так, вони (в основному) сумісні з POSIX. Ні, вони не мають жодного проклятого сенсу. Наприклад, $ FOO не повинен розділяти слова.
Кевін

16
@ jpmc26: Особисто я ніколи не мав жодних проблем subprocess.run().
Кевін

3
@ jpmc26: Які трубопроводи? Це чиста кулінарна книга; якщо ви хочете stdout, ви передаєте магічну PIPEконстанту. В іншому випадку ви цього не зробите, і це буде відкинуто. Що тут розуміти?
Кевін

3
... Я мушу додати, що я раніше використовував Excel з VBA як інтерфейс для утиліти командного рядка дуже успішно не раз. Структура завжди однакова: аркуш для введення параметрів як "інтерфейс бідної людини", кнопка "Пуск" на цьому аркуші. У коді VBA потрібен Shellдзвінок у Excel VBA на зразок цього: stackoverflow.com/questions/8902022/… , можна передавати stdout / stderr з утиліти cmd в окремі файли, а потім застосувати формат виводу.
Док Браун

114

На додаток до вже даних відповідей Док Браун та Теластин, я хотів би запропонувати альтернативний підхід (за умови, що це місія критична).

Якщо ви не знаєте обчислень, які вони виконують, і обчислення є (дещо) критично важливими: виконайте оригінальну логіку у .exeфайлі будь-якими необхідними засобами. Розшифруйте його, використовуючи декомпілятор / розбирач, як IDA, якщо це необхідно. При необхідності найміть консультанта (або партію консультантів).

Звичайно, попрацюйте зараз, використовуючи їх рішення, але не дозволяйте.

Причина, яку я пропоную, полягає в наступному: Ви визнали, що розрахунки дуже складні (за словами інженера, з яким ви говорили). Це також важливо для місії. Тож якщо якийсь оригінал .exeприпиняє свою роботу через зміни платформ, які у вас є (можливо, 16-розрядна підтримка відпадає?), Ви просто втратили критично важливу інформацію .

Тепер я переймаюся не втратою .exe, а втратою знань, які вона кодує. Ці знання потрібно відновити.

Як і раніше: якщо ці знання вже доступні, обов'язково запишіть їх у такому форматі, що він не буде втрачений найближчим часом. В іншому випадку відновіть його і запишіть.


14
Сучасні декомпілятори насправді створюють код, який зазвичай є досить розбірливим, особливо якщо початкове джерело було на звичайному C або асемблері, а не на мові вищого рівня.
фірфокс

4
Дуже хороший момент. Також: просто виправити його так, щоб він знову працював, працюватиме лише до наступного виправлення.
Даніель Жур

33
@phyrfox 20 років ... розробник вийшов на пенсію 10 років тому ... єдиний вихід - це таблиця Excel ... Я б поклав гроші на це як додаток VB6.
J ...

10
@micaho: або компанія все ще існує, і людина, яка має ноу-хау для перевірки результатів та прихованих припущень, щойно потрапила у вантажівку. Звичайно, це бізнес-ризик, тому в кінцевому підсумку повинні вирішити зацікавлені сторони. Я просто хотів підкреслити, що "обгортка" буде працювати зараз, але лише додає технічної заборгованості.
Джордж Постмус

22
@J ...: Якщо це VB6, то оригінальний плакат пощастить. Ви можете відновити вихідний код з компіляції VB6 досить легко.
Ерік Ліпперт

74

По можливості запитайте оригінального програміста.

Кілька тижнів тому до мене звернулася фірма, з якою я працював 10 років тому, з тим самим питанням щодо файлу mdb, розробленого в середині 90-х.


52
Це справжній низько висячий плід. Кожен (включаючи мене) романтизує використання жорстких навичок програмування, таких як зворотна інженерія, повторне доповнення функціональності програми або додавання шарів до обробки даних. Насправді найкраще почати - це доброзичливий електронний лист, який може повернутися за годину з розташуванням вихідного коду чи іншим ідеальним рішенням.
користувач1717828

2
Коли вдома з програмою на 10 років я теж запускаю розбиральник, але в робочий час мета інша ^^
Паоло

2
Ви щось згадали про це? :)
Ángel

2
звичайно! на жаль, компанія проходить 3 придбання та злиття, тому багато інформації загубилося, а частина резервних копій була у загубленому мішку ... розробка була на їхніх машинах, тому у мене немає копії джерела, і все.
Паоло

1
Скануйте EXE на предмет вбудованих рядків, які можуть містити ім'я розробника чи щось подібне. Це простіше, ніж повне розбирання!
JDługosz

55

Будь-які пропозиції, які варіанти у мене є для вирішення подібних проблем?

Якщо все, що ви шукаєте, - це змінити вихід, то чому б просто не використовувати композицію?

Замість зміни чорного ящика ви не можете легко отримати доступ, ви створюєте нову програму , яка приймає вихідний сигнал Excel, і робить ваше форматування / колонки змінюється занадто . Тоді ви можете зробити новий exe / скрипт, який викликає дві програми в порядку, тож кінцевому користувачеві здається, що є лише одна програма, яка виконує всю роботу - навіть якщо це два чіткі кроки під кришкою.


2
@Alec - чи підходить мова чи ні в основному залежить від кількості даних, які потрібно обробляти / кількості обчислень, які вам потрібно зробити. Якщо обоє низькі, Java - це добре. Якщо будь-яка з них є критичною, краще перейти до C або C ++. Але оскільки ви, здається, використовуєте лише кількість даних, яка так чи інакше вписується в таблицю Excel, я не думаю, що для залучення яви є поганий вибір даних (Excel, швидше за все, вибухне, перш ніж ваш додаток зробить).
cmaster

18
@cmaster ідея, що Java забороняє для важких обчислень, є застарілим поняттям. Найгірший тест , перераховані тут навіть не 4x (більшість з них 2x або менше) , і якщо одна цифра скалярная ваша точка ломка, економія в безпеки (які переводять безпосередньо в долари розробників) більш ніж ймовірно , буде компенсувати падіння продуктивності .
corsiKa

8
@Alec будь-яка мова буде працювати. VBA здається хорошим вибором, оскільки він уже так добре інтегрується з Excel.
Людина капітана

4
@corsiKa Це повністю залежить від масштабу вашої заявки. Якщо на один запуск витрачається кілька десятків тисяч процесорних годин, коефіцієнт 2 або 4 стає заборонним: це перекладається безпосередньо на кількість результатів, які можна отримати з багатомільйонної машини. Крім того, такі програми, як правило, працюють у режимі замкового кроку, тому збирання сміття є чистою отрутою для їх роботи, невеликі перерви збільшуються на кількість процесів. Кажу вам, такі програми існують, і вони, звичайно, не написані на Java. Вони просто не використовуються середнім Інтернет-бізнесом.
cmaster

7
@cmaster Ми говоримо про кілька простих розрахунків, а не про повноцінний ігровий двигун AAA з глобальним освітленням у реальному часі, фізично виходячими рендерінгами, анімованими осколками мізерних вокселів, універсальним моделюванням фізичного поля тощо. Без образи, але вставляти будь-який аргумент продуктивність RE тут погано. Зручність у використанні має бути №1, і тому, хто використовує C ++ протягом декількох років, це остання мова, яку я рекомендував би в цьому випадку.

3

Є компанії, які спеціалізуються саме на такій проблемі. Вони використовують власницький код для декомпіляції нативного коду на мову високого рівня, а потім застосовують досвід людини, щоб зробити його корисним (наприклад, даючи змінним відповідні імена).

Деякі роки тому мій роботодавець використовував це для міграції деякого нативного коду основного кадру S / 390 на сервери Linux. Ми дали їм двійковий код, вони дали нам вихідний код у С.

Чи потрібно це у вашому випадку, залежить від вас. Якщо ви дбаєте лише про формат виводу, ви можете просто масажувати результат після його отримання. Однак, як зазначають інші, наявність бізнес-логіки, прихованої у двійковій краплі, може бути постійним ризиком.


3

Напишіть просту обгортку навколо програми, фіксуючи її вихід. Це не так складно, оскільки для багатьох мов (наприклад, Java , C ++ , Python , .NET ) є засоби. Проаналізуйте вихід і сформуйте інший, у потрібній формі. Користувач зателефонує до вашої нової програми. Старий виконуваний файл залишиться поруч із ним, або навіть його можна автоматично витягти з ресурсу, перш ніж викликати його.

Таке рішення, звичайно, працює досить добре лише тоді, коли вихід добре структурований і простий для розбору.

Те, що це програма GUI, не є проблемою блокування. Ви можете запустити його, генерувати висновок, а потім автоматично опублікувати його, коли ця GUI припиняється.


3
Чим це відрізняється від голосової відповіді Дока Брауна?
Лаф

Я не згоден з припущенням, що відповідь Дока написана погано. Це чітко і лаконічно.
Щогли

1
Якщо ви подивитесь на текст цієї відповіді, ви побачите, що єдина інформативна частина складається саме в кінці останнього речення, "яке називає вашу спадщину" exe ", приймає висновок і обробляє його далі".
h22

2
Не попутник, і не розумію, чому це знову -3 ... це мета знову? але окремо я б радив не бабувати чужої відповіді на те, що "містить багато благ, що розбавляє мозок", коли (А) це суб'єктивне судження і (В) в моїй суб'єктивній думці, ваше містить саме це!
підкреслюй_31

Це також можна переписати, оскільки "містить неінформативні загальні бесіди, які просто відволікають тему від втрати часу читачів", якщо такий спосіб виглядає більш корисним. Надає підказку на правильний підхід на другу половину останнього речення. Це не мало наміру ображати. Коментар видалено
h22

1

Напишіть декілька тестів, які виконують якомога більше випадків на старому коді. Знайдіть кутові регістри, тестуйте неправильний ввід та перевіряйте правильність введення.

Запишіть правильний вихід у різних випадках, а потім спробуйте написати реалізацію, яка задовольняє однакові тести .

Я не ходив би по зворотному інженерному шляху. Повернути машинний код надзвичайно складно, і ви вже повинні знати, яка мета exe. Зворотна інженерія - це занадто велика робота для того, що ви хочете.

Якщо програмне забезпечення було розроблене одним хлопцем 20 років тому, це, мабуть, не те, що вимагає багато сучасної влади. Програма GUI, яка розтягнула машину 20 років тому, ледве зареєструється на сучасній машині, тому ви, мабуть, дивитесь на те, що відтворити відносно просто.


0

Спробуйте повернути інженеру exe. Тільки для того, щоб знайти логіку обчислень або принаймні отримати справедливий натяк на те, що вона насправді робить, і якщо ваша зворотна інженерія може довести вас до цього моменту, ви можете написати нову заявку на основі цієї логіки обчислення. Крім цього, я не бачу іншого виходу.

Простіше сказати, ніж зробити, реверс-інженер, створений 20 років тому, є справжньою проблемою.


12
Знайомство з exe насправді не має значення
Анхель,

1
Насправді, коли оптимізатори стають розумнішими з кожним роком, реверсивна інженерія лише стає складніше.
MSalters
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.