c++ - basic_string 分配器

标签 c++ reverse-engineering

我想知道这是做什么的:

std::basic_string<char, std::char_traits<char>, std::allocator<char>>::
basic_string<char, std::char_traits<char>, std::allocator<char>>
(&myText, "hello world");

我的第一个猜测是它将“hello world”分配给 myText 变量 如果这是真的那么在这种情况下它会做什么:

  if ( v106 == v67 || 
  std::basic_string<char, std::char_traits<char>, std::allocator<char>>::
  basic_string<char, std::char_traits<char>, std::allocator<char>>
  (&v109,"program"), v137 = 1)
  {
    BYTE3(v95) = 0;
  }

这并不是一个真正的条件...

最佳答案

我猜这是 IDA 的 Hex-Ray 反编译器插件的输出,对吗?这是它显示std::string的构造函数的调用的方式。类(class)。 v109是在堆栈上分配的用于保存 std::string 的内存实例,而第二个参数 "hello world" , 是用于初始化它的字符串。

如果多个条件导致相同的结果代码,编译器通常会选择重用前一个条件中的(等效)代码片段,以最小化生成的字节码的大小。 Hex-Ray 的反编译器插件通常使用 Comma-operator 显示它们最高版本 1.5 - 较新版本的反编译器有 a better understanding of such situations .

if (v106 == v67)
    BYTE3(v95) = 0;

std::basic_string<char, std::char_traits<char>,
                  std::allocator<char>>
                  ::basic_string<char, 
                      std::char_traits<char>, 
                      std::allocator<char>>(&v109,"program");
v137 = 1;
BYTE3(v95) = 0;

这更有可能看起来像实际来源。更换巨大的std::basic_string<...>使用简单的 std::string 构建声明使其更具可读性。

if (v106 == v67)
    BYTE3(v95) = 0;

std::string v109("program");
v137 = 1;
BYTE3(v95) = 0;

关于c++ - basic_string 分配器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12623580/

相关文章:

c++ - C++ 中的 GUID 默认值

c++ - Object b(); 有什么区别?和对象 b;?

c++ - boost::spirit::x3 中的简单字符串解析器不起作用

javascript - 值、原型(prototype)和属性的区别

php - 了解大型 php 代码,使用什么技术?

javascript - 这些 javascript 混淆器如何生成实际的工作代码?

c++ - 如何避免必须编写样板访问器代码

c++ - 使用集合计算素数,C++

c++ - 防止反向工程 C++ 二进制文件

java - 如何使用检测打印 Java 运行时调用的所有方法?