2

我有这个习惯,总是编译一个 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 源代码,以查看指定要保存在可执行文件中的那些字符串在哪里——也许可以跳过该指令或其他什么。

好吧,这是我最后的妄想症之一,也许可以通过某种方式加以治疗。感谢您的意见和回答。

4

2 回答 2

2

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

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

于 2012-06-26T01:57:49.690 回答
1

Windows API 函数从 dll 加载,例如 kernel32.dll。为了获取加载的 API 函数的内存地址,从 dll 中搜索导出的函数名称表。因此这些名字的存在。

您可以手动加载您使用 LoadLibrary 引用的任何 Windows API 函数。您可以使用 GetProcAddress 查找函数的地址,以及以某种模糊形式存储的函数名称。或者,您可以使用每个函数的“序数”——一个标识 dll 中每个函数的数值)。这样,您可以创建一组用于调用 API 函数的函数指针。

但是,要真正使其干净,您可能必须关闭默认库的链接并替换编译器隐式使用的 C 运行时库的组件。不过,这样做很麻烦。

于 2012-06-26T01:58:39.287 回答