【问题标题】:When std::cout is called what external API is used? (Windows)调用 std::cout 时使用什么外部 API? (视窗)
【发布时间】:2011-04-11 15:09:02
【问题描述】:

这是一个逆向工程问题。

在使用 Microsoft Visual C++ 2008 编译的二进制文件的 Windows 7 上,当调用 std::cout 时。在内部,使用什么 API 来写入数据? WriteFile、fwrite、ConsoleOut?我的目标是在没有可用源或调试符号的 std::cout 上设置断点。

【问题讨论】:

  • 您可能想尝试将std::cout 重定向到std::stringstream。这非常适合调试。查看this question 了解如何操作。
  • @Space_C0wb0y 有问题的二进制文件是机器码。此时没有 std::cout 或 std::stringstream 这样的东西。这是一个黑客/逆向问题。
  • 只需使用调试器走一遍输出单个字符的过程。应该非常翔实。编辑:当然,在测试程序上使用调试器来了解底层过程。

标签: c++ reverse-engineering


【解决方案1】:

我相信它最终会使用 WriteFile。如果你编译一个简单的hello world:

#include <iostream>
int main(int argc, char **argv)
{
  std::cout << "Hello" << std::endl;
  return (0);
}

...然后做dumpbin /imports hello.exe,你会得到一个它使用的外部函数列表,你会发现它同时导入了WriteFileWriteConsoleW,但是如果没有记错的话,只使用后者用于打印一些标准库错误消息,而不是用于标准输出。

【讨论】:

  • 哇,这太可怕了。看起来好像一次写出一个字节!
  • @MSalters 没有。但是我确实发现 WriteFile 被调用了。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-11-15
  • 2017-08-20
  • 1970-01-01
  • 1970-01-01
  • 2015-11-27
相关资源
最近更新 更多