Как изменить вывод программы, для которой у вас нет исходного кода

89

В нашей компании у нас есть небольшая программа (размером .exe 500 Кб), которая выполняет математические вычисления, и в итоге выдает результат в электронную таблицу Excel, которую мы используем для продолжения нашего рабочего процесса.

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

Никто не знает, на каком языке он был запрограммирован, единственное, что мы знаем:

  1. Разработано 20+ лет назад
  2. Разработчик удалился 10 лет назад
  3. GUI приложение
  4. Работает автономно
  5. Размер 500Кб

Любые предложения, какие варианты у меня есть, чтобы иметь дело с такими проблемами? Является ли реверс-инжиниринг единственным вариантом или есть лучший подход?

сельдь
источник
149
Вы знаете, что это за расчет, который он выполняет? Если это так, напишите новое приложение, протолкните некоторые тестовые данные через оба, чтобы убедиться, что новое работает одинаково, а затем выбросьте старое. Затем внесите изменения, которые вы хотите внести.
Дэвид Арно
13
Комментарий @DavidArno будет хорошим ответом. Обратный инжиниринг возможен, но повторная спецификация и переписывание приложения будут намного дешевле / проще / быстрее.
Дэн Пичельман,
44
Другой способ изменить его - взять результат, полученный оригинальной программой, и отфильтровать его по вашему желанию.
Blrfl
9
@Alec Если вы откроете .exe с помощью шестнадцатеричного редактора, вы можете получить подсказки о том, в чем он был написан. Например, имя компилятора может быть встроено. Оттуда вы узнаете больше о возможных вариантах декомпиляции.
GrandmasterB
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: Какой трубопровод? Это чистая кулинарная книга; если вы хотите стандартный вывод, вы передаете магическую PIPEконстанту. В противном случае, вы этого не сделаете, и это будет отброшено. Что тут понимать?
Кевин
3
... Я должен добавить, что я использовал Excel с VBA в прошлом как интерфейс для утилит командной строки очень успешно, не раз. Структура всегда одна и та же: лист для ввода параметров в виде «пользовательского интерфейса бедняка», кнопка «Пуск» на этом листе. В коде VBA требуется Shellвызов в Excel VBA, такой как: stackoverflow.com/questions/8902022/… , можно передать stdout / stderr из утилиты cmd в отдельные файлы, а затем применить форматирование вывода.
Док Браун
114

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

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

Конечно, пока обойти это, используя их решение, но не позволяйте этому быть.

Причина, по которой я предлагаю, заключается в следующем: вы признали, что расчеты очень сложны (по словам инженера, с которым вы говорили). Это также важно для миссии. Поэтому, если оригинальная .exeверсия перестает работать из-за изменений в ваших платформах (может быть, 16-битная поддержка прекращается?), Вы только что потеряли критически важные знания .

Теперь я не беспокоюсь о потере .exe, но о потере знаний, которые он кодирует. Это знание должно быть восстановлено.

Как и раньше: если эти знания уже доступны, обязательно запишите их в формате, который в ближайшее время не будет потерян. В противном случае восстановите его и запишите.

Sjoerd Job Postmus
источник
14
Современные декомпиляторы на самом деле создают код, который обычно довольно разборчив, особенно если исходный код был на простом C или ассемблере, а не на языке более высокого уровня.
phyrfox
4
Очень хороший момент. Кроме того: Просто исправьте его так, чтобы он снова заработал, только до тех пор, пока не понадобится следующее исправление.
Даниэль Жур
33
@phyrfox 20 лет ... разработчик вышел на пенсию 10 лет назад ... единственным выходом является электронная таблица Excel ... Я бы вложил деньги в нее как приложение VB6.
J ...
10
@micaho: или компания все еще существует, и человек с ноу-хау, чтобы проверить результаты и скрытые предположения, только что был поражен грузовиком. Конечно, это бизнес-риск, так что в конечном итоге заинтересованные стороны должны решить. Я просто хотел подчеркнуть, что «обертка» теперь будет работать, но только увеличивает техническую задолженность.
Sjoerd Job Postmus
22
@J ...: Если это VB6, то оригинальному постеру повезло. Вы можете легко восстановить исходный код из компиляции VB6.
Эрик Липперт
74

Спросите оригинального программиста, если это возможно.

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

Paolo
источник
52
Это настоящий низко висящий фрукт. Каждый (в том числе и я) романтизирует использование сложных навыков программирования, таких как реверс-инжиниринг, переопределение функциональности программы или добавление слоев для обработки данных. В действительности, лучшее место для начала - это дружеское письмо, которое может вернуться через час с указанием местоположения исходного кода или другого идеального решения.
user1717828
2
Когда я дома с 10-летним заявлением, я тоже запускаю дизассемблер, но в рабочее время цель другая ^^
Paolo
2
Ты что-нибудь помнил об этом? :)
Анхель
2
конечно! к сожалению, компания проходит 3 приобретения и слияния, так что много информации потеряно, и часть резервных копий была в потерянном пакете ... разработка была на месте на их машинах, поэтому у меня нет копии исходного кода и все.
Паоло
1
Сканирование EXE на наличие встроенных строк, которые могут включать имя разработчика или что-то. Это проще, чем полная разборка!
JDługosz
55

Любые предложения, какие варианты у меня есть, чтобы иметь дело с такими проблемами?

Если все, что вам нужно, это изменить вывод, то почему бы просто не использовать композицию?

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

Telastyn
источник
2
@Alec Является ли java подходящим языком или нет, зависит в основном от объема данных, которые вам нужно обработать / объема вычислений, которые вам нужно сделать. Если оба они низкие, то с java все в порядке. Если какой-либо из них является критическим, вам лучше перейти на C или C ++. Но так как вы, похоже, используете только тот объем данных, который в любом случае помещается в электронную таблицу Excel, я не думаю, что достаточно данных, чтобы сделать java неправильным выбором (Excel, вероятно, взорвется раньше, чем ваше приложение).
cmaster
18
@cmaster идея о том, что Java запрещает тяжелые вычисления, является устаревшим понятием. Худший тест , перечисленные здесь даже не 4x (большинство из них 2x или меньше) , и если одна цифра скалярная ваша точка ломка, экономия в безопасности (которые переводят непосредственно в доллары разработчиков) более чем вероятно , будет компенсировать падение производительности ,
CorsiKa
8
@ Алек любой язык будет работать. VBA кажется хорошим выбором, потому что он уже хорошо интегрируется с Excel.
Капитан Мэн
4
@corsiKa Это полностью зависит от масштаба вашего приложения. Если один прогон потребляет несколько десятков тысяч процессорных часов, коэффициент 2 или 4 становится непомерно высоким: это напрямую влияет на количество результатов, которые вы можете получить с многомиллионной машины. Кроме того, такие приложения обычно работают в непрерывном режиме, поэтому сборка мусора является чистым ядом для их производительности, небольшие прерывания умножаются на количество процессов. Я говорю вам, такие приложения существуют, и они, безусловно, не написаны на Java. Они просто не используются средним интернет-бизнесом.
cmaster
7
@cmaster Мы говорим о некоторых простых вычислениях, а не о полномасштабном игровом движке AAA с глобальным освещением в реальном времени, физическом рендеринге, анимированных разрезах вокселей, универсальной симуляции поля физики и тому подобное. Не в обиду, но вставка любого аргумента RE производительность здесь плохо. Простота использования должна быть № 1, и как человек, который использует C ++ в течение нескольких лет, это последний язык, который я бы порекомендовал в этом случае.
3

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

Несколько лет назад мой работодатель использовал это для переноса некоторого собственного кода мэйнфрейма S / 390 на серверы Linux. Мы дали им двоичный файл, они дали нам исходный код на C.

Нужно ли это в вашем случае, решать вам. Если вам важен только формат вывода, вы можете просто помассировать вывод после его создания. Однако, как отмечают другие, скрытие бизнес-логики в двоичном двоичном объекте может быть постоянным риском.

стройное
источник
3

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

Это решение, конечно, работает достаточно хорошо, только когда выходные данные хорошо структурированы, и их легко анализировать.

То, что это приложение с графическим интерфейсом, не является проблемой блокировки. Вы можете запустить его, сгенерировать вывод, а затем автоматически опубликовать его после завершения работы GUI.

h22
источник
3
Как это отличается от ответа Дока Брауна?
Лаф
Я не согласен с предположением, что ответ Дока был плохо написан. Это ясно и кратко.
Мачта
1
Если вы заглянете в текст этого ответа, то увидите, что единственная информативная часть точно заканчивает последнее предложение, «которое называет ваше наследие« exe », берет вывод и обрабатывает его дальше».
h22
2
Не даунотер, и не понимаю, почему это -3 ... Мета снова? но отдельно я бы советовал не критиковать чей-либо ответ на вопрос «содержит много мозговых размышлений», когда (A) это субъективное суждение и (B), по моему субъективному мнению, ваше содержит именно это!
underscore_d
Это также может быть переписано как «содержит неинформативные общие доклады, которые просто отвлекают от темы, тратящей время читателей», если этот способ выглядит более полезным. Содержит подсказку о правильном подходе ко второй половине последнего предложения. Это не имело намерения быть оскорбительным. Комментарий удален.
h22
1

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

Определите, что является правильным выводом для различных случаев, а затем попробуйте написать реализацию, которая удовлетворяет тем же тестам .

Я бы не пошел по пути обратного инжиниринга. Невероятно сложно изменить машинный код, и вы уже должны знать, какова цель исполняемого файла. Обратный инжиниринг - это слишком много работы для того, что вы ищете.

Если программное обеспечение было разработано одним парнем 20 лет назад, это, вероятно, не то, что требует много современных возможностей. Программа с графическим интерфейсом, которая растягивала машину 20 лет назад, практически не регистрируется на современной машине, так что вы, вероятно, смотрите на то, что относительно просто воспроизвести.

Carlos
источник
0

Попробуйте перепроектировать exe. Только с целью нахождения логики вычислений или, по крайней мере, для получения справедливого намека на то, что он на самом деле делает, и если ваш реверс-инжиниринг может привести вас к этой точке, вы можете написать новое приложение на основе этой логики вычислений. Кроме того, я не вижу другого выхода.

Легче сказать, чем сделать, реинжиниринг exe, созданного 20 лет назад, является настоящей проблемой.

Мукеш Адхварью
источник
12
Датировка exe не должна иметь большого значения
Ángel
1
Фактически, когда оптимизаторы становятся умнее с каждым годом, реверс-инжиниринг становится только сложнее.
MSalters