В нашей компании у нас есть небольшая программа (размером .exe 500 Кб), которая выполняет математические вычисления, и в итоге выдает результат в электронную таблицу Excel, которую мы используем для продолжения нашего рабочего процесса.
Я хочу изменить столбцы, формат интервала и добавить логику VBA и т. Д. В электронную таблицу Excel, но так как эти параметры не могут быть изменены в этой программе, мне кажется, что единственный способ изменить это - сломать / перепроектировать .exe
Никто не знает, на каком языке он был запрограммирован, единственное, что мы знаем:
- Разработано 20+ лет назад
- Разработчик удалился 10 лет назад
- GUI приложение
- Работает автономно
- Размер 500Кб
Любые предложения, какие варианты у меня есть, чтобы иметь дело с такими проблемами? Является ли реверс-инжиниринг единственным вариантом или есть лучший подход?
Ответы:
Обратный инжиниринг может стать очень сложным, даже если вы не просто хотите понять логику программы, но изменить и перекомпилировать ее. Итак, первое, что я бы попробовал, это найти другое решение.
Если это единственное, что вам нужно, и вычисления, выполняемые программой, хороши, то почему бы не написать программу на языке по вашему выбору (возможно, макрос Excel), который вызывает ваше устаревшее «exe», берет вывод и обрабатывает его? в дальнейшем.
источник
subprocess.run()
лично.PIPE
константу. В противном случае, вы этого не сделаете, и это будет отброшено. Что тут понимать?Shell
вызов в Excel VBA, такой как: stackoverflow.com/questions/8902022/… , можно передать stdout / stderr из утилиты cmd в отдельные файлы, а затем применить форматирование вывода.В дополнение к уже приведенным ответам Дока Брауна и Теластина, я хотел бы предложить альтернативный подход (в предположении, что он критически важен).
Если вы не знаете, какие вычисления он выполняет, и вычисления (в некоторой степени) критически важны: выведите оригинальную логику из
.exe
файла любыми необходимыми средствами. При необходимости расшифруйте его, используя декомпилятор / дизассемблер, такой как IDA . При необходимости нанять консультанта (или группу консультантов).Конечно, пока обойти это, используя их решение, но не позволяйте этому быть.
Причина, по которой я предлагаю, заключается в следующем: вы признали, что расчеты очень сложны (по словам инженера, с которым вы говорили). Это также важно для миссии. Поэтому, если оригинальная
.exe
версия перестает работать из-за изменений в ваших платформах (может быть, 16-битная поддержка прекращается?), Вы только что потеряли критически важные знания .Теперь я не беспокоюсь о потере
.exe
, но о потере знаний, которые он кодирует. Это знание должно быть восстановлено.Как и раньше: если эти знания уже доступны, обязательно запишите их в формате, который в ближайшее время не будет потерян. В противном случае восстановите его и запишите.
источник
Спросите оригинального программиста, если это возможно.
Несколько недель назад со мной связалась фирма, на которой я работал 10 лет назад, с тем же вопросом о файле mdb, разработанном в середине 90-х годов.
источник
Если все, что вам нужно, это изменить вывод, то почему бы просто не использовать композицию?
Вместо изменения черного ящика вы не можете легко получить доступ, вы создаете новую программу , которая принимает выходной сигнал Excel, и делает ваше форматирование / колонки изменяется слишком . Затем вы могли бы создать новый exe / скрипт, который будет вызывать две программы по порядку, так что конечному пользователю кажется, что есть только одна программа, которая выполняет всю работу - даже при том, что это два отдельных шага под капотом.
источник
Есть компании, которые специализируются именно на такой проблеме. Они используют собственный код для декомпиляции нативного кода на язык высокого уровня, а затем применяют человеческий опыт, чтобы сделать его полезным (например, присваивая переменным соответствующие имена).
Несколько лет назад мой работодатель использовал это для переноса некоторого собственного кода мэйнфрейма S / 390 на серверы Linux. Мы дали им двоичный файл, они дали нам исходный код на C.
Нужно ли это в вашем случае, решать вам. Если вам важен только формат вывода, вы можете просто помассировать вывод после его создания. Однако, как отмечают другие, скрытие бизнес-логики в двоичном двоичном объекте может быть постоянным риском.
источник
Напишите простую обертку вокруг программы, фиксируя ее вывод. Это не сложно сделать, так как у многих языков (например, Java , C ++ , Python , .NET ) есть средства для этого. Разобрать вывод и сгенерировать другой, в нужной форме. Пользователь назовет вашу новую программу. Старый исполняемый файл останется рядом с ним или даже может быть автоматически извлечен из ресурса перед его вызовом.
Это решение, конечно, работает достаточно хорошо, только когда выходные данные хорошо структурированы, и их легко анализировать.
То, что это приложение с графическим интерфейсом, не является проблемой блокировки. Вы можете запустить его, сгенерировать вывод, а затем автоматически опубликовать его после завершения работы GUI.
источник
Напишите несколько тестов, которые выполняют как можно больше случаев со старым кодом. Найти угловые случаи, проверить неверный ввод и проверить правильность ввода.
Определите, что является правильным выводом для различных случаев, а затем попробуйте написать реализацию, которая удовлетворяет тем же тестам .
Я бы не пошел по пути обратного инжиниринга. Невероятно сложно изменить машинный код, и вы уже должны знать, какова цель исполняемого файла. Обратный инжиниринг - это слишком много работы для того, что вы ищете.
Если программное обеспечение было разработано одним парнем 20 лет назад, это, вероятно, не то, что требует много современных возможностей. Программа с графическим интерфейсом, которая растягивала машину 20 лет назад, практически не регистрируется на современной машине, так что вы, вероятно, смотрите на то, что относительно просто воспроизвести.
источник
Попробуйте перепроектировать exe. Только с целью нахождения логики вычислений или, по крайней мере, для получения справедливого намека на то, что он на самом деле делает, и если ваш реверс-инжиниринг может привести вас к этой точке, вы можете написать новое приложение на основе этой логики вычислений. Кроме того, я не вижу другого выхода.
Легче сказать, чем сделать, реинжиниринг exe, созданного 20 лет назад, является настоящей проблемой.
источник