1. Гость, мы просим Вас ознакомиться с Правилами Форума и Отказом от ответственности!

Работа с памятью процесса.

Тема в разделе 'C/C++', создана пользователем Violent, 19 окт 2013.

  1. TopicStarter Overlay

    Violent Пользователи

    Сообщения:
    45
    Лайки:
    19
    Пол:
    Мужской
    Репутация:
    0
    Команда:
    В поиске...
    Здравствуйте,
    в процессе ничегонеделанья у меня возникла "гениальная" мысль поэксперементировать не с байтами в файле, а со значениями аж в памяти процесса.

    Исходные данные:
    - некий процесс (не будем ходить далеко да около, процесс, естественно, связан с одним из игровых демонов PW)
    - желание получить (вывести на экран) значение по определенному BaseAdress из процесса
    - желание заменить это значение на какое-либо свое
    - ОС Ubuntu 12.04/Ubuntu 10.04

    Мои наработки:
    - неким чудом я смог прочитать значение из памяти
    - не меньшим чудом мне удалось заместо прочитанного записать другое значение

    Проблемы, которые возникли по ходу дела:
    - имелись 2 сервера: 1. грубо говоря "рабочий" сервер с онлайном, состоящим из меня и меня (Ubuntu 12.04) 2. "теоретический" сервер, который существует только для создания нужного мне процесса (Ubuntu 10.04)
    - проблем с чтением данных из процесса особо не возникало (gdb - хороший помощник)
    - началось веселье, когда я менял значение на свое: процесс (на "рабочем" сервере) через некоторый период времени отправлял меня в долгое путешествие в гуголЪ, чтобы я искал ответ, почему процесс не выходит из состояния трассировки, хотя команда продолжать нормальное выполнение была ему дана
    - на "теоретическом" сервере такой проблемы не возникло, все хорошо читается и записывается, не вызывая проблем

    Мои предположения по поводу "зависания" процесса:
    - в PW как-то хитропопо реализована проверка на изменение данных в процессе (при чем данные проверяются тогда, когда процесс заставляют выполнять какие-либо действия извне - игроки), что после этого он крашится
    - естественно, радиус кривизны моих рук

    Ах да, всю эту байду я накалякал с помощью системного вызова ptrace()

    Прошу направить меня в нужное русло, дабы я мог продолжать терроризировать гуголЪ в поисках ответов, потому что на данный момент у меня кончились даже вопросы.
  2. gam1ng Эксперт MmoDev Пользователи White List

    Сообщения:
    299
    Лайки:
    432
    Репутация:
    1
    Команда:
    GG
    Проблема в том, что при подключении к процессу, он замораживается. Как правило, это происходит быстро, но иногда это может произойти позже.

    Иными словами - ваш код только отработал, а процесс уже после этого обработал сигнал "сна" и завис.
  3. TopicStarter Overlay

    Violent Пользователи

    Сообщения:
    45
    Лайки:
    19
    Пол:
    Мужской
    Репутация:
    0
    Команда:
    В поиске...
    Да, я отслеживал состояние процесса и знаю, что процесс в период отладки (трассировки) становится недоступным. Но даже если действия выполнять последовательно (подключение - запись - отключение) он остается в этом состоянии, и никаким образом "оживить" его не получается, а при повторном подключении - Process not found - процесс упал и не отображается даже в списке запущенных.
    Такая проблема наблюдалась только с записью.

    P.S. Вспомнил кое-что: возможно ли такое, если в конфиге ядра (/proc/sys/kernel/yama ptrace_scope) оставить значение, запрещающее производить отладку? Хотя с другой стороны, раз для чтения программа выполняется (используя те же методы ptrace()), то почему бы не сделать этого и для записи...
Черновик сохранён Черновик удалён

Поделиться этой страницей