アクセス ポインターの検出は非常に面倒であり、静的メモリ値をさまざまなコンパイラやゲーム バージョンに適応させるのは困難です。
malloc()、free() などの API フックでは、ポインターをたどる方法とは異なる方法があります。ディスカバリーは、すべての動的メモリー割り当てを記録し、並行してメモリー検索を行うことから始まります。見つかったヒープ メモリ アドレスは、記録されたメモリ割り当てと逆照合されます。オブジェクトのサイズと、オブジェクト内の値のオフセットがわかります。これをバックトレースで繰り返し、malloc() 呼び出しまたは C++ コンストラクターのジャンプバック コード アドレスを取得します。その情報を使用して、そこから割り当てられるすべてのオブジェクトを追跡および変更できます。オブジェクトをダンプして比較すると、さらに興味深い値が見つかります。たとえば、ユニバーサル エリート ゲーム トレーナー「ugtrain」は Linux でこのように動作します。LD_PRELOAD を使用します。適応は「objdump -D」で動作
参照: http://en.wikipedia.org/wiki/Trainer_%28games%29
Ugtrain のソース: https://github.com/sriemer/ugtrain
malloc() フックは次のようになります。
static __thread bool no_hook = false;
void *malloc (size_t size)
{
void *mem_addr;
static void *(*orig_malloc)(size_t size) = NULL;
/* handle malloc() recursion correctly */
if (no_hook)
return orig_malloc(size);
/* get the libc malloc function */
no_hook = true;
if (!orig_malloc)
*(void **) (&orig_malloc) = dlsym(RTLD_NEXT, "malloc");
mem_addr = orig_malloc(size);
/* real magic -> backtrace and send out spied information */
postprocess_malloc(size, mem_addr);
no_hook = false;
return mem_addr;
}
ただし、見つかったメモリ アドレスがメモリ内の実行可能ファイルまたはライブラリ内にある場合は、ASLR が動的な原因である可能性があります。Linux では、ライブラリは PIC (位置に依存しないコード) であり、最新のディストリビューションではすべての実行可能ファイルは PIE (位置に依存しない実行可能ファイル) です。