memcpyはあまり使用されていませんが、これが機能しない私のコードです。
memcpy((PVOID)(enginebase+0x74C9D),(void *)0xEB,2);
(enginebase + 0x74C9D)は、パッチを適用するバイトのアドレスへのポインターの場所です。
(void *)0xEBは、必要な種類のjmpのオペコードです。
唯一の問題は、これが回線を実行しようとした瞬間にクラッシュすることです。何が間違っているのかわかりません。
memcpyはあまり使用されていませんが、これが機能しない私のコードです。
memcpy((PVOID)(enginebase+0x74C9D),(void *)0xEB,2);
(enginebase + 0x74C9D)は、パッチを適用するバイトのアドレスへのポインターの場所です。
(void *)0xEBは、必要な種類のjmpのオペコードです。
唯一の問題は、これが回線を実行しようとした瞬間にクラッシュすることです。何が間違っているのかわかりません。
引数(void*)0xEB
は、アドレスからメモリをコピーすることを言っています0xEB
。おそらくあなたはもっと似たようなものが欲しいでしょう
unsigned char x = 0xEB;
memcpy((void*)(enginebase+0x74c9d), (void*)&x, 2);
値0xEBを宛先に適切にコピーするため。ところで、2はプログラムメモリに1バイトをコピーするのに正しい値ですか?1バイトをコピーしているので、1になるはずです。私はまた、あなたがただすることはできないという仮定の下にあります
((char*)enginebase)[0x74c9d] = 0xEB;
何らかの理由で?(プログラムのメモリを意図的に上書きした経験はありません)
memcpy()は、ソースバッファとデスティネーションバッファに2つのポインタを必要とします。2番目の引数はポインターではなく、データ自体です(説明したように、これはjnzのオペコードです)。私があなたがやろうとしていることを正しく理解しているなら、あなたはその続きとしてオペコードを使って配列を設定し、そしてその配列へのポインタをmemcpy()に提供するべきです。
割り当てられたスペース(アドレス0xEB)からメモリ位置を参照しようとすると、プログラムがクラッシュします。