*nix环境用户态memdump的几种方案

在*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才能编译,纯属扯淡。

 

Spread the word. Share this post!

Meet The Author

C/ASM程序员

Leave Comment