Здравствуйте, в процессе ничегонеделанья у меня возникла "гениальная" мысль поэксперементировать не с байтами в файле, а со значениями аж в памяти процесса. Исходные данные: - некий процесс (не будем ходить далеко да около, процесс, естественно, связан с одним из игровых демонов PW) - желание получить (вывести на экран) значение по определенному BaseAdress из процесса - желание заменить это значение на какое-либо свое - ОС Ubuntu 12.04/Ubuntu 10.04 Мои наработки: - неким чудом я смог прочитать значение из памяти - не меньшим чудом мне удалось заместо прочитанного записать другое значение Проблемы, которые возникли по ходу дела: - имелись 2 сервера: 1. грубо говоря "рабочий" сервер с онлайном, состоящим из меня и меня (Ubuntu 12.04) 2. "теоретический" сервер, который существует только для создания нужного мне процесса (Ubuntu 10.04) - проблем с чтением данных из процесса особо не возникало (gdb - хороший помощник) - началось веселье, когда я менял значение на свое: процесс (на "рабочем" сервере) через некоторый период времени отправлял меня в долгое путешествие в гуголЪ, чтобы я искал ответ, почему процесс не выходит из состояния трассировки, хотя команда продолжать нормальное выполнение была ему дана - на "теоретическом" сервере такой проблемы не возникло, все хорошо читается и записывается, не вызывая проблем Мои предположения по поводу "зависания" процесса: - в PW как-то хитропопо реализована проверка на изменение данных в процессе (при чем данные проверяются тогда, когда процесс заставляют выполнять какие-либо действия извне - игроки), что после этого он крашится - естественно, радиус кривизны моих рук Ах да, всю эту байду я накалякал с помощью системного вызова ptrace() Прошу направить меня в нужное русло, дабы я мог продолжать терроризировать гуголЪ в поисках ответов, потому что на данный момент у меня кончились даже вопросы.
Проблема в том, что при подключении к процессу, он замораживается. Как правило, это происходит быстро, но иногда это может произойти позже. Иными словами - ваш код только отработал, а процесс уже после этого обработал сигнал "сна" и завис.
Да, я отслеживал состояние процесса и знаю, что процесс в период отладки (трассировки) становится недоступным. Но даже если действия выполнять последовательно (подключение - запись - отключение) он остается в этом состоянии, и никаким образом "оживить" его не получается, а при повторном подключении - Process not found - процесс упал и не отображается даже в списке запущенных. Такая проблема наблюдалась только с записью. P.S. Вспомнил кое-что: возможно ли такое, если в конфиге ядра (/proc/sys/kernel/yama ptrace_scope) оставить значение, запрещающее производить отладку? Хотя с другой стороны, раз для чтения программа выполняется (используя те же методы ptrace()), то почему бы не сделать этого и для записи...