Есть ли в линуксе способ прочитать память процесса кроме ptrace? И есть ли у этого ptrace какие-либо ограничения? У меня он валится с Input/output error, кажется на больших регионах.
> И есть ли у этого 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 :)
я выбираю регионы из /proc/pid/maps, за пределы не выхожу точно. а вот по не выровненным адресам читаю, да. некоторые регионы читаются нормально полностью. а потом на относительно большом регионе (~1M и более, не проверял, все ли нормально прочитанные регионы действительно меньше), после некоторого чтениня вылазит EIO. ядро 2.6.26. попробую с выравниваем сейчас.
/proc/pid/mem:
>установка смещения, по которому читаем. оно по всей очевидности должно быть равно виртуальному адресу в контексте процесса
то есть lseek'ом надо скакать по регионам? логично, в принципе :)
попробую через mem сделать. к тому же, это должно быть намного быстрее, чем дёргать ptrace на каждую ячейку памяти.
спасибо!
//каптча какая-то осмысленная всё время :) - warped
> я выбираю регионы из /proc/pid/maps, за пределы не выхожу точно. а вот по не выровненным адресам читаю, да. некоторые регионы читаются нормально полностью. а потом на относительно большом регионе (~1M и более, не проверял, все ли нормально прочитанные регионы действительно меньше), после некоторого чтениня вылазит EIO. ядро 2.6.26. попробую с выравниваем сейчас.
нужно читать/писать по выровненным адресам. если хочется записать что то по невыровненному адресу, то сперва читаем выровненное значение, модифицируем его части и после пишем обратно. это позволяет через врапер над ptrace читать/писать сколько угодно и какой угодно длины.
не, не работает через /proc/pid/mem. при попытке read говорит: No such process. lseek64 делал на стартовый адрес региона или чуть дальше, например на 0xbfbce100
всё, разобрался. оказывается, что бы читать из /proc/pid/mem, надо сначала приатачиться к процесу ptrace'ом.
кстати, в пдфке выше написано, что поддержка write для /proc/pid/mem в линуксе реализована, но по умолчанию заблокирована. и её можно заенаблить, если вдруг кому много писать в процес понадобится.