作者applecool (noOneKnows)
看板LinuxDev
标题[问题] ptrace 扫描其他 process 的记忆体?
时间Sun Mar 30 17:29:09 2014
※ [本文转录自 C_and_CPP 看板 #1JDeIuFt ]
C/C++ by GCC 4.8, Android NDK + SL4A / Python for Android,
Android 4.3 root 权限,ARM 架构
问题:
使用 ptrace 来扫描其他 process 的记忆体
遇到了很多困难,google 不到请高手帮忙解答,感激不尽
使用方式:
用 Python 呼叫由 C/C++ 编译出的 so 或执行档 (因为 member
比较熟 C)
描述:
1. 写 ptrace 的程式如果包装成 so 来给人 call,
所有的 processes 都 attach 不到...
如果写成执行档,用 python 打开执行也不行
但该执行档直接用 adb shell 进去 run
就可以 attach 部分 processes
但有一部分 processes 还是 attach 不到...
请问该如何 attach 所有 processes 呢?
还有我推测 ptrace 必须在 parent process 执行
C or Python 怎麽新建一个 "parent" process 呢?
2. mem 读进来 的记忆体量常常会少 4K bytes (read() 回传值),
不然就是读不到,但有 attach 到且读出记忆体的都是正确结果
因为多次读取也不行,为何会少 4K,如何避免?
有的记忆体区段读不到该怎办? (都是从 maps 抓出的可读区)
3. ptrace 只能抓到 process 的单一 thread,请问对付
multi-threading 的程式怎麽抓比较好?
maps 档要如何分析较有效率?
希望高手指点迷津,感恩不尽。
※ 编辑: applecool (123.110.252.159), 03/30/2014 11:24:35
※ 发信站: 批踢踢实业坊(ptt.cc)
※ 转录者: applecool (123.110.252.159), 03/30/2014 17:29:09
1F:推 yvb:请先试着查看使用 strace 程式, 并参考其原始码. 03/31 12:56
2F:→ yvb:建议先在 x86 linux 上试试看, 再换到 arm platform 测试. 03/31 12:58
3F:→ yvb:曾遇过在arm和mips上strace无法正确追踪的版本,换版本就好了. 03/31 12:59
4F:→ yvb:但未进一步研究那些版本出问题的原因. 03/31 13:01
5F:→ applecool:感激不尽阿!!!我先试看看 strace 03/31 13:10
6F:推 yvb:啊, sorry, 没说清楚; strace是回第3点, 和问题 1, 2 无关. 03/31 16:06
7F:→ yvb:至於第 2 点, 可能要去参考 gdb 了. 03/31 16:07
8F:→ yvb:而第 1 点, 应该不限定 parent, 不然gdb和strace就不 work 了. 03/31 16:13
9F:→ buganini:没在android用过,不过ptrace,非root只能attach child 04/14 20:27
10F:→ buganini:root则不限,1看起来还是非root的感觉 04/14 20:28
11F:推 yvb:楼上所述的情况, 查了一下, 在较新的 Linux kernel (3.4 以後) 04/15 13:16
12F:→ yvb:可透过 /proc/sys/kernel/yama/ptrace_scope 来设定, 04/15 13:17
13F:→ yvb:预设值 1 表示限 root 和 parent, 改为 0 则相同 uid 亦可; 04/15 13:20
14F:→ yvb:而较旧的 kernel (3.3 以前) 无此设定值, root 或同 uid 即可. 04/15 13:21
15F:→ applecool:感谢不尽~~~不过我有 root 04/17 14:25