Контроль обращения программы к памяти

Тема в разделе "WASM.RESEARCH", создана пользователем YuraseK, 8 апр 2006.

  1. YuraseK

    YuraseK New Member

    Публикаций:
    0
    Регистрация:
    25 сен 2004
    Сообщения:
    13
    Адрес:
    Republic of Belarus
    Суть решаемой задачи заключается в следующем:

    Имеется программа, которая контролирует соответствие своего кода в памяти. Имеется участок в коде программы, который мне очень хочется изменить (всего 6 байт). Код, который контролирует правильность памяти программы не конролирует область памяти, занимаемую им самим. Используя Olly было найдено 6 команд, обращающихся к изменяемым данным. Эти команды нельзя изменять, т.к. они в программе использются неоднакратно для проверки разных участков памяти. Изменямый код проверяется только один раз при запуске.

    Так вот, вопрос следующего характера: как лучше всего отследить обращение кода к этим 6 байтам и подсунуть ему необходимые байтики?
     
  2. crypto

    crypto Active Member

    Публикаций:
    0
    Регистрация:
    13 дек 2005
    Сообщения:
    2.533
    Типа все очень абстрактно. Все зависит от модуля проверки - привел бы его текст, да пару кусков из проги, где проверяется целостность.
     
  3. Atlantic

    Atlantic Member

    Публикаций:
    0
    Регистрация:
    22 июн 2005
    Сообщения:
    322
    Адрес:
    Швеция
    CreateProcess(...,DEBUG_PROCESS,...);

    Потом ставишь (GetThreadContext/SetThreadContext) в отлаживаемом процессе Debug регистры в нужное положение на перехват чтения/записи/исполнения соответствующих 6 байт (правда, больше 4 байт одни регистр перехватить не может, так что придется использовать два).

    Еще можно поставить атрибуты страницы с этими байтами как PAGE_NOACCESS, и ловить все Access violation'ы
     
  4. alpet

    alpet Александр

    Публикаций:
    0
    Регистрация:
    21 сен 2004
    Сообщения:
    1.221
    Адрес:
    Russia
    YuraseK

    все идет к тому что все-же команды придется изменить на вызов функции, которая будет проверять смещение и в случае адресации на байты будет подставлять нужные значения.
     
  5. YuraseK

    YuraseK New Member

    Публикаций:
    0
    Регистрация:
    25 сен 2004
    Сообщения:
    13
    Адрес:
    Republic of Belarus
    Короче сам разобрался. Решил вопрос следующим образом: нашел области памяти, не проверяемые защитой. Так как таких областей было всего три и при этом в несколько байт, то меня заинтересовала последовательность в 20 байт, а дальше дело техники: брекпоинт на обращение к этим данным и алгоритм сверки зашитого кода с полученным после проверки памяти как на ладони. Дальше два варианта действия: меняем зашитый код на необходимый или меняем результат сравнения.