В общем, вы не можете.
Когда исполняемые файлы компилируются, ссылки на статические переменные разрешаются компоновщиком в машинном коде в необработанный адрес переменной. Никаких указаний на то, что такая ссылка существовала, не осталось, и из-за природы машинного кода x86 очень трудно найти эти ссылки позже (вы не можете точно сказать, где инструкции начинаются однозначно).
Более того, вы не знаете, обычная ли это переменная. Это может быть частью статического класса или структуры. Эти различия теряются после компиляции, но при попытке переместить переменные это значительно усложняется - возможно, код ссылается на него на основе смещения от другой переменной (т. Е. Начала структуры).
Что вы действительно пытаетесь достичь здесь? Там может быть лучший способ, чем просто возиться с макетами виртуальной памяти.
Если вы просто пытаетесь сломать существующих тренеров, один из подходов (непроверенный!) Может заключаться в изменении ACL процесса. При создании процесса используйте CreateProcess
и передайте пользовательский дескриптор безопасности для lpProcessAttributes
и lpThreadAttributes
(для процесса, который уже запущен, вы можете сделать это с помощью SetSecurityInfo
). Установите DACL в дескрипторе безопасности так, чтобы были предоставлены только права SYNCHRONIZE | PROCESS_QUERY_INFORMATION | PROCESS_SUSPEND_RESUME | PROCESS_TERMINATE
(т. Е. Отозвать все остальные права на все записи DACL). Эта техника не является надежной - тренер, понимающий, что вы делаете это, может просто установить DACL обратно на значение по умолчанию; однако это должно сломать существующих тренеров, отказав им в доступе к отладке.