c++ - 从 Windows 可执行版本中隐藏或删除不需要的字符串

标签 c++ string reference executable

我有这个习惯,总是编译 C++ 项目并构建版本。我总是使用十六进制编辑器(通常是 HxD)打开 .EXE 并查看二进制信息。

我最讨厌并试图找到解决方案的事实是,在字符串表中的某个位置,提供了相关的(至少从我的角度来看)信息。也许对于其他人来说,这听起来像是一种精神 split 症的困扰,但我只是不喜欢我的可执行文件包含应用程序中使用的所有 Windows 函数的名称。

我尝试了很多编译器,看看哪个编译器发布的信息最少。例如,GCC 将所有这些保留在其生成的最终 exe 中

libgcj_s.dll._Jv_RegisterClasses....\Data.ald.rb.Error.Data file is corrupt!
....Data for the application not found!.€.@.ř<a href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="8ea0cea0be" rel="noreferrer noopener nofollow">[email protected]</a>.@.€.@.°<a href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="a789e789d7" rel="noreferrer noopener nofollow">[email protected]</a><a href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="032d432d73" rel="noreferrer noopener nofollow">[email protected]</a><a href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="e6c8a6c896" rel="noreferrer noopener nofollow">[email protected]</a><a href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="d0fe90fea0" rel="noreferrer noopener nofollow">[email protected]</a>.@.
¸.@.$.@.€.@°<a href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="2f016f015c5b4b" rel="noreferrer noopener nofollow">[email protected]</a>::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 源代码,看看指定要保存在可执行文件中的那些字符串在哪里 - 也许可以跳过该指令或其他内容。

嗯,这是我最后的偏执之一,也许可以通过某种方式来治疗。感谢您的意见和解答。

最佳答案

如果你使用 -nostdlib 编译,那么 GCC 的东西应该消失,但你也会失去一些 C++ 支持和 std::*。

在 Windows 上,您可以创建一个仅链接到 LoadLibraryGetProcAddress 的应用程序,并且在运行时它可以获得您需要的其余函数(函数的名称)可以以加密形式存储,并且在将字符串传递给 GetProcAddress 之前解密该字符串)这样做需要大量工作,并且 Windows 加载程序可能比您的代码更快,因此对我来说混淆事实似乎毫无意义您正在调用简单的函数,例如 GetLastErrorCreateWindow

关于c++ - 从 Windows 可执行版本中隐藏或删除不需要的字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11199665/

相关文章:

c++ - 如何在 C++ 中创建一个位于堆而不是堆栈的数组?

php - 遇到(警告 : Illegal string offset) while creating a configuration sytem for a site

Java : Assume object reference or make copy

javascript - 将文本字符串转换为 JSON 格式 - Javascript

c# - 在类中重现 "SQL Tables"

c# - 从表中获取值作为引用

c++ - 除了概念之外,C++20 中还有其他 void_t 替代品吗?

c++ - Microsoft Visual Studio 2013 C++ --- 按任意键继续换行?

c++ - std::partition 分隔小于 pivot 的元素的问题

c++ - 从字符串中删除所有字符