web-dev-qa-db-ja.com

ソースコードがないプログラムの出力を変更する方法

私たちの会社には、数学的計算を行う小さなプログラム(.exe 500Kbサイズ)があり、最終的には、ワークフローを続行するために使用するExcelスプレッドシートに結果を出力します。

列、間隔の形式を変更し、ExcelスプレッドシートにVBAロジックなどを追加したいのですが、このプログラムではこのパラメーターを構成できないため、変更するには、.exeを分解/リバースエンジニアリングするしか方法がないようです。

それがどの言語でプログラムされているか誰も知らない、私たちが知っている唯一のことは:

  1. 20年以上前に開発されました
  2. 開発者は10年前に引退しました
  3. GUIアプリケーション
  4. スタンドアロンで実行
  5. サイズ500Kb

このような種類の問題に対処するためにどんなオプションが必要ですか?リバースエンジニアリングが唯一の選択肢ですか、それともより優れたアプローチがありますか?

90
Alec

プログラムのロジックを理解するだけでなく、変更して再コンパイルしたい場合は、リバースエンジニアリングが非常に困難になる可能性があります。したがって、私が最初に試みることは、別の解決策を探すことです。

列、間隔の形式を変更し、ExcelスプレッドシートにVBAロジックなどを追加したい

それがあなたが望む唯一のものであり、プログラムによって行われた計算が問題ない場合は、レガシー「exe」を呼び出し、出力を取得して処理する、選択した言語(おそらくExcelマクロ)でプログラムを書いてみませんかさらに。

234
Doc Brown

Doc BrownとTelastynによって既に与えられた回答に加えて、私は別のアプローチを提案したいと思います(それがミッションクリティカルであるという前提の下で)。

実行する計算がわからず、計算が(ある程度)ミッションクリティカルである場合:必要な方法で.exeファイルの元のロジックを推測します。必要に応じて、 [〜#〜] ida [〜#〜] のような逆コンパイラ/逆アセンブラを使用してデコードします。必要に応じて、コンサルタント(またはコンサルタントのバッチ)を雇います。

確かに、今のところソリューションを使用して回避してください。

私が提案する理由は次のとおりです。あなたは(あなたが話したエンジニアによれば)計算が非常に複雑であることを認めました。また、ミッションクリティカルです。そのため、プラットフォームの変更が原因で元の.exeが何らかの理由で機能しなくなった場合(16ビットのサポートが削除された可能性がありますか?)、ミッションクリティカルなの部分が失われたことになります。知識

今、私は.exeを失うことについて心配していませんが、それがエンコードする知識を失うことについて心配しています。その知識を回復する必要があります。

以前と同じように、その知識がすでに利用可能な場合は、すぐに失われないような形式でそれを書き留めてください。それ以外の場合は、回復してメモします。

113

可能であれば、元のプログラマーに問い合わせてください。

数週間前、私は10年間前に働いていた会社から90年代半ばに開発されたmdbファイルについての非常に同じ質問について連絡を受けました。

74
Paolo

このような種類の問題に対処するためにどんなオプションが必要ですか?

出力を変更することだけを目的としている場合は、単にコンポジションを使用しないのはなぜですか?

簡単にアクセスできないブラックボックスを変更する代わりに、Excelの出力を受け取り、フォーマットや列を変更する新しいプログラムを作成しますtoo。次に、2つのプログラムを順番に呼び出す新しいexe /スクリプトを作成します。これにより、エンドユーザーには、すべての作業を行うプログラムが1つしかないように見えます。

55
Telastyn

プログラムを囲む単純なラッパーを記述して、その出力をキャプチャします。多くの言語( JavaC++Python。NET など)を実行することは複雑ではありませんこれのための手段があります。出力を解析し、別の形式を目的の形式で生成します。ユーザーが新しいプログラムを呼び出します。古い実行可能ファイルはその横に残りますが、呼び出す前にリソースから自動的に抽出することもできます。

もちろん、このソリューションは、出力が適切に構造化されていて解析しやすい場合にのみ十分機能します。

それがGUIアプリケーションであることは、ブロッキングの問題ではありません。これを起動して出力を生成し、このGUIの終了時に自動的に後処理できます。

3
h22

まさにこの種の問題に特化した企業があります。独自のコードを使用してネイティブコードを高級言語に逆コンパイルし、人間の専門知識を適用して有用にします(変数に適切な名前を付けるなど)。

数年前、私の雇用主はこれを使用して、ネイティブS/390メインフレームコードをLinuxサーバーに移行しました。私たちは彼らにバイナリを与えました、彼らは私たちにCのソースコードを与えました。

これがあなたの場合に必要かどうかはあなた次第です。出力のフォーマットのみに関心がある場合は、出力が生成された後にその出力を単にマッサージすることができます。ただし、他の人が指摘したように、バイナリブロブにビジネスロジックが隠されていると、リスクが継続する可能性があります。

3
slim

古いコードで可能な限り多くのケースを実行するいくつかのテストを記述します。コーナーケースを見つけ、間違った入力をテストし、正しい入力をテストします。

さまざまなケースで正しい出力を特定してから、同じテストを満たす実装を記述してみてください

私はリバースエンジニアリングの経路を下りません。マシンコードを逆にするのは信じられないほど複雑であり、あなたはすでにexeの目的が何であるかを知っているはずです。リバースエンジニアリングは、あなたが求めているものに対して少しやり過ぎです。

ソフトウェアが20年前に一人の男によって開発された場合、それはおそらく現代の多くの力を必要とするものではありません。 20年前にマシンを拡張したGUIプログラムは、最近のマシンではほとんど登録されないので、再現が比較的簡単なものを探しているでしょう。

1
Carlos

Exeをリバースエンジニアリングしてみてください。計算ロジックを見つける目的でのみ、または少なくとも実際に何が行われるかについての公正なヒントを得る目的でのみ使用できます。リバースエンジニアリングでその時点に到達できる場合は、その計算ロジックに基づいて新しいアプリケーションを作成できます。それ以外は、他の方法は見ません。

言うのは簡単なことではありませんが、20年前に作成されたexeをリバースエンジニアリングすることは非常に困難です。

0
Mukesh Adhvaryu