【问题标题】:(Edited) MSVC++ Shortcut to define array in stack frame(已编辑)在堆栈帧中定义数组的 MSVC++ 快捷方式
【发布时间】:2021-10-14 03:32:08
【问题描述】:

是否有使用宏定义字符堆栈数组的快捷方式(例如 MACRO/模板)?

我需要一个 char by char 定义来强制 MS 编译器将数组就地构造到堆栈帧中。这对于 shellcoding 目的是必需的,避免手动逐个字符写入每个字符串。

例如使用宏

#define MACRO(arr, s) ...

int main()
{
    MACRO(arr, thisisasuperlongstring);
}

获得

int main()
{
    char arr[] = {'t','h','i','s','i','s','a','s','u','p','e','r','l','o','n','g','s','t','r','i','n','g',0};
}

【问题讨论】:

  • 简单地定义一个数组可能有效,但我认为您不能指定编译器应如何以标准方式在内部表达字符串。 gcc.godbolt.org/z/316cqTar6
  • 这会实现char arr[] = "thisisasuperlongstring"; 不会实现的什么?
  • 你这样做:char arr[] = "thisisasuperlongstring"; 没有宏。
  • @wmi: "我想避免将字符串留在 .rdata 部分" 它仍将作为字符数组存在于您的可执行文件中。如果你想隐藏一些文本,这并不是特别有效。
  • 无论您使用= "..." 还是= {...} 初始化数组,编译器都会以相同的方式处理它。

标签: c++ visual-c++ c++14


【解决方案1】:

是的,有可能:

#define STRINGIFY_HELPER(A) #A
#define STRINGIFY(A) STRINGIFY_HELPER(A)

#define MAGIC_MACRO(arr, content) char arr[] = STRINGIFY(content)

https://godbolt.org/z/MvoEa77KG

但应尽可能避免(如果您希望获得更好的答案,请提供更多上下文)。

【讨论】:

  • 谢谢,但这种方法等同于char arr[]="thisisasuperlongstring";。我想将数组就地定义到堆栈中,编写与位置无关的代码。
  • 这与char arr[] = {'t','h','i','s','i','s','a','s','u','p','e','r','l','o','n','g','s','t','r','i','n','g',0}; 的结果完全相同,那么您的意思是什么?
  • 如果您尝试使用 Microsoft cl 进行编译,第一个赋值会将一个字符串放入 .rdata 部分,而第二个赋值将填充数组放在堆栈 arr[0]arr[n-1] 上。我的意思是找到一条捷径,而不是手动逐个写字符
  • @interjay 或许你可以参考一下这个
  • @wmi 请编辑您的问题(或创建新问题)并专注于您的实际问题,而不是如何解决您的解决方案。请记住将此变量放在某个上下文(函数、全局范围)中,因为这会对优化器的工作产生很大影响。请注意,差异并不重要:godbolt.org/z/xro6qrWzP
猜你喜欢
  • 1970-01-01
  • 2016-07-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-03-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多