web-dev-qa-db-ja.com

文書化されていない関数はどのようにして発見されますか?


私はいつもどのようにして非文書化/プライベート APIを見つけるのか疑問に思ってきました

Appleundocumented/private API、Play StationWindows Phone 7Win32カーネルWindows API非表示のコールバックなど...

ハッカーは、プライベートで文書化されていない機能を見つけるためにどのツールを使用しますか?

APIドキュメントで通常説明されている秘密を明らかにするプライベートAPIとリバースエンジニアリング技術について詳しく説明している人々の経験についてはどこで読むことができますか?

ありがとう
A

11
elp

私が考えることができるいくつかの方法があります:

  1. 反射。ここでオブジェクトを取得し、メソッドやプロパティなどのオブジェクトに関する情報を公開するように依頼します。適切なオプション(言語によって異なる)を使用すると、「公開」されていない情報を公開できます。

  2. 逆コンパイル。これは、バイナリの作成に使用されたソースの(バージョン)を再生成します。この場合も、APIの非公開部分が明らかになる可能性があります。

リストに「偶然」を追加することもできます。動作するミススペルコール/コマンド、または多すぎる情報を表示するヘルプ画面。

7
ChrisF

ソフトウェアの開発に使用する通常のツール:)

通常、文書化されていないAPI関数はndocumentedであり、実際には慎重に隠された秘密ではありません。

将来を見据えたAPIの設計は困難です。APIに簡単にデータを追加できますが、(一部のクライアントを壊さずに)何かを削除することは本当に困難です。そのため、APIに何かを追加するときは非常に注意が必要です。そのため、APIにいくつかの追加機能(テスト、開発、クイックハック?)が存在する可能性があります。これらの機能は、ドキュメント化されておらず、次のバージョンで機能するか、または存在する保証はありません。

文書化されていないこれらの関数は、コンパイラー、リンカー、ライブラリー、デバッガー(システムプログラミング)のしくみを知っていれば、いくぶん簡単に見つけることができます。ターゲットアーキテクチャのアセンブリ言語を知っていても問題ありません。 IDE /コンパイラーが実行可能な実行可能ファイルを構築できる場合は、それを「手動」で行うこともできます。そのパスに目を向けておくと、いくつかの隠された機能を見つけることができます。

Unix環境での例:printf関数のみのドキュメントがあり、他に関数があるかどうかを知りたい場合=)printfのような関数。一連の思考は、次のようなものになるでしょう。

1。ヘッダーファイルを確認する

$ grep printf /usr/include/stdio.h | head -5
extern int fprintf (FILE *__restrict __stream,
extern int printf (__const char *__restrict __format, ...);
extern int sprintf (char *__restrict __s,
extern int vfprintf (FILE *__restrict __s, __const char *__restrict __format,
extern int vprintf (__const char *__restrict __format, _G_va_list __arg);

2。ライブラリを確認

$ nm /usr/lib/libc.a | grep printf | head -5
         U __asprintf
         U __fwprintf
         U __asprintf
         U __fwprintf
         U __printf_fp

。ライブラリ関数の逆アセンブル

    $ objdump -S /usr/lib/libc.a | grep -A 10 '_fwprintf' | head
00000000 <__fwprintf>:
   0:   55                      Push   %ebp
   1:   89 e5                   mov    %esp,%ebp
   3:   8d 45 10                lea    0x10(%ebp),%eax
   6:   83 ec 0c                sub    $0xc,%esp
   9:   89 44 24 08             mov    %eax,0x8(%esp)
   d:   8b 45 0c                mov    0xc(%ebp),%eax
  10:   89 44 24 04             mov    %eax,0x4(%esp)
  14:   8b 45 08                mov    0x8(%ebp),%eax
  17:   89 04 24                mov    %eax,(%esp)

またはそのようなもの...

4
Maglob

免責事項:ChrisFの答えが好きです。いくつかのアプローチは省かれていると思います。それらがどのようにカバーされているかについての回答へのコメントに配置されている場合、私は私の回答を削除します。

それは逆コンパイルのようなものになるかもしれません:

ドキュメントに記載されていない他のAPIを見つけるには、ベンダー提供のツールをデバッグして、必要な処理を行ったり、ライブラリ間の呼び出しを追跡したりすることもできます。これにより、どのタイプのデータがどこに送信されるかを把握できます。

他の「カスタム」ツールは、pythonおよびCTYPESまたはRubyを使用して、これらが文書化されていないAPIで動作するように記述できます。クラッシュ時の動作またはファジングこのトピックについては、Aaron Portnoyが次の内容で最小限の詳細を説明しています: http://pentest.cryptocity.net/reverse-engineering/ そして会議での他のいくつかの講演(私は彼がブラジルでの講演でそれについて直接語ったことを覚えているようです)それはREに関連していますが、それは単なる一般的なREだとは思いません。注:ビデオpentest.cryptocity.netはこのトピックだけではありません。他の領域をより深くカバーしています。これは触れただけです。テスターが「正確な手順は私たちの秘密を明かすことになる」と警戒していることが多いためです。

フィードバックをお読みいただきありがとうございます。

編集:Windows側でこれに役立つことが証明できる1つのツールは、ここでは最小限にカバーされています: http://breakingcode.wordpress.com/2010/08/24/winappdbg-1-4- is-out /
シックJavaクライアントがカスタムネットワークサービスをファズするためのハイジャックの呼び出しをここでカバーします:
http://www.securitytube.net/JavaSnoop-How-to-hack-anything-written-in-Java-video.aspx

最後の1つは最小限の関連性しかありませんが、最終的には質問者がどこに行くのかということに関連している可能性があります。所有していないAPIを使用して...何でも。

2
RobotHumans