process_vm_writev无法写入我能够读取的同一地址
process_vm_writev not able to write to the same address that I was able to read from
我正在Ubuntu机器上编写一个C++程序。我正在使用函数调用<sys/uio.h>
库中的process_vm_readv
和process_vm_writev
来尝试在另一个进程的内存中搜索值,然后写入不同的值。
我能够成功搜索和查找(通过proceess_vm_readv功能)我要更改的数据。我捕获了它所在的地址,并尝试使用该process_vm_writev
但返回值为 -1,errno
设置为 14,代表bad address
有什么理由我不应该能够写入一些我也可以读取的内存吗?我正在寻找的数据可以在地址0x6005df
处找到,但直到0x601000
我才能真正开始写回数据。
我在使用FUSE 时遇到了同样的问题,其中数据的地址是使用 ioctl(... *arg) 从客户端完美提供的,因此客户端的数据可以由服务器使用process_vm_readv()读取。
但是:process_vm_writev()不会更改客户端中的相同内存位置(无错误)。但是,当客户端提供指向指针的指针而不仅仅是地址指针时,您可以更改客户端的内存。内存位置是在堆中还是在堆栈中并不重要。
另外:如果您尝试写入 ioctl() 提供的地址和长度(cmd 参数代码类型、方向和数据大小)上方的地址,那么这是可以的。 似乎在 ioctl 调用内核期间以某种方式保护提供的内存区域。
另外2:如果您使要传输的结构/数据的大小为0,则可以修改所提供地址的客户端内存(ioctl(...参数)。
就我而言,发生这种情况是因为我在process_vm_writev()
中错误地放置了参数的顺序:本地和远程IOV都指向堆栈VMA。由于ASLR,它们略有不同。在内核中处理系统调用期间,尝试扩展相关的 VMA -expand_stack
函数。最终结果是,我的进程的堆栈地址与我正在写入的进程的 VMA 之间的偏移量大于进程堆栈限制,因此-EFAULT
.
- 如何读取特定地址的进程内存?
- Valgrind 大小为 8 且地址 0x5b7e520 的读取无效,在大小为 16 的块内为 0 字节 free'd
- 从二进制流中读取时,将双精度变量的地址转换为 char* 意味着什么?
- 面临分段故障 使用 ffmpeg 读取视频时,因为"pFormatCtx-> streams [i]-> codecpar"的地址0x00
- 如何运行外部程序,向其传递内存地址以读取/写入?
- 读取 MAC 地址时文件读取异常
- C++ - 使用代码块从文件中读取 IP 地址
- 使用来自 C 的内存地址的 Julia 读取/写入结构数据
- C++/CPP 读取添加的十六进制地址
- exc_bad_access(代码= 1,地址= 0x68)在第二个读取方法中
- C++如何使用读取进程内存查找进程内存中使用的最后一个(偏移量 - 地址)
- 读取字符 * 始终具有相同的地址
- 使用 ReadProcessMemory 从进程读取相对于基址的地址
- 从蓝牙地址读取 3 个字节
- EXCEPTION_ACCESS_VIOLATION(从地址 0xffffffffffffffff 读取)
- process_vm_writev无法写入我能够读取的同一地址
- C++无法读取内存地址
- 将二进制文件读取到向量元素的地址中
- 特定地址块中的I²C EEPROM读取错误
- 从进程读取地址