0

可能なすべての変更の統計 (ポート フラグ、レジスタ、割り込み、例外など) と、それを配列に書き込む (表示および比較するため)。opcode ...etc の長さをカウントします。

たとえば、特定のプロセッサをテストするために、そのような標準テストが存在する可能性があります。また、ネット上で見つけることができる、文書化されていない機能の「魔法のような発見」の特別な必要はありません。

4

1 に答える 1

4

対象とするプロセッサの種類については言及していません。この回答は x86 の観点からのものですが、おそらく他のアーキテクチャでも同様のタスクになるでしょう。

まず、そのようなプログラムを作成して実行することを制限するものは何ですか? コンピューターで root アクセス権 (x86 用語で ring0 コードを実行できる可能性) がある場合は、次の操作を実行できます。

  1. 必要なすべての割り込みをフックします (または、すべての割り込みをフックすることもできます)。
  2. 命令を生成します。
  3. 命令コードをメモリに書き込みます (命令の長さが異なる場合があります)。
  4. jmpcallintまたはを命令の後に記述しint3ます (x86 プロセッサでは、他のアーキテクチャでは命令が異なります)。
  5. 命令にジャンプすると、実行されるか、割り込みが発生します。実行された場合は、その後、処理コードをジャンプまたは呼び出します。割り込みが発生した場合は、スタックからチェックcs:ipして(命令が失敗したアドレスを知るために)、どの割り込みにいるのかなどを調べてから、処理コードをジャンプまたは呼び出します。

次に、処理コードで、必要なすべてのデータ (少なくともすべてのレジスター) を外部ポートに送信し、別のコンピューターですべてのデータをディスクに保存します。

  1. 次に、次の命令を生成します。
  2. すべての命令を処理していない場合は、3 にジャンプします。

ただし、x86 の場合、許容される最大命令長は 15 バイトです。256^15 = 1.33 * 10^36。宇宙の年齢は ~4.339 * 10^17 秒です。シングル コアの 10.0 GHz プロセッサを想定し、1 クロックあたり正確に 1 つの命令を (試して報告するため)、15 バイトのすべての命令をテストするには、現在のプロセッサの年齢よりも短い時間で 300 000 000 以上のプロセッサが必要になります。宇宙:

(256^15)/(10*10^9)/(4.339*10^17) = 306344317

もちろん、かなりの収納スペースも必要です。

于 2012-12-27T18:41:54.923 に答える