I don't think process_vm_writev can write to read-only memory, which executable memory is under modern operating systems. Doing that requires ptrace, which long predates Linux. According to the Linux man page, it is "CONFORMING TO: SVr4, 4.3BSD".
Re:On self-modifying executables in Rust
by woodruffw on Friday January 28, 2022 @10:40PM
(#30123552)
The ptrace APIs also can’t write to read only memory, at least not on modern Linux running on CPUs with modern MMUs. But SMC doesn’t require that, because you can always map (or remap) executable pages as writable.
Executable code is only read-only by default, you can always change that (or just not do it, in the case of a JIT).
> The ptrace APIs also can’t write to read only memory
Sure they can.
https://stackoverflow.com/questions/49442087/how-does-ptrace...
This isn’t strictly true: Linux, for example, provides `process_vm_writev`, which can be used to dynamically poke the executable text at runtime. The Linux kernel itself even has a decent amount of SMC, although it doesn’t use that mechanism.
The `totally_safe_transmute` party trick[1] from last year uses a similar technique. Technically it’s on data and not code, but the effect is the same.
[1]: https://blog.yossarian.net/2021/03/16/totally_safe_transmute...