简短的回答:是的
长答案:
如果您查看二进制文件,您可以找到已链接的库的名称。在 TextPad 中打开 cmd.exe 很容易在十六进制偏移量 0x270 处找到以下内容:msvcrt.dll、KERNEL32.dll、NTDLL.DLL、USER32。 dll 等 msvcrt 是 Microsoft 'C' 运行时支持函数。KERNEL32、NTDLL 和 USER32.dll 是特定于操作系统的库,它们可以告诉您目标平台或构建它的平台,具体取决于跨平台开发环境将两者隔离的程度。
撇开这些线索不谈,大多数 c/c++ 编译器都必须将函数的名称插入到二进制文件中,所有函数(或入口点)的列表都存储在表中。C++ 'mangles' 函数名称以对参数及其类型进行编码以支持重载方法。可以混淆函数名称,但它们仍然存在。函数签名将包括可用于跟踪系统或程序中使用的内部调用的参数的数量和类型。在偏移量 0x4190 处是“SetThreadUILanguage”,可以搜索它以了解有关开发环境的很多信息。我在偏移量 0x1ED8A 处找到了入口点表。我可以很容易地看到 printf、exit 和 scanf 等名称;连同 __p__fmode、__p__commode 和 __initenv
x86 处理器的任何可执行文件都会有一个数据段,其中包含程序中包含的任何静态文本。回到 cmd.exe(偏移量 0x42C8)是文本“Software.Policies.Microsoft.Windows.System”。该字符串占用的字符数是通常所需的两倍,因为它是使用双宽字符存储的,可能是为了国际化。错误代码或消息是这里的主要来源。
在偏移量 B1B0 处是“pushd”,后跟 mkdir、rmdir、chdir、md、rd 和 cd;为了便于阅读,我省略了不可打印的字符。这些都是 cmd.exe 的命令参数。
对于其他程序,我有时能够找到编译程序的路径。
所以,是的,可以从二进制文件中确定源语言。