私はリバースエンジニアリングを行っており、DLLを介してゲームのメモリにパッチを適用しています。通常、私は単一または複数の関数ですべてにパッチを適用する同じ古い方法に固執します。しかし、実行する必要のあるメモリ書き込みを定義する構造体配列を使用し、それらすべてを一度にループすることで、より適切に実行できるように感じます。管理がはるかに簡単なIMO。
でも、一定にしたいです。したがって、パッチごとにそのようなものにメモリを動的に割り当てる必要はなく、データは一度に(.rdataに)すべて存在します。これは、「bytesize」データを使用する単純なタスクです。たとえば、次のようになります。
struct struc_patch
{
BYTE val[8]; // max size of each patch (usually I only use 5 bytes anyway for call and jmp writes)
// I can of course increase this if really needed
void *dest;
char size;
} patches[] =
{
// simply write "01 02 03 04" to 0x400000
{{0x1, 0x2, 0x3, 0x4}, (void*)0x400000, 4},
};
//[...]
for each(struc_patch p in patches)
{
memcpy(p.dest, p.val, p.size);
}
しかし、タイプをもっと詳しく知りたいときは、バイト配列「90909090」として「0x90909090」のような整数を指定する方法が見つかりません。したがって、これは機能しません。
struct struc_patch
{
BYTE val[8]; // max size of each patch (usually I only use 5 bytes anyway for call and jmp writes)
// I can of course increase this if really needed
void *dest;
char size;
} patches[] =
{
// how to write "jmp MyHook"? Here, the jmp offset will be truncated instead of overlapping in the array. Annoying.
{{0xE9, (DWORD)&MyHook - 0x400005}, (void*)0x400000, 5},
};
もちろん、大きな問題は、&MyHookをコンパイラーで解決する必要があることです。望ましい結果を得て、それを一定に保つ他の方法はありますか?
正直なところ、STLの経験はほとんどありません。したがって、それを使用した解決策がある場合は、コードを正しく理解するために、詳細に説明する必要があるかもしれません。私は大きなC/C ++ / WinAPI中毒者ですが、似たような性質で書かれたゲーム用なので、ぴったりです。