静的解析でバイナリからシステムコールを集めるにはどうすればいいですか?

与えられたバイナリ(x86_64)で使用されているシステムコールのリストを静的解析で取得したいのですが。 straceを試しましたが、実行中にいくつかのシステムコールが呼び出されない可能性があるため、完全なリストであることを保証するものではありません。

2
実行中に呼び出されないシステムコールを削除するには、停止問題を解決する必要があります。
追加された 著者 Raymond Chen,
@Dúthomhas私は、「実行中にいくつかのシステムコールが呼び出されない可能性があるので、それが完全なリストであることを保証するものではない」と誤解しました。私には、実行中に呼び出されないシステムコールをリストから削除することをOPが望んでいるように思えます。
追加された 著者 Raymond Chen,
@Dúthomhasああ、私はどうやって私が質問を誤って解釈したのかを見ます。私の理解を助けてくれてありがとう。
追加された 著者 Raymond Chen,
外部リンクテーブルで十分ではないでしょうか。
追加された 著者 Dúthomhas,
シンボルテーブル(AKAリンクテーブルまたは依存関係テーブル)は、プログラムによって使用される別のバイナリモジュール内のシンボルのリストです。 OSが実行ファイルをロードするとき、他のモジュールもロードしてそれらを接続することによってこれらの依存関係を解決します。これが機能する方法はさまざまですが、すべてのCOFF/PEファイルにこのテーブルが含まれています。
追加された 著者 Dúthomhas,
@RaymondChen彼はそうしているとは言いませんでした。彼はただプログラムが任意のブランチで使用するすべてのシステムコールのリストが欲しいのです。シンボルテーブルは彼にそれを与えるでしょう。
追加された 著者 Dúthomhas,
@ hckuo2シンボルテーブルはあなたが望むものです。システムモジュールへの依存関係を含む、すべての依存関係が一覧表示されます。たとえば、Windowsでは、kernel32.dllへの依存関係がわかります。 kernel32.dllとリンクしているシンボルテーブルにリストされているすべての機能は、プログラムによって使用される機能です。リンカはあなたのプログラムで必要とされていないシンボルをリストしないのが得意なので、あなたが得るリストはかなり正確になるでしょう。
追加された 著者 Dúthomhas,
@RaymondChenそれは起こります。 OPは、彼が望んでいるもの(「すべてのシステムコールのリストを入手したい」)に従属している、彼が既に試みたことについての不要な情報を追加します。 )言い換えれば、「で使用されるシステムコールのリストが欲しいのですが、straceにはそれができません(停止問題のため)。」
追加された 著者 Dúthomhas,
@ RaymondChen笑、問題ありません。私はいつも自分でやります。
追加された 著者 Dúthomhas,
私は外部リンクテーブルが何であるか本当に知りませんが、私は間違いなくそれを調べます。ありがとうございます。
追加された 著者 hckuo2,
バイナリで呼び出された関数しか含まれていないかもしれませんが、探しているのは特定のシステムコールです。しかし、関数のリストを取得することは、それらの関数を分析して呼び出されるシステムコールを見つけることができるので、役に立ちます。それを達成するためのより良い、より速い方法があるかどうか私は思っていました。
追加された 著者 hckuo2,
つまり、いくつかのシステムコールは通常の実行ではなく、まれにしか呼び出されないことがあります。
追加された 著者 hckuo2,

4 答え

C/C ++の場合は、 CppDepend を試して、外部ライブラリとシステムコールとのすべての依存関係を検出できます。ただし、バイナリではなくソースコードを分析する必要があります。

1
追加された

静的解析では、バイナリが難読化されていないと仮定して、バイナリに対する洞察を提供できるツールがいくつかあります。最も一般的に使用されているのは IDA です。バイナリを単独で解析する場合、いくつかのコンパイルオプション、すなわちダイナミックリンク対スタティックリンク、ストリップバイナリ、最適化オプションなどが困難な静的解析手法において重要な役割を果たします。

システムコールを検索する1つの方法は、 IDAPython API を使用してスクリプトに従ってシステムコールを検索することです。 X86アセンブリ/ Linuxとのインターフェイスおよびここでの説明 Linuxシスコールリファレンス。 IDAPythonは、各基本ブロック内の命令を調べて、呼び出されているシステムコールを判断するための「十分に優れた」APIを提供します。

1
追加された

ツールNDependを使用すると、コードクエリを使用してそれを行うことができますが、.NETアセンブリでのみ可能です。

from x in ThirdParty.CodeElements
select new { x, callers = 
  x.IsMethod ? x.AsMethod.MethodsCallingMe.Cast() : 
  x.IsType   ? x.AsType.TypesUsingMe.Cast() : new ICodeElement[0] }

NDepend calls to system

0
追加された
実際、私はCやC ++のようなコンパイルされたプログラムに注目しています。
追加された 著者 hckuo2,

私は以前の答えがこれに取り組むための最も簡単な方法だと思います。オプションは、バイナリをサポートし、制御フローグラフをナビゲートする静的解析ツールを使用することです。それらがデッドコードで呼ばれるならば、それはあなたがいくつかの関数を除外することを可能にするかもしれませんが、それはまたもっとずっと複雑になるでしょう。 GrammaTech CodeSonarはバイナリをサポートする商用ツールであり、ここで手助けすることができるかもしれません。

0
追加された