2009-12-12 62 views
2

我需要寫入正在執行的可執行文件,但是我無法打開它進行寫入。例如:ETXTBSY以及如何覆蓋它

#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; 
} 
 
% uname -rs 
FreeBSD 8.0-STABLE 
% ./example_ETXTBSY 
Text file busy 

some explanations到底是什麼ETXTBSY在Linux中,但儘管如此,是否有可能重寫這個錯誤?

P.S.
我不想寫病毒。

回答

5

如果您試圖替換正在執行的文件,而不是即時修改可執行文件,則可以先取消鏈接(),然後再打開它進行寫入。

#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()。

(編輯補充模式位)。

+0

我需要動態修改可執行文件:在它的結束物理更換/添加/刪除一些字節。 – 2009-12-12 13:00:44

+0

然後你需要使用ptrace() – 2009-12-12 13:01:12

+0

不,他也可以使用'unlink'方法 - 他只需要打開現有的可執行文件以便首先閱讀,這樣他就可以將內容複製到新文件中,然後再編寫改變它。 – caf 2009-12-12 23:56:12