1

memcpyはあまり使用されていませんが、これが機能しない私のコードです。

memcpy((PVOID)(enginebase+0x74C9D),(void *)0xEB,2);

(enginebase + 0x74C9D)は、パッチを適用するバイトのアドレスへのポインターの場所です。

(void *)0xEBは、必要な種類のjmpのオペコードです。

唯一の問題は、これが回線を実行しようとした瞬間にクラッシュすることです。何が間違っているのかわかりません。

4

2 に答える 2

1

引数(void*)0xEBは、アドレスからメモリをコピーすることを言っています0xEB。おそらくあなたはもっと似たようなものが欲しいでしょう

unsigned char x = 0xEB;
memcpy((void*)(enginebase+0x74c9d), (void*)&x, 2);

0xEBを宛先に適切にコピーするため。ところで、2はプログラムメモリに1バイトをコピーするのに正しい値ですか?1バイトをコピーしているので、1になるはずです。私はまた、あなたがただすることはできないという仮定の下にあります

((char*)enginebase)[0x74c9d] = 0xEB; 

何らかの理由で?(プログラムのメモリを意図的に上書きした経験はありません)

于 2010-03-18T03:09:18.180 に答える
0

memcpy()は、ソースバッファとデスティネーションバッファに2つのポインタを必要とします。2番目の引数はポインターではなく、データ自体です(説明したように、これはjnzのオペコードです)。私があなたがやろうとしていることを正しく理解しているなら、あなたはその続きとしてオペコードを使って配列を設定し、そしてその配列へのポインタをmemcpy()に提供するべきです。

割り当てられたスペース(アドレス0xEB)からメモリ位置を参照しようとすると、プログラムがクラッシュします。

于 2010-03-18T03:08:53.240 に答える