0

memcpy の src ポインターが間違っているという問題があります。

unsigned char* lpBuffer私のバイトを含むバッファです、私はollyでチェックしました。

コード:

 IMAGE_DOS_HEADER iDOSh;
 memcpy(&iDOSh,lpBuffer,sizeof(iDOSh));

問題は、lpBuffer指摘が間違っていることです。デバッガからの出力は

dest = 002859E8 RIGHT
src = 000001D8 FALSE

src無効を指しています:(理由がわかりません

読んでくれてありがとう

4

3 に答える 3

4

なぜollydbgでチェックするのに、もっと便利なものでチェックしないのですか?? IDEで手順をトレースします。ポインターの値は、関数に渡したときに無効になることはありません(値によって渡されるため)。つまり、呼び出しmemcpyの直前に無効になっていることを意味します。memcpy

残念ながら、あなたのコードは、 「何も問題がない」memcpyという明白な呼び出しのみをカバーしています。

また、ポインターの奇妙な0x00000YY値は、実際には何かが間違っていたことを示しており、おそらくコードのどこかに無効な型キャストがあることを示しています(またはそのようなもの)。

于 2010-06-03T18:10:18.280 に答える
1

C関数を呼び出すアセンブリでデバッグしていて、ollydbgでそれをトレースしようとしていると思います(私はそれが何であるかを調べ、機能リストに基づいてこの仮定に基づいていました)。これを行うのは非常に困難です。

次のことをお勧めします。

...
void print_ptr(void * p) {
     fprintf(stderr, "%p\n", p);
}
...
    IMAGE_DOS_HEADER iDOSh;

    print_ptr(lpBuffer);
    memcpy(&iDOSh,lpBuffer,sizeof(iDOSh));
    print_ptr(lpBuffer);

実際に印刷できない場合でも問題ありません。extern問題のファイルに関数を作成するだけmemcpyで、コンパイラーは最初のパラメーターを保持する場所に値をロードするように強制されます。デバッガーでこれを観察できるはずです。

memcpy(合理的な C ライブラリから) が実際に何か間違ったことをしている可能性は非常に低いです。

何が問題なのかを推測する必要があるとすれば、それは実際にはメモリ ロケーションのリンカー ラベルではなく、リンカー ラベルであるlpBufferはずです。void *その場合、次のように宣言してみてください。

extern char lpBuffer[];

memcpyを次のように実行します

memcpy(&iDOSh,lpBuffer,sizeof(iDOSh));

また

extern IMAGE_DOS_HEADER lpBuffer;

memcpyを次のように実行します

memcpy(&iDOSh,&lpBuffer,sizeof(iDOSh));
于 2010-06-03T22:04:19.243 に答える
0

lpBuffer呼び出す直前と直後にの値を確認してくださいmemcpy。変わりますか?

lpBufferこれは、呼び出しで値をmemcpy上書きしていることを意味します (つまり、実行していると思われることを実行していません... パラメータを再確認してください)。

私の推測では、あなたのコードを見ると、おそらく への呼び出しで変更されていないでしょうmemcpy。つまり、lpBuffer直前と直後の値を確認して変更されていないことが示されている場合は、 を呼び出す前に誤って変更していますmemcpy。その変更を追跡する必要があります。

于 2010-06-03T19:28:55.907 に答える