在*nix环境用户态对任意进程进行memdump,普适方案是:
gcore gdb dump memory <filename> <begin> <end>
从程序员角度看,有这么几种方案:
a)
PTRACE_ATTACH waitpid PTRACE_PEEKTEXT/PTRACE_PEEKDATA write PTRACE_DETACH
这可能是最古老的方案,效率最差,但兼容性最好。
waitpid确保目标进程STOP。在PTRACE_DETACH之前不需要显式PTRACE_CONT,PTRACE_DETACH之后目标进程会自动CONT。
b)
PTRACE_ATTACH waitpid open( /proc/[pid]/mem ) lseek read write close PTRACE_DETACH
为了打开/proc/[pid]/mem,需要PTRACE_ATTACH,仅仅”kill -SIGSTOP”是不够的。lseek需要处理”32-bits程序访问文件0x80000000及以上偏移”的问题。
c)
PTRACE_ATTACH waitpid open( /proc/[pid]/mem ) pread write close PTRACE_DETACH
pread代替了lseek+read。在多线程编程中建议使用pread/pwrite,它们不会改变read/write用到的文件I/O偏移。
d)
process_vm_readv/process_vm_writev
自从Linux 3.2 (2012.1)及glibc 2.15 (2012.3)始,可以用使用上述API,此时不需要事先PTRACE_ATTACH,也不要求目标进程STOP。有点类似Windows上的ReadProcessMemory/WriteProcessMemory。
这个办法需要注意内核版本是否适用。
不管用哪种办法,都只需要gcc,不需要复杂的SDK之流。Android就当它是Linux,当你看到某个Android上的memdump.c需要NDK才能编译,纯属扯淡。