Суть решаемой задачи заключается в следующем: Имеется программа, которая контролирует соответствие своего кода в памяти. Имеется участок в коде программы, который мне очень хочется изменить (всего 6 байт). Код, который контролирует правильность памяти программы не конролирует область памяти, занимаемую им самим. Используя Olly было найдено 6 команд, обращающихся к изменяемым данным. Эти команды нельзя изменять, т.к. они в программе использются неоднакратно для проверки разных участков памяти. Изменямый код проверяется только один раз при запуске. Так вот, вопрос следующего характера: как лучше всего отследить обращение кода к этим 6 байтам и подсунуть ему необходимые байтики?
Типа все очень абстрактно. Все зависит от модуля проверки - привел бы его текст, да пару кусков из проги, где проверяется целостность.
CreateProcess(...,DEBUG_PROCESS,...); Потом ставишь (GetThreadContext/SetThreadContext) в отлаживаемом процессе Debug регистры в нужное положение на перехват чтения/записи/исполнения соответствующих 6 байт (правда, больше 4 байт одни регистр перехватить не может, так что придется использовать два). Еще можно поставить атрибуты страницы с этими байтами как PAGE_NOACCESS, и ловить все Access violation'ы
YuraseK все идет к тому что все-же команды придется изменить на вызов функции, которая будет проверять смещение и в случае адресации на байты будет подставлять нужные значения.
Короче сам разобрался. Решил вопрос следующим образом: нашел области памяти, не проверяемые защитой. Так как таких областей было всего три и при этом в несколько байт, то меня заинтересовала последовательность в 20 байт, а дальше дело техники: брекпоинт на обращение к этим данным и алгоритм сверки зашитого кода с полученным после проверки памяти как на ладони. Дальше два варианта действия: меняем зашитый код на необходимый или меняем результат сравнения.