アプリケーションで使用されるAPI呼び出しの検出

アプリケーションで使用されるAPI呼び出しの検出

Linux で独自の C++ アプリケーションを実行し、ここに宣伝された機能以外の機能が含まれているかどうかを知る必要があります。

アプリケーションが実行したすべてのAPI呼び出しを一覧表示する方法はありますか(Linuxシステム呼び出しを使用せずに標準のstdc ++関数のみを使用すると仮定します)。

似たような質問私は約10年前に質問を受けましたが、その答えはまったく満足できませんでした。完全に自動化されたものが必要です。

ベストアンサー1

重要な要約:.hookを使用して、共有オブジェクトの境界を超えて一般的な関数呼び出しを行うことができますbpftrace。しかし、特に私たちがC ++標準ライブラリであると思う場合、これは実際のC ++ "標準ライブラリ"が実行する作業のほんの一部です。しかし、もしあなたができるこれらすべての関数呼び出しを追跡しても保証されるわけではありません。


どの関数が呼び出されるかを知る一般的な方法はありません。最終的には、標準ライブラリのどの部分が意図的にプログラムに静的にリンクされているのかわからず、ほとんどはインラインです。 C ++では、多くの標準機能がC ++テンプレートにあるため、libstdc ++ではなくプログラムコンパイルユニットの一部です。さらに悪いことに、共有ライブラリからの関数だけを使用しても、「関数呼び出し」はまったく「特別な」ものではなく、単に関数であるということです。引数を渡してアドレスにジャンプするために必要なレジスタを設定するだけです。共有オブジェクトの場合、アドレスは次のとおりです。通常起動時に標準の動的リンカーを使用して解決されました。しかし、これが唯一のものであるという保証はまったくありません。。特に、プログラムが実行時にライブラリ(プラグインを実装するライブラリ、スクリプト言語など)をロードする場合、インポートする関数テーブルを一覧表示するのと同じくらい簡単ではありません。

ユーザー領域プログラムを追跡し、C ++標準ライブラリのすべての関数のフックを挿入して記録できます。bpftraceここで選択するツールです。 bpftraceをインストールし、通常/usr/share/bpftrace/toolsにあるサンプルツールを確認してくださいbashreadline.bt。具体的には次のようになります。

#!/usr/bin/bpftrace
/*
 * bashreadline    Print entered bash commands from all running shells.
 *                 For Linux, uses bpftrace and eBPF.
 *
 * This works by tracing the readline() function using a uretprobe (uprobes).
 *
 * USAGE: bashreadline.bt
 *
 * This is a bpftrace version of the bcc tool of the same name.
 *
 * Copyright 2018 Netflix, Inc.
 * Licensed under the Apache License, Version 2.0 (the "License")
 *
 * 06-Sep-2018  Brendan Gregg   Created this.
 */

BEGIN
{
    printf("Tracing bash commands... Hit Ctrl-C to end.\n");
    printf("%-9s %-6s %s\n", "TIME", "PID", "COMMAND");
}

uretprobe:/bin/bash:readline
{
    time("%H:%M:%S  ");
    printf("%-6d %s\n", pid, str(retval));
}

uretprobe:executable name:function nameobjdump -T /lib64/libstdc++.soまたはプログラムが利用可能であると考えているライブラリ用の小さなawk、Python、PERL、またはPL1プログラムを作成します。計算できます。それ出たら電話をstrace捜しなさい )。openこれらすべてがスクリプトに適しています!

Linux で独自の C++ アプリケーションを実行し、ここに宣伝された機能以外の機能が含まれているかどうかを知る必要があります。

はい、これはいかなる保証も提供しません。最良のシナリオでは、どのアドレスが呼び出されているかを確認できます。プログラムが、外部ライブラリが正しい状況で必要なすべてのタスクを実行できるようにROPトランポリンを準備するかどうかは、これを行う方法はありません。通常、通常の動作中にのみプログラムの動作を観察できます。しかし、読まない限りみんな分解の過程で13日の金曜日に実行されたとき、UID = 1234のとき、CPUIDが7で終わるとき、または... AND:すべての外部ライブラリにあります。プログラムが呼び出すことを望まない不要な機能は、プログラマーがプログラム自体に含めることができます(関数をコピーしたり、静的リンクを介して)。

これがオペレーティングシステムとUNIXoidが特にオペレーティングシステム/ユーザードメインの境界にわたって権限を分割する理由です。特定のプログラムの動作に対する保証はありませんが、Linuxはプログラムへのアクセスが許可されていないことを保証できます(十分な確実性)。ファイルにアクセスできません。プログラム自体へのアクセスを許可することは不可能です。


おすすめ記事