跑了 13 种编程语言的 Hello World,可视化后有了新发现
- 介绍
- x64 汇编(MASM)
- C(GCC 4.8.3)
- C++(MSVC14.29.30133,Visual Studio 社区版2019)
- Ada(GNATStudio 社区 2021 [20210423])
- Rust(1.56.1)
- Delphi(EmbarcaderoDelphi 10.4 社区版)
- Golang (go1.17.3windows/amd64) [失败]
- AutoIt(v3,用 Aut2exe 打包成了一个 EXE)
- Java(OpenJDK RuntimeEnvironment(build 17.0.1+12-39),用JRE直接执行)
- C#(.NET 5,自包含的可执行文件)
- Javascript(Node.jswindows-x64-17.1.0,用 nexe打包)
- Python(CPython3.10, 由 PyInstaller 打包)
- Ruby(ruby3.0.2p107, 由解释器直接执行)
- 总结
x64汇编(MASM)
原始指令总数(包括 windows 库) 指令总数:220,029 基本块总数:49,627 比较基准如下: 没有特别之处,只有 11 个指令和几个 API 调用。C(GCC 4.8.3)
原始指令总数(包括 windows 库) 指令总数:662,569 基本块总数:151,304 编译器给汇编指令填充了初始化栈的代码和和 C 运行时库。共计 536 个节点,执行了 1100 条指令。C++(MSVC14.29.30133,Visual Studio 社区版2019)
原始指令总数(包括 windows 库) 指令总数:2,413,122 基本块总数:568,565 总共 520 个节点,执行了 511 条指令。 由于 API 使用量的增加,VC++ 输出执行的指令数量更多。实际执行的代码要少于GCC的C语言输出结果。Ada(GNATStudio 社区 2021 [20210423])
原始指令总数(包括 windows 库) 指令总数:2,034,262 基本块总数:465,783 一般来说,恶意软件作者不太喜欢使用这种语言。只是我个人比较好奇这个庞大的委员会设计的语言究竟如何。 总共 3700 个节点,执行了 55.24K 条指令。 在标准的设置代码下面是一长串小循环。Rust(1.56.1)
原始指令总数(包括 windows 库) 指令总数:4,326,506 基本块总数:984,090 上述绝大多数指令都在 Windows 库的调用中,Rust 的输出非常简单。 总共 1946 个节点,执行了 2.37K 条指令。Delphi(EmbarcaderoDelphi 10.4 社区版)
原始指令总数(包括 windows 库) 指令总数:5,293,646 基本块总数:1,191,836 Delphi的设置代码担负起了一些实际的工作。总共2013 个节点,执行 56.5K 条指令。Golang(go1.17.3 windows/amd64) [失败]
原始指令总数(包括 windows 库) 指令总数:? (> 5,956,506) 基本块总数:? (> 1,308,592) Go的二进制文件逆向工程非常难,这个HelloWorld也不例外——在设置结束之前Pin就崩溃了。 尝试执行初始指令统计,结果如下:Exception 0xc0000005 0x0 0xc000053d00 0xc000053d00
PC=0xc000053d00
runtime: unknown pc 0xc000053d00
stack: frame={sp:0xc000053bd0, fp:0x0}stack=[0xc000052000,0xc000054000)
0x000000c000053ad0: 0x0000000000000000 0x0000000000000000
0x000000c000053ae0: 0x0000000000000000 0x0000000000000000
0x000000c000053af0: 0x0000000000000000 0x0000000000000000
0x000000c000053b00: 0x0000000000000000 0x0000000000000000
0x000000c000053b10: 0x0000000000000000 0x0000000000000000
0x000000c000053b20: 0x0000000000000000 0x0000000000000000