【问题标题】:Writing to command line arguments写入命令行参数
【发布时间】:2018-04-18 13:25:57
【问题描述】:

覆盖调用GetCommandLine 函数返回的命令行字符串是否安全(不会导致未定义的行为)?

*(GetCommandLineW() + 1) = L'x'; // should be fine, right?

我不确定是否将返回的字符串视为字符串文字,因为相应内存页面的分配保护属性似乎有所不同。

MEMORY_BASIC_INFORMATION mbiMemPage;

VirtualQuery(GetCommandLineW(), &mbiMemPage,
             sizeof(MEMORY_BASIC_INFORMATION)); // mbiMemPage.Protect = PAGE_READWRITE

VirtualQuery(L"some string", &mbiMemPage,
             sizeof(MEMORY_BASIC_INFORMATION)); // mbiMemPage.Protect = PAGE_EXECUTE_READ

【问题讨论】:

  • 该文档没有理由让您相信可以安全地对其进行修改。你想解决什么问题?
  • 没有任何建议需要修改内容。几乎可以肯定,您找到了错误的解决方案。
  • @DavidHeffernan 返回类型不是const,可想而知MS想要允许unix风格的“状态更新”。
  • 那你为什么不打电话给CommandLineToArgvW呢?或者使用由 CRT 的启动代码预先填充的 __wargv 全局变量。

标签: c winapi command-line


【解决方案1】:

GetCommandLineW 返回一个指向存储在 PEB 中的字符串的指针,但这是一个实现细节。在每个已发布的 Windows NT 版本上修改字符串是安全的,但这并不意味着它将永远保持这种状态。但是,返回类型是 LPTSTR 而不是 LPCTSTR,所以我发现它将来不太可能存储在只读页面中。

如果您想冒险,这完全取决于您。请记住,您不能超过初始字符串长度,并且有人可以将您的应用程序重命名为“x.exe”并将其简单地作为“x”运行,而您只能使用两个字符。

如果您只想解析和提取参数,可以使用CommandLineToArgvW

【讨论】:

    猜你喜欢
    • 2018-10-14
    • 1970-01-01
    • 1970-01-01
    • 2016-02-24
    • 2014-02-19
    • 2012-07-09
    • 2016-03-25
    • 1970-01-01
    • 2014-03-29
    相关资源
    最近更新 更多