1

メモリ ブロックが侵害されていないことを確認する際に、定数としてマジック ナンバーを使用したいのですが、署名を 16 進形式に戻す「リバース チェック」の方法はありますか?MAGIC_32BIT

 #define MAGIC_32BIT 0x77A5844CU
 int signature = (int)MAGIC_32BIT;

また、もっとクリエイティブなマジック ナンバーを使いたいのですが、それらを生成するアイデアや従うべきルールはありますか? 気分を害することはありませんが、私はマイクロソフトのことを聞いており、私の0xB16B00B5ものをより人間が「読みやすい」ものにしたいと考えています。

4

2 に答える 2

1

この回答があなたの質問に答えていないことは承知していますが、何らかの助けになることを願っています。

「マジック ナンバー」は、実際には、アプリケーションと、検出したい、または予想しているメモリ破損のタイプの両方に依存する必要があります。

タスクのスタック全体を 0xEE で初期化する OS を見てきました。この値は、簡単に認識でき、ほとんどの人が使用する可能性は低いです。このメソッドを使用して、0xEE バイトをカウントすることにより、未使用のスタック スペースの量を推測できます。それは完璧ですか?しかし、それは速く、(かなり)安く、簡単に行うことができます. これの利点の 1 つは、破損しているバイトを簡単に特定できる場合があることです (0xEE バイトの海に 0xEE 以外のバイトがいくつかある場合など)。基本的な考え方は、他の分野にも転用できるものでなければなりません。

カスタム ルートに進み、データ構造ごとに一意のマジック ナンバー (CRC など) を持つことができます。コストはかかりますが、データ構造が破損しているかどうかを検出するのに適しています。どこで、どのように、いつ破損したかはわかりませんが、破損したかどうかはわかりません。残念ながら、これは人間が読めるリクエストに失敗します。

メモリ ブロックが十分に大きい場合は、MMU を利用して、メモリ ブロックへの書き込みをデフォルトで無効にし、変更が必要な期間だけ有効にすることで、メモリ ブロックを保護することが可能で実用的です。この方法では書き込みパフォーマンスが低下しますが、いつ、どこで、誰によって破損が発生しているかを検出するのに役立ちます。これにより、マジックナンバーが完全になくなります。

お役に立てれば。

于 2012-08-19T12:37:58.580 に答える
1

ええ、私は答えを見つけました。マクロで直接チェックすると、cegfaultのwikiコメントは、必要なキャストを使用せずにint変数が交換可能であることを示しました。

#define MAGIC_NUM 0x8BADF00D
#define CHECK_SIG(A) (A == MAGIC_NUM)
于 2012-08-19T05:48:04.770 に答える