4

我需要写入一个正在执行的可执行文件,但我无法打开它进行写入。例如:

#include <stdio.h>
#include <fcntl.h>

int main(int argc, char **argv)
{
    int fd = open(argv[0], O_RDWR);
    if (fd == -1) perror(NULL);
    return 0;
}
% unname -rs
FreeBSD 8.0-稳定版
% ./example_ETTXTBSY
文本文件忙

一些解释在 Linux 中 ETXTBSY 到底是什么,但是,是否有可能覆盖这个错误?

PS
我不是想写病毒。

4

1 回答 1

9

如果您尝试替换正在执行的文件,而不是即时修改可执行文件,您可以先 unlink() 它,然后打开它进行写入。

#include <stdio.h>
#include <fcntl.h>
#include <sys/stat.h>

int main(int argc, char **argv)
{
    unlink(argv[0]);
    int fd = open(argv[0], O_RDWR|O_CREAT, S_IRWXU|S_IRWXG|S_IRWXO);
        if (fd == -1) perror(NULL);
            return 0;
}

如果您试图访问实际运行的进程,最好的选择是 ptrace()。

(编辑添加模式位。)

于 2009-12-12T12:42:08.660 回答