2

所以我有这个在C运行时更改进程名称的任务,我偶然发现了这个:http ://www.uofr.net/~greg/processname.html

现在首先,我知道改变 argv[0] 的危险(但是关于 Linux 和 UNIX 的东西还有很长的路要走)所以请不要讲它,我只是想知道为什么它不是在 Ubuntu 上工作。

这是我使用的测试源:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

void main(int argc, char *argv[]) {

    int argv0size = strlen(argv[0]);
    int onetwothree = 1;
    char* abc = (char *) malloc(sizeof(char) * (17 + 1));
    sprintf(abc,"ApplicationName%.3d",onetwothree); 
    strncpy(argv[0], abc ,argv0size);     
    getchar(); 
}

我只在 Mac OS X 和 Ubuntu 上对其进行了测试,并且它在 Mac OS X 上运行。我不知道为什么它在 Ubuntu 上不起作用。它不起作用的可能原因是什么?

我使用 gcc 作为编译器。

4

2 回答 2

3

所以我有这个在C运行时更改进程名称的任务,我偶然发现了这个: http ://www.uofr.net/~greg/processname.html

我建议您使用的参考不是由操作系统或 C 专家编写的。也许它适用于某些操作系统,但它不需要在 C 中以这种方式工作。

现在首先,我知道改变 argv[0] 的危险(但是关于 Linux 和 UNIX 的东西还有很长的路要走)所以请不要讲它,我只是想知道为什么它不是在 Ubuntu 上工作。

正如 WhozCraig 在他的评论中所说,您当然可以修改 argv 数组以及它指向的数组。这并不意味着 Ubuntu 需要在其进程列表中使用该修改。

我只在 Mac OS X 和 Ubuntu 上对其进行了测试,并且它在 Mac OS X 上运行。我不知道为什么它在 Ubuntu 上不起作用。它不起作用的可能原因是什么?

如果您正在寻找理由,请考虑滥用的可能性。如果在进程列表中使用了您自己的副本argv[0],诸如 kaiten 之类的木马将能够像以前一样伪造其进程名称,从而使它们更难以检测和删除。

于 2013-04-03T04:03:11.017 回答
2

不幸的是,在 C 中不能保证 argv[0] 实际上是进程名称。在 Unix/Linux 中,它可以是父进程选择使用的任意值(参见 'execv/execve')。这意味着它不一定映射到进程名称,尽管它可能基于实现。

对于 Ubuntu(可能还有 MacOS?),以下内容应该更通用:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#ifdef __linux__
#include <sys/prctl.h>
#endif

void main(int argc, char *argv[]) {

  int argv0size = strlen(argv[0]);
  int onetwothree = 1;
  char* abc = (char *) malloc(sizeof(char) * (17 + 1));
  sprintf(abc,"ApplicationName%.3d",argv0size); 
  #ifdef __linux__
    prctl(PR_SET_NAME, abc, 0, 0, 0);
  #else
    strncpy(argv[0], abc ,argv0size);     
  #endif
  getchar(); 
}

编辑:删除了实际的应用程序名称。
EDIT_2: prctl 在 OS X 上不可用

于 2013-04-03T04:17:42.927 回答