9

これが可能かどうかはわかりませんが、静的にリンクされた多くのライブラリを含む実行可能ファイル(foo.exe)が与えられています。

このファイルから実行可能ファイル内にある.lib(または.a)を抽出するソフトウェアはありますか?

ありがとう。

4

3 に答える 3

15

通常、ライブラリのコンテンツ全体が実行可能ファイルに挿入されないため、非常にまれです。

未定義のシンボルをすべて満たすのに十分なだけです。これは実際にはライブラリのごく一部にすぎない可能性があります。ライブラリは通常、必要なものだけが実行可能ファイルにリンクされているオブジェクトファイルのセットで構成されています。

たとえば、Cランタイムライブラリで呼び出したのがである場合、実行可能ファイルに関数のファミリがexit()含まれている可能性はほとんどありません。printf()

オブジェクトファイルと直接リンクしている場合は、使用されているかどうかに関係なく含まれているため、チャンスがある可能性があります(リンカーがスマートなものでない限り)。

しかし、特定のオブジェクトファイルからどのコードセクションが取得されたかについての情報が実行可能ファイルにない可能性があるため、それでも非常に困難な作業になります。それは潜在的に実行可能ですが、別の方法がある場合は、最初にそれを検討します。

典型的なプロセスを明確にしましょう:

  1. 4つのオブジェクトファイル、、、a.oおよびにはb.o、それぞれ関数、、、が含まれています。それらはすべてアーカイブに追加されます。c.od.oa()b()c()d()abcd.a
  2. b()を呼び出すという事実を除いて、これらはすべてスタンドアロン(依存関係なし)c()です。
  3. を呼び出すメインプログラムがa()ありb()、それをコンパイルしてからabcd.aライブラリにリンクします。
  4. リンカは、ライブラリから実行可能ファイルにドラッグa.ob.oて実行可能ファイルにドラッグします。これにより、の必要性が満たされますが、必要なため、a()b()必要性が導入されます。c()b()
  5. 次に、リンカc.oはライブラリから実行可能ファイルにドラッグし、のニーズを満たしますc()。これで、未定義のシンボルがすべて満たされ、実行可能ファイルが完成し、散らかされました。準備ができたら実行できます。

そのプロセスのどの段階でも実行可能ファイルにd.oドラッグされていないため、実行可能ファイルを取得する見込みはありません。

更新:上記の「別の方法がある場合は、最初に確認します」というコメントを再確認してください。他の回答の1つへのコメントで、必要なライブラリを抽出したソースコードがあると述べたばかりです。 。私は尋ねる必要があります:なぜあなたはそのソースでライブラリを再構築できないのですか?これは、実行可能コードのモラスからライブラリを再作成しようとするよりもはるかに簡単な解決策のように思えます。

于 2009-11-13T12:37:15.253 に答える
1

表紙、タイトルページ、ページ番号、章がない、理解できない言語の本が10冊あると想像してみてください。一部の本は不完全な場合があります。すべてのページが一緒にシャッフルされているため、各本の始まりと終わりがどこにあるかを見つけることはできません(各ページは関数呼び出しです)次に、本5の123ページを見つけてみてください(たとえば、関数Exit() )。

まあ、それは可能です...

于 2009-11-13T13:09:12.990 に答える
-1

逆コンパイラを要求しているようです。このようなツールは使いにくく(やや洗練されたC ++ではおそらく不可能です)、ライブラリを書き直すのに数か月かかるなど、問題を解決する他の方法がある場合は、その一連のアクションをお勧めします。

paxが指摘したように、逆コンパイラーを使用したとしても、実行可能ファイルが呼び出したライブラリー関数しか取得できません。

于 2009-11-13T12:48:20.517 に答える