我跑了这个:
cat /usr/bin/* |
perl -ne 'map {$a{$_}++} split//; END{print map { "$a{$_}\t$_\n" } keys %a}' |
grep --text . | sort -n | plotpipe --log y {1}
并得到这个:
(即使使用对数 y 轴,它看起来仍然是指数的!顶部和底部之间的距离超过 100 倍)
看一下数字:
:
31919597 ^H
32983719 ^B
33943030 ^O
39130281 \213
39893389 $
52237360 \211
53229196 ^A
76884442 \377
100776756 H
746405320 ^@
^@ (NUL) 是可执行文件中最常见的字节,这并不奇怪。\377 (255) 和 ^A (1) 对我来说也具有直观意义。
但是,是什么导致“H”(72)成为可执行文件中第二常见的字节——比 255 和 1 更常见呢?
(如果此答案得分为72分,请勿点赞!)
这将是amd64 机器代码指令的64 位操作数大小前缀。
您会注意到它只发生在 amd64 可执行文件上。
如果您 比较
/bin/*
http://ftp.debian.org/debian/pool/main/c/coreutils/coreutils_9.1-1_arm64.deb,http://ftp.debian.org/debian/pool/main/ _ c/coreutils/coreutils_9.1-1_amd64.deb和 http://ftp.debian.org/debian/pool/main/c/coreutils/coreutils_9.1-1_i386.deb,你会看到:0x48(72,'H')仅位于 amd64 上的前 3 名中。
ls
在我的 amd64 Debian 系统上:如果我们反汇编该可执行文件中的代码,我们会在指令中发现大量 0x48 字节:
其中大多数都处于第一位置:
根据http://ref.x86asm.net/geek.html#x48,0x48 是64 位操作数大小
REX.W
操作码前缀,它指定要在 64 位操作数上进行操作,而不是默认值。所有指令均在 64 位操作数上完成。