BYTE* adr_r = (BYTE*)0x006B28C8;
BYTE* adr_l = (BYTE*)0x006B28DC;
if ((*adr_r) == 97)
{
DWORD dwProtect_r, dwProtect_l;
VirtualProtect((LPVOID)adr_r, 1, PAGE_EXECUTE_READWRITE, &dwProtect_r);
VirtualProtect((LPVOID)adr_l, 1, PAGE_EXECUTE_READWRITE, &dwProtect_l);
*adr_r = 122;
*adr_l = 122;
VirtualProtect((LPVOID)adr_r, 1, PAGE_READONLY, &dwProtect_r);
VirtualProtect((LPVOID)adr_l, 1, PAGE_READONLY, &dwProtect_l);
}
Как изменить память процесса навсегда или что за чудеса творит арт мани?
Собственно название темы говорит что не все так просто.
Дело в том, что если поменять память по нужному адресу из арт мани, значение в ячейке сохраняется навсегда.
Если же я пробую сменить там значение из своей длл, то через несколько миллисекунд оно возвращается на старое %)
Делаю так... под конец уже даже PAGE_READONLY стал устанавливать, вместо предыдущих прав
Код:
Есть у кого-то идеи в чем дело?
Все зависит от конкретного приложения и от того, что оно делает с этом участком памяти.
почему я не могу сделать того же?
по умолчанию этот байт защищен от записи.
я не исключаю случая, что я вообще ничего не понимаю сейчас, но вроде логично:
снять защиту
записать значение
установить защиту.
значение не должно меняться самопроизвольно
Цитата: Lei fang
в очередности вызова функций и параметров у меня - протект на 1 байт снимается и устанавливается, а не устанавливается и снимается.
не важно. вы в константах
PAGE_EXECUTE_READWRITE,
PAGE_READONLY
первое слово переведите. Ну и в справку залезьте.
Кстати, как вы определяете что на миллисекунду это значение изменилось?
перефразирую вопрос, каким образом можно сменить значение по определенному адресу в памяти программы, так чтобы оно не восстановилось? Я пробовал методом описанным в первом посте - по прошествии некоторого времени измененное значение меняется на оригинальное.
Если менять это значение в арт мани, оно остается таким сколь угодно долго.
PAGE это страница.
Особой разницы в описании:
PAGE_READONLY - Enables read-only access to the committed region of pages. An attempt to write to the committed region results in an access violation. If Data Execution Prevention is enabled, an attempt to execute code in the committed region results in an access violation.
PAGE_EXECUTE_READ - Enables execute or read-only access to the committed region of pages. An attempt to write to the committed region results in an access violation.
не вижу, если вы имели ввиду что я устаналиваю не верно защиту
Увы, я не обладаю обширными познаниями во всех тонкостях выполнения процессором кода. Знаю лишь то, что если страница отсутствует в его кеше, генерируеются страничное исключение, выполнение кода останавливается до загрузки в кеш недостающей страницы. Этого явно не достаточно, чтоыб разобраться.
Может уже расскажите, в контексте какой задачи вы это делаете иначе много воды выльется вам в уши.
Целью смены значения по адресу является изменить адрес к файлам.
Оригинальные значения хранящиеся там и не меняющиеся в процессе работы приложения А - это "ani\\br%03dr.ani"
Мне надо всего лишь сменить первую букву 'a' на 'z' и обратно когда надо.
BYTE* adr_r = (BYTE*)0x006B28C8; // указатель на начало этой строки. Собственно я им пользуюсь как указатель на отдельный байт памяти (первый элемент массива).
1. ставите на страницу (размером PAGE_SIZE и адресом выровненным на страницу) по средством VirtualProtect защиту PAGE_WRITECOPY
2. переписываете значение переменной
3. возвращаете изначальную защиту для данной страницы
Премного благодарен, задача решена
Люди, подскажите, что мне делать? У меня не меняется в армани значение денег когда я их меняю в последнем шаге, он исправляет их на то, что было,что мне делать?
а так, судя по всему, ты меняешь "значение - копию", которое переписывается "значением - оригинала" каждый фрейм.
Цитата: SVAN48
Люди, подскажите, что мне делать? У меня не меняется в армани значение денег когда я их меняю в последнем шаге, он исправляет их на то, что было,что мне делать?
Искать трейнер.