Я некоторое время играл с ptrace
. Я следовал некоторым руководствам, таким как этот или вот этот. Пока что, когда у меня есть дочерний процесс ptrace
-d, я могу:
- Обнаружение системных вызовов и просмотр регистров.
- Получить строки, содержащиеся в адресах, на которые указывают регистры, благодаря опции
PTRACE_PEEKDATA
параметраptrace
. - Измените значения этих регистров и измените значения памяти в пользовательском пространстве дочернего процесса благодаря опции
PTRACE_POKEDATA
дляptrace
.
Моя проблема заключается в следующем: допустим, например, я только что обнаружил системный вызов open
. Я могу изменить имя открываемого файла благодаря адресу, хранящемуся в регистре ebx. Однако мне интересно, могу ли я просто изменить имя файла на все, что захочу, любого размера. Если имя, на которое я меняюсь, действительно велико (скажем, в 50 раз больше исходной длины имени файла), не буду ли я возиться с некоторой памятью, на которую не должен писать? Должен ли я «выделить» некоторую память в пространстве памяти ребенка? Если да, то как это сделать?
Обратите внимание, что дочерний процесс — это некоторая программа, выполняемая с помощью execve
, я не могу получить доступ к ее исходному коду.