为什么使用 Snowman 反编译 C++ 会产生一些完整的变量名和一些混淆的变量名?

逆向工程 部件 反编译 C++ 恶意软件
2021-06-18 14:19:37

我使用 Snowman 反编译了一个 C++ exe 文件,希望看看它是否是恶意软件(虽然,老实说,我不知道如何继续 - 文件真的很大,而且反编译大多是胡言乱语)

这导致了相当大的代码块,其中大部分显然不再有适当的变量名称;相反,变量和函数要么像它们所属的汇编寄存器一样命名,要么用一些十六进制名称,或者用一些看起来不像十六进制的数字/字符组合。

然而,部分代码不知何故仍然有专有名称,尽管它们似乎都是系统函数:DrawRect、RegCreateKeyExA、DefWindowProcA、SHBrowseForFolderA 等等——大量的调用似乎与系统交互。

这是否意味着反编译保留了 Windows 系统调用,而不是文件开发人员创建的函数/变量的名称?如果是这样,接下来我应该怎么做才能看到该文件是否具有恶意意图?

值得一提的是,我正在查看的文件是 Nullsoft 安装程序 - 因此,从技术上讲,很多反编译代码只是开销,当我实际上想查看它安装的内容而不是安装程序本身时。

1个回答

通常,编译过程会删除实际执行不需要的大部分信息。这通常包括:

  • 评论
  • 局部和全局变量名
  • 本地(对程序)函数名
  • 任何被视为死亡的代码(在任何情况下都不会执行)
  • 表现出未定义行为的代码

您观察到的名称是Windows API名称;因为它们是由名称引用的,所以必须保留这些信息才能使二进制文件成功运行。通常会删除所有其他名称。

注意:API 名称也可以通过数字序数导入,在这种情况下可以删除名称;然而,这在 Win32 上并不常见,因为序数往往会随着版本的不同而变化(它Win16 上的通用名称)。