我刚刚在过去几天中看到了这一点,无法弄清楚它是如何工作的。我谈论的视频在这里:
这是这个堆栈溢出问题的最高评价的答案:为什么该程序被三个编译器拒绝?
该位图如何显示“ Hello World”的C ++程序?
我刚刚在过去几天中看到了这一点,无法弄清楚它是如何工作的。我谈论的视频在这里:
这是这个堆栈溢出问题的最高评价的答案:为什么该程序被三个编译器拒绝?
该位图如何显示“ Hello World”的C ++程序?
Answers:
BMP(DIB)图像由标头和未压缩的1色数据组成(对于24 bpp图像,每个像素3字节,以反向行顺序存储,行距为4字节)。
颜色数据的字节用于表示颜色(即文件格式2都不要求它们,它们都来自每个像素的颜色),并且像素颜色和写入的字节之间存在1:1的完美对应关系在文件中; 因此,使用完美选择的颜色,您实际上可以在文件中写入所需的任何内容(标头除外)。
在记事本中打开生成的文件时,颜色数据将显示为文本;否则,颜色数据将显示为文本。您仍然可以清楚地从标题(从BM
文本到开头的部分)中看到文件格式所规定的内容。
在我看来,该视频是通过以下方式完成的:首先,作者计算了位图所需的大小,并创建了一个正确大小的DIB文件,其中填充了可扩展为简单模式的颜色(例如,所有字节65 => 'A'
);然后将其替换为“有效载荷”代码,如视频所示。
但是请注意,用记事本手工制作整个产品并非没有可能-借助颜色选择器对话框,ASCII表和DIB格式的基本知识就可以完成,但这会慢得多并且容易出错。
从理论上的计算机科学的角度来看,有趣的是,是否可以以这样一种方式编写每个程序,使得以位图的形式查看时,实际上您看到的源代码可以执行相同的操作。如果您对这样的结果非常感兴趣,请阅读有关Kleene不动点定理的信息。
图像编程也可以看作是代码混淆的一种形式。并不是说它特别实用...