-4

これは、Linux x86 システムの誰かの視点からのものです。ハードコーディングされたアドレス以外のものをポインターに格納することは可能ですか? ただし、問題は次のとおりです。ポインターに格納される値は、以前は文字列として格納されています。レジスターやその他のポインターを参照する方法がないことは確かですが、確認したかっただけです。そして、なぜ私がこのようなことをしたいのか、人々が尋ねるだろうと私は知っています。説明するには時間がかかりすぎますが、代替ソリューションはないと確信しています。

これを追加したはずです:

    char* addresses = "\x32\x45\x19..."

「アドレス」にハードコードされたアドレス以外のものを保存したい。

編集:

笑 うわー、私はかなりはっきりしていると思いました。文字の配列、ポインター、または文字列と呼んでいます。この文字列は、PHP で ZVAL 構造体として扱われます。文字列内にハードコーディングされたアドレス以外の情報を保存できるかどうか疑問に思っています。

4

2 に答える 2

0

「すごい、かなりはっきりしていると思いました。文字の配列、ポインタ、または文字列と呼んでいます。この文字列は、PHPではZVAL構造体として扱われます。私は疑問に思っています。文字列内にハードコードされたアドレス以外の情報を格納できます。」

あなたがそれをする方法ではありません。

 char * addresses = "\x32\x45\x19..." ;
 addresses is set to point to something you should not change.

そのようなものにストレージを割り当てる必要があります。

例えば

 char stuff [256] ;
 char * addresses = stuff;
 memcpy(stuff,"\x32\x45\x19...",sizeof("\x32\x45\x19..."));
于 2012-06-08T00:06:26.640 に答える
0

アドレスが文字列として格納されている場合、文字列をアドレスに変換できます (おそらくまたはでuintptr_t定義されています)。文字列内のバイトを取得してシフトおよびマスクし、アドレスに相当する整数値を生成してから、アドレスをポインターに割り当てます。<stdint.h><inttypes.h>

char *addresses = "\x32...";
char *string = addresses;
uintptr_t value = 0;
for (i = 0; i < sizeof(value); i++)
    value = (value << 8) | (*addresses++ & 0xFF);  // Sign extension avoided
void *memory_location = (void *)value;

文字列の最初のバイトがアドレスの MSB であると想定しています。(Intel を使用している場合) これが間違っている場合 (LSB が最初に格納される)、順序を逆にするようにループを適応させる必要があります。

または、速くてルーズにプレイして、チップに仕事をさせます。RISC プラットフォーム (Intel 以外) では、これにより一般に SIGBUS エラーが発生します。ただし、時々幸運になるかもしれません。

char *addresses = "\x32...";
void *memory_location = (void *)(*(uintptr_t *)addresses);

char *これは、を であるかのように扱い、逆参照するようにコードに指示しますuintptr_t *(アドレスが適切に整列されていない場合を除いて、一度に文字列全体を読み取ります。おそらく途中でカーネル トラップが発生し、2 つのフェッチになります)。メモリ位置への値。

コードに移植性を装う場合は、これが「非移植性コード」セクションにあることを確認してください。

これは、提起された問題に対する技術的な解決策です (私は理解しています)。使用を推奨するものではありません。

于 2012-06-07T23:55:27.273 に答える