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


89

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

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

プログラミングされた言語が誰にもわからないのは、私たちが知っている唯一のことです:

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

この種の問題に対処するためのオプションはありますか?リバースエンジニアリングが唯一のオプションですか、それともより良いアプローチがありますか?


149
計算が何を実行するか知っていますか?その場合、新しいアプリを作成し、両方にテストデータをプッシュして、新しいアプリが同じように機能することを確認してから、古いアプリを破棄します。次に、必要な変更を加えます。
デビッドアルノ

13
@DavidArnoのコメントは良い答えになるでしょう。リバースエンジニアリングは可能ですが、アプリの再指定と書き換えは、はるかに安く/簡単/簡単になります。
ダンピチェルマン

44
それを変更する他の方法は、元のプログラムが生成する結果を取得し、それを必要なものにフィルターすることです。
Blrfl

9
@Alec 16進エディタで.exeを開くと、それが何で書かれているかについての手がかりが得られる場合があります。たとえば、コンパイラ名が埋め込まれている場合があります。そこから、可能な逆コンパイルオプションについて詳しく知ることができます。
GrandmasterB

26
あるいは、申請書を書いた紳士を探して、コンサルタントとして1日か2日(1日に2、3時間程度)入社するかどうかを確認することもできます。彼が退職した開発者である場合、実際には少しの間仕事をする瞬間を実際に楽しんでいる間、彼は100ドルから150ドル/時のレートで少しお金を使うことに感謝するかもしれない中程度のチャンスがあります。
RLH

回答:


234

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

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

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


9
新しいプログラムが古いEXEを呼び出す必要があるのはなぜですか?新しいプログラムを独立させてから、両方を呼び出して出力と入力を調整するスクリプトを作成するだけではどうですか?私の経験では、bash、PowerShell、またはコマンドプロンプトなどのコマンドライン言語にプロセス座標を処理させる方が、命令型言語で自分でコーディングするよりも一般的に簡単です。それ以外の場合、+ 1。
jpmc26

8
@ jpmc26:Bashの不条理な引用ルールに対処する必要があるまで、それは事実です。はい、それらは(ほとんど)POSIXに準拠しています。いいえ、彼らは何の意味もありません。たとえば、$ FOOは単語を分割しないでください。
ケビン

16
@ jpmc26:subprocess.run()個人的に電話するのに苦労したことはありません。
ケビン

3
@ jpmc26:パイピングは何ですか?それは純粋な料理本です。標準出力が必要な場合は、マジックPIPE定数を渡します。それ以外の場合は、破棄せずに破棄されます。理解するために何がありますか?
ケビン

3
...過去にVBAでExcelをコマンドラインユーティリティのフロントエンドとして複数回使用したことがあります。構造は常に同じです。「貧乏人のUI」としてパラメーターを入力するためのシート、そのシートの「開始」ボタン。VBAコードでは、次のShellようなExcel VBAの呼び出しが必要です:stackoverflow.com/questions/8902022/…、cmdユーティリティからstdout / stderrを個別のファイルにパイプして、出力フォーマットを適用できます。
ドックブラウン

114

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

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

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

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

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

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


14
特に、元のソースがプレーンCまたはアセンブラーであり、高レベルの言語ではない場合、現代の逆コンパイラーは通常、非常に読みやすいコードを実際に生成します。
-phyrfox

4
非常に良い点。また、次の修正が実装される必要があるまで、それが再び機能するようにパッチを当てるだけで機能します。
ダニエルジュール

33
@phyrfox 20歳...開発者は10年前に退職しました...出力はExcelスプレッドシートのみです... VB6アプリケーションであることにはお金をかけました。
J ...

10
@micaho:または、会社がまだ存在し、結果と隠された仮定を検証するノウハウを持つ人がトラックに直撃されました。もちろん、それはビジネス上のリスクなので、最終的には利害関係者が決定する必要があります。「ラッパー」は今は機能するが、技術的な負債を増やすだけであることを強調したかっただけです。
シェードジョブポストマス

22
@J ...:VB6の場合、元のポスターは幸運です。VB6コンパイルからソースコードを簡単に回復できます。
エリックリッパー

74

可能であれば、元のプログラマに尋ねてください。

数週間前、10年前に働いていた会社から、90年代半ばに開発されたmdbファイルについてまったく同じ質問がありました。


52
これは本当の低垂れの果物です。誰もが(自分自身も)、リバースエンジニアリング、プログラムの機能の再実装、データ処理へのレイヤーの追加などのハードプログラミングスキルの使用をロマンチックに感じています。実際には、開始するのに最適な場所は、ソースコードまたはその他の理想的なソリューションの場所を1時間以内に返信するフレンドリーな電子メールです。
user1717828

2
私も10歳のアプリケーションで家にいるとき、私は逆アセンブラーを起動しますが、勤務時間中は目標が異なります^^
Paolo

2
それについて何か覚えていましたか?:)
アンヘル

2
もちろん!残念なことに、会社は3回の買収と合併を行ったため、多くの情報が失われ、バックアップの一部が失われました。
パオロ

1
EXEをスキャンして、開発者の名前などが含まれている可能性のある埋め込み文字列を探します。完全に分解するよりも簡単です!
JDługosz

55

この種の問題に対処するためのオプションはありますか?

出力を変更するだけなら、単純に合成を使用しないのはなぜですか?

簡単にアクセスできないブラックボックスを変更する代わりに、Excel出力を取得し、書式設定/列の変更行う新しいプログラムを作成します。次に、2つのプログラムを順番に呼び出す新しいexe /スクリプトを作成できます。そのため、エンドユーザーには、すべての作業を行うプログラムが1つだけであるように見えます。


2
@Alec javaが適切な言語であるかどうかは、主に、処理する必要のあるデータの量/実行する必要のある計算の量に依存します。両方が低ければ、javaは大丈夫です。どちらかが重要な場合は、CまたはC ++にドロップダウンすることをお勧めします。しかし、とにかくExcelスプレッドシートに収まる量のデータのみを使用しているように見えるため、javaを不適切な選択にするのに十分なデータがあるとは思わない(Excelはアプリが実行される前に爆発する可能性が高い)。
cmaster

18
@cmaster Javaが重い計算に対して禁止的であるという考えは時代遅れの概念です。最悪 ここに記載されているベンチマークは、(ほとんどが2倍以下である)も、4倍ではなく、一桁のスカラーがあなたの限界点である場合には、(開発者のドルへの直接変換)安全性の節約が可能性の高いパフォーマンスヒットを相殺するつもりは以上です。
corsiKa

8
@Alecはどの言語でも動作します。VBAは既にExcelと非常にうまく統合されているため、良い選択のようです。
キャプテンマン

4
@corsiKaそれはアプリケーションの規模に完全に依存します。1回の実行で数万CPU時間を消費する場合、2または4の係数は法外になります。数百万台のマシンから取得できる結果の量に直接変換されます。また、このようなアプリケーションは通常ロックステップで動作するため、ガベージコレクションはパフォーマンスにとって純粋な毒であり、小さな中断はプロセスの数で増加します。そのようなアプリケーションが存在し、Javaで書かれていないことは間違いありません。それらは、平均的なインターネットビジネスでは使用されていません。
cmaster

7
@cmasterリアルタイムグローバルイルミネーション、物理ベースのレンダリング、アニメーション化されたスパースボクセルオクトツリー、ユニバーサル物理フィールドシミュレーションなどを備えた本格的なAAAゲームエンジンではなく、いくつかの簡単な計算について説明しています。オフェンスはありませんが、ここに引数REのパフォーマンスを挿入することは悪いことです。使いやすさは#1である必要があり、C ++を数年間使用している人としては、この場合に推奨する最後の言語です。

3

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

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

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


3

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

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

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


3
これは、Doc Brownのトップ投票の回答とどう違うのですか?
ラフ

Docの回答が不適切に書かれているという仮定には同意しません。それは明確で簡潔です。
マスト

1
この回答のテキストを見ると、唯一の情報部分が「レガシー「exe」を呼び出し、出力を取得してさらに処理する」最後の文の最後を正確に終わらせることがわかります。
h22

2
ダウンボッターではありません。なぜこれが-3になったのかわかりません...メタは再びそれになりますか?しかし、(A)それは主観的な判断であり、(B)私の主観的な意見では、あなたのそれがちょうど含まれている場合、私は「脳を萎縮させる大量のブラーを含む」という他の誰かの答えを暴言することに対して助言します!
underscore_d

これはまた、「読者の時間を浪費するトピックから気をそらすだけの情報量の少ない一般的な講演を含む」と書き直すこともできます。最後の文の後半に正しいアプローチへのヒントを提供します。これはin辱するつもりはありませんでした。コメントを削除しました。
h22

1

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

さまざまなケースで正しい出力を特定し、同じテストを満たす実装を作成してみます

リバースエンジニアリングのルートをたどりません。マシンコードをリバースすることは非常に複雑であり、exeの目的が何であるかを既に知っている必要があります。リバースエンジニアリングは、あなたが望んでいることには少し多すぎる作業です。

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


0

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

20年前に作成されたexeをリバースエンジニアリングすることは、実際よりも簡単です。


12
exeの日付は本当に重要ではありません
アンヘル

1
実際、オプティマイザーが毎年賢くなると、リバースエンジニアリングはますます難しくなります。
–MSalters
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.