15

私は、Objective-C以外の言語でのiPhoneの開発に関する別の質問に答え、たとえば、C#を使用してiPhone用に書くと、Appleのレビュー担当者が間違っていると主張しました。問題のObjCライブラリとC#ライブラリで異なるUI要素について主に話していましたが、コメント投稿者が興味深い点を指摘し、この質問に導きました。

プログラムが書かれている言語を、そのバイナリだけから判断することは可能ですか?そのような方法があるとしたら、それらは何ですか?

質問の目的のために仮定しましょう:

  • インタラクションの観点(コンソールの動作、GUIの外観など)から見ると、この2つは同じです。
  • そのパフォーマンスは、言語の信頼できる指標ではありません(たとえば、JavaとCを比較することはできません)。
  • あなたと言語の間にインタプリタなどがないこと-ただ生の実行可能バイナリ。

可能な限り言語にとらわれない場合はボーナスポイント。

4

8 に答える 8

16

簡単な答え:はい

長い答え:

バイナリを見ると、リンクされているライブラリの名前を見つけることができます。TextPadでcmd.exeを開くと、16進オフセット0x270で次のものが簡単に見つかります:msvcrt.dll、KERNEL32.dll、NTDLL.DLL、USER32。 dllなど。msvcrtはMicrosoftの「C」ランタイムサポート関数です。KERNEL32、NTDLL、およびUSER32.dllは、クロスプラットフォーム開発環境が2つをどれだけうまく分離しているかに応じて、ターゲットプラットフォームまたはそれが構築されたプラットフォームのいずれかを通知するOS固有のライブラリです。

これらの手がかりは別として、ほとんどのc / c ++コンパイラは、関数の名前をバイナリに挿入する必要があります。テーブルに格納されているすべての関数(またはエントリポイント)のリストがあります。C ++は、関数名をマングルして引数とその型をエンコードし、オーバーロードされたメソッドをサポートします。関数名を難読化することは可能ですが、それらはまだ存在します。関数のシグニチャには、システムまたはプログラムで使用される内部呼び出しをトレースするために使用できる引数の数とタイプが含まれます。オフセット0x4190には「SetThreadUILanguage」があり、これを検索して開発環境について多くのことを知ることができます。オフセット0x1ED8Aにエントリポイントテーブルが見つかりました。printf、exit、scanfなどの名前を簡単に確認できました。__p__fmode、__ p__commode、および__initenvとともに

x86プロセッサの実行可能ファイルには、プログラムに含まれていた静的テキストを含むデータセグメントが含まれます。cmd.exe(オフセット0x42C8)に戻ると、「Software.Policies.Microsoft.Windows.System」というテキストが表示されます。文字列は、おそらく国際化のために倍幅の文字を使用して格納されているため、通常必要な2倍の文字を使用します。ここでは、エラーコードまたはメッセージが主要なソースです。

オフセットでは、B1B0は「プッシュ」され、その後にmkdir、rmdir、chdir、md、rd、およびcdが続きます。読みやすくするために、印刷できない文字は省略しました。これらはすべてcmd.exeへのコマンド引数です。

他のプログラムについては、プログラムがコンパイルされたパスを見つけることができる場合があります。

したがって、はい、バイナリからソース言語を判別することは可能です。

于 2009-11-09T22:41:42.197 に答える
10

私はコンパイラハッカーではありませんが(いつかは願っています)、バイナリファイルで、どのコンパイラがそれを生成したか、および使用されたコンパイラオプションのレベルなどを示す明確な兆候を見つけることができるかもしれません。最適化が指定されました。

厳密に言えば、しかし、あなたが求めていることは不可能です。誰かがペンと紙を持って座って、書きたいプログラムに対応するバイナリコードを作成し、それを16進エディタに入力した可能性があります。基本的に、それらはアセンブラツールなしでアセンブリでプログラミングします。同様に、ネイティブバイナリがストレートアセンブラで記述されたのか、インラインアセンブリを使用したCで記述されたのかを確実に判断できない場合があります。

JVMや.NETなどの仮想マシン環境については、バイナリ実行可能ファイルのバイトコードでVMを識別できるはずです。ただし、C#とVisual Basicなど、ソース言語が何であるかを判断できない場合があります。ただし、特定のコンパイラの癖がない限り、問題が発生する可能性があります。

于 2009-11-09T22:10:07.517 に答える
2

これらのツールはどうですか?

PE探偵

PEiD

どちらもPE識別子です。わかりました、両方とも窓用ですが、私がここに着陸したときはそれでした

于 2013-03-15T05:43:13.713 に答える
1

たとえば、すべてのコンパイラが同じコードを使用するわけではないため、ソースを逆アセンブルする場合、または少なくともコンパイラを知っている場合は、可能であると思います。printfそのため、Objective-CとgnuCはここで異なる必要があります。

すべてのバイトコード言語を除外したため、この問題は予想よりも一般的ではなくなります。

于 2009-11-09T22:09:56.910 に答える
1

まず、whatいくつかのバイナリで実行し、出力を確認します。CVS(およびSVN)識別子は、バイナリイメージ全体に散在しています。そしてそれらのほとんどは図書館からのものです。

また、多くの場合、さまざまなライブラリ関数への「マップ」があります。それも大きなヒントです。

ライブラリが実行可能ファイルにリンクされている場合、多くの場合、名前とオフセットとともにバイナリファイルに含まれているマップがあります。これは、「位置に依存しないコード」の作成の一部です。さまざまなオブジェクトファイルを単純に「ハードリンク」することはできません。マップが必要であり、バイナリをメモリにロードするときにいくつかのルックアップを実行する必要があります。

最後に、C、C ++(および私はC#を想像します)のスタートアップモジュールは、そのコンパイラのデフォルトのライブラリセットに固有のものです。

于 2009-11-09T22:10:33.000 に答える
0

さて、Cは最初にASMに変換されるので、ASMですべてのCコードを書くことができます。

于 2009-11-09T22:09:54.477 に答える
0

いいえ、バイトコードは言語に依存しません。コンパイラが異なれば、同じコードソースを使用して、異なるバイナリを生成することもできます。そのため、バイナリで動作する汎用逆コンパイラは表示されません。

于 2009-11-09T22:11:07.633 に答える
0

コマンド「strings」を使用して、使用された言語に関するヒントを取得できます(たとえば、作成したCアプリケーションのストリップされたバイナリで実行したところ、最初に見つかったエントリは実行可能ファイルによってリンクされたライブラリです) 。

于 2009-11-09T22:29:04.623 に答える