代码之家  ›  专栏  ›  技术社区  ›  romaric crailox

在main()之外访问进程的参数

  •  2
  • romaric crailox  · 技术社区  · 6 年前

    是否有可能在内部以外的其他地方访问进程的参数 main 功能?

    我的处境是无法添加代码 主要的

    2 回复  |  直到 6 年前
        1
  •  4
  •   rici    6 年前

    没有可移植的方法来访问 argv 除了在进入时保存 main() ,这在问题的条件下是不可能的。

    #include <stdint.h>
    /* This code is unsafe and unportable. But it might work for you. */
    char** getargv(void) {
      extern char** environ;
      char **argv = environ - 1;
      for (char** e = argv; (uintptr_t)(argv[-1]) != e - argv; --argv) { }
      return argv;
    }
    

    这些代码来自于对创建的堆栈进行反向工程 here . 它假设 environ setenv putenv 在调用此函数之前(不过,这些非常罕见。)作为参考,堆栈的相关部分如下所示(所有条目都是指针大小):

    argc
    argv[0]
    ...
    argv[argc - 1]
    0
    environ[0]
    ...
    0
    

    阿格夫 argc . 它可能会被一个看起来像整数的地址所愚弄,但在Linux中这是极不可能的,因为用于argv字符串的地址永远不会小到足以与一个小整数混淆。


    上面的代码是作为一个函数编写的,但是在这个问题的上下文中,这可能是不可能的。显然,它可以被复制到其他函数中,所以这不是问题。

    但是,如果能够将函数和全局函数插入到可执行文件中,则可以使用GCC/Clang来利用构造函数的常规(但不是通用)实现 constructor 函数属性。任何此类功能都是在 主()

    char** saved_argv;
    int saved_argc; 
    void saveargv(int argc, char** argv) __attribute__((constructor)) {
      saved_argc = argc;
      saved_argv = argv;
    }
    
        2
  •  0
  •   siz    6 年前

    您可以回溯堆栈并转到main(如果可以找到的话),在那里获得arg值,然后更改它们

        3
  •  0
  •   Emmanuel DUMAS    4 年前

    其他解决方案仅适用于linux,请使用/proc/NNN/cmdline。

    int pid;
    char procPathName[256];
    int fcl;
    
    pid = getpid();
    snprintf(procPathName, 255, "/proc/%ld/cmdline", pid);
    fcl = open(procPathName, 0);
    if (fcl == -1)
    {
      /* error */
    }
    else
    {
      char buffer[1024];
      int bufferLen;
      bufferLen = read(fcl, buffer, 1023);
      close(fcl);
    }