我有这个习惯,总是编译一个 C++ 项目并建立发布。我总是用十六进制编辑器(通常是 HxD)打开 .EXE 并查看二进制信息。
我最讨厌并试图找到解决方案的是,在字符串表的某个地方,提供了相关的(至少从我的角度来看)信息。也许对其他人来说,这听起来像是对精神分裂症的痴迷,但我只是不喜欢我的可执行文件包含例如应用程序中使用的所有 Windows 函数的名称。
我尝试了许多编译器,看看它们中哪个发布的信息最少。例如,GCC 将所有这些都留在其生成的所有最终 exe 中
libgcj_s.dll._Jv_RegisterClasses....\Data.ald.rb.Error.Data file is corrupt!
....Data for the application not found!.€.@.ř.@.0.@.€.@.°.@.p.@.p.@.p.@.p.@.
¸.@.$.@.€.@°.@.std::bad_alloc..__gnu_cxx::__concurrence_lock_error.__gnu_cxx
::__concurrence_unlock_error...std::exception.std::bad_exception...pure virt
ual method called..../../runtime/pseudo-reloc.c....VirtualQuery (addr, &b, s
ize of(b))............................/../../../gcc-4.4.1/libgcc/../gcc/conf
ig/i386/cygming-shared-data.c...0 && "Couldn't retrieve name of GCClib share
d data atom"....ret->size == sizeof(__cygming_shared) && "GCClib shared data
size mismatch".0 && "Couldn't add GCClib shared data atom".....-GCCLIBCYGMI
NG-EH-TDM1-SJLJ-GTHR-MINGW32........
在这里,您可以看到我使用的编译器以及版本。现在,您可以在下面几行看到我使用的每个 Windows 函数的列表,例如 CreateMainWindow、GetCurrentThreadId 等。
我想知道是否有办法不显示这个,或者加密,混淆它。
使用 Visual C++ 时,不会发布此信息。相反,它不像 GCC 那样跨平台,即使在像 7 和 XP 这样的两个 Windows 系统之间,也不需要 C++ 运行时、框架或任何用 VC++ 编译的程序。此外,VC++ 可执行文件还包含应用程序中使用的 Windows 函数的那些过程入口点。
我知道即使是 NASM,例如,也会保存被调用的 Windows 函数的名称,所以看起来这是一个 Windows 问题。但也许它们可以被加密,或者有一些技巧可以不显示它们。
我将查看 GCC 源代码,以查看指定要保存在可执行文件中的那些字符串在哪里——也许可以跳过该指令或其他什么。
好吧,这是我最后的妄想症之一,也许可以通过某种方式加以治疗。感谢您的意见和回答。