LINUX.ORG.RU

Доступ к памяти процесса


0

0

Есть ли в линуксе способ прочитать память процесса кроме ptrace? И есть ли у этого ptrace какие-либо ограничения? У меня он валится с Input/output error, кажется на больших регионах.

anonymous

Ответ на: комментарий от klalafuda

а это разве работает? потому что:
$ cat /proc/self/mem
cat: /proc/self/mem: Input/output error

да и где-то натыкался, что это не реализовано

anonymous
()
Ответ на: комментарий от anonymous

> И есть ли у этого ptrace какие-либо ограничения? У меня он валится с Input/output error, кажется на больших регионах.

EIO AFAIR выпадало если а) обращаться по невыровненному адресу б) за пределы замапированной памяти. а вообще, к примеру, на FC6 (да, старенькая она) при активном считывании через ptrace() [дампы памяти на сотни метров] запросто можно словить kernel panic. вполне возможно, что где то там живёт страшная бага. может уже и пофиксили в более новых ядрах, не проверял.

> а это разве работает? потому что:
> $ cat /proc/self/mem
> cat: /proc/self/mem: Input/output error
> да и где-то натыкался, что это не реализовано

все там прекрасно реализовано, trust me :)
есть правда одно но - это установка смещения, по которому читаем.
оно по всей очевидности должно быть равно виртуальному адресу в
контексте процесса. отсюда в том числе ошибка cut-a :)

// wbr

klalafuda ★☆☆
()
Ответ на: комментарий от klalafuda

про ptrace:

я выбираю регионы из /proc/pid/maps, за пределы не выхожу точно. а вот по не выровненным адресам читаю, да. некоторые регионы читаются нормально полностью. а потом на относительно большом регионе (~1M и более, не проверял, все ли нормально прочитанные регионы действительно меньше), после некоторого чтениня вылазит EIO. ядро 2.6.26. попробую с выравниваем сейчас.

/proc/pid/mem:

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

то есть lseek'ом надо скакать по регионам? логично, в принципе :)

попробую через mem сделать. к тому же, это должно быть намного быстрее, чем дёргать ptrace на каждую ячейку памяти.

спасибо!

//каптча какая-то осмысленная всё время :) - warped

anonymous
()
Ответ на: комментарий от anonymous

> то есть lseek'ом надо скакать по регионам? логично, в принципе :)

hint: даже не через lseek() но через lseek64()

> попробую через mem сделать. к тому же, это должно быть намного быстрее, чем дёргать ptrace на каждую ячейку памяти.

да, это *намного* быстрее, чем через ptrace().

// wbr

klalafuda ★☆☆
()
Ответ на: комментарий от anonymous

> я выбираю регионы из /proc/pid/maps, за пределы не выхожу точно. а вот по не выровненным адресам читаю, да. некоторые регионы читаются нормально полностью. а потом на относительно большом регионе (~1M и более, не проверял, все ли нормально прочитанные регионы действительно меньше), после некоторого чтениня вылазит EIO. ядро 2.6.26. попробую с выравниваем сейчас.

нужно читать/писать по выровненным адресам. если хочется записать что то по невыровненному адресу, то сперва читаем выровненное значение, модифицируем его части и после пишем обратно. это позволяет через врапер над ptrace читать/писать сколько угодно и какой угодно длины.

// wbr

klalafuda ★☆☆
()
Ответ на: комментарий от klalafuda

>даже не через lseek() но через lseek64()

а, блин, точно! у lseek'а же offset signed long, не хватит его. спасибо, а то б щас сидел думал, почему не работает ;)

anonymous
()
Ответ на: комментарий от klalafuda

не, не работает через /proc/pid/mem. при попытке read говорит: No such process. lseek64 делал на стартовый адрес региона или чуть дальше, например на 0xbfbce100

bfbce000-bfbe3000 rw-p bffeb000 00:00 0 [stack]

а вот ptrace с выравниваем заработало.

anonymous
()
Ответ на: комментарий от anonymous

всё, разобрался. оказывается, что бы читать из /proc/pid/mem, надо сначала приатачиться к процесу ptrace'ом.

кстати, в пдфке выше написано, что поддержка write для /proc/pid/mem в линуксе реализована, но по умолчанию заблокирована. и её можно заенаблить, если вдруг кому много писать в процес понадобится.

anonymous
()
Ответ на: комментарий от anonymous

> всё, разобрался. оказывается, что бы читать из /proc/pid/mem, надо сначала приатачиться к процесу ptrace'ом.

да, кстати, есть такой момент. о нём я как то совершенно забыл.

// wbr

klalafuda ★☆☆
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.