Изменение распределения скомпилированной исполняемой памяти - PullRequest
1 голос
/ 31 июля 2011

У меня есть скомпилированный исполняемый файл без доступа к исходному коду. Каждый раз, когда он запускается, переменная присваивается адресу памяти 0x7B008C. Я пытаюсь заставить его использовать другой адрес, а не тот каждый раз. Он не должен быть динамическим, потому что моя цель - только сломать существующие в настоящее время приложения, которые изменяют поведение исходной программы.

Итак, мой вопрос: как проще всего добиться этого, не нарушая поведения программы?

Ответы [ 2 ]

4 голосов
/ 31 июля 2011

В общем, вы не можете.

Когда исполняемые файлы компилируются, ссылки на статические переменные разрешаются компоновщиком в машинном коде в необработанный адрес переменной. Никаких указаний на то, что такая ссылка существовала, не осталось, и из-за природы машинного кода x86 очень трудно найти эти ссылки позже (вы не можете точно сказать, где инструкции начинаются однозначно).

Более того, вы не знаете, обычная ли это переменная. Это может быть частью статического класса или структуры. Эти различия теряются после компиляции, но при попытке переместить переменные это значительно усложняется - возможно, код ссылается на него на основе смещения от другой переменной (т. Е. Начала структуры).

Что вы действительно пытаетесь достичь здесь? Там может быть лучший способ, чем просто возиться с макетами виртуальной памяти.

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

0 голосов
/ 31 июля 2011

Вы, вероятно, могли бы сделать это, пройдя весь исполняемый файл с помощью BEAEngine (я говорю , вероятно, , потому что я никогда этого не делал, думал, что я использовал BEAEngine, и он способен делать это), но это было бы очень сложно и, вероятно, довольно сложно.

Я бы не стал тратить свое время на попытки сделать это, потому что, как и bdonlan, мне было бы наплевать на людей, использующих кроссовки в одиночной игре. И есть другие, менее сложные способы сломать тренеров, чем то, что вы описываете.

...