相信看过Andrew那本很经典的《计算机网络》都会记得第N章(N是多少我忘记了……)里面提到的在一幅图像里面隐藏了一本《莎士比亚》全集的数据。
这种代码在网上已经是很常见的了,不过最近因为研究着拆游戏的cg立绘之类的东西就学习了一下BMP图像的格式就想到一个不同隐藏方法。
网上的代码大多都是利用每个像素里面颜色后面几位来存储要隐藏的数据,这样的话在颜色比较单一的情况下对图像的影响是十分明显的。而我的代码中是将24位的图像转换为32位图像后在alpha通道的位置写入数据。
在24位位图中,每个像素用三个字节存储,而32位位图则是4个字节,除了RGB通道外,还有多出来的一个字节是alpha通道。alpha通道是用来存储透明度的信息的,例如有两幅图片,一幅是风景另外一幅是一间房子,房子上有个玻璃窗。按照常理来说,当两幅图像重叠的时候可以透过玻璃看到外面的景物的,而ALPHA混合就是用来实现这个功能。Alpha混合根据图像的alpha通道的值来计算两幅图像重叠后那一点的色彩值。所以修改这个值在位图上是看不出改变的。
还有一点要注意的是位图文件里面每一行像素数据的字节数一定要是4的倍数,所以在位图中每隔位图宽*3个字节数会有几个0字节是用来填充的,所以转换的时候要跳过这几个字节。
而位图文件头和信息头的修改可以直接参考MSDN相关说明。
程序和源码见附件。很久没用ASM写程序,用来练一下手,代码写得有点难看orz
这种代码在网上已经是很常见的了,不过最近因为研究着拆游戏的cg立绘之类的东西就学习了一下BMP图像的格式就想到一个不同隐藏方法。
网上的代码大多都是利用每个像素里面颜色后面几位来存储要隐藏的数据,这样的话在颜色比较单一的情况下对图像的影响是十分明显的。而我的代码中是将24位的图像转换为32位图像后在alpha通道的位置写入数据。
在24位位图中,每个像素用三个字节存储,而32位位图则是4个字节,除了RGB通道外,还有多出来的一个字节是alpha通道。alpha通道是用来存储透明度的信息的,例如有两幅图片,一幅是风景另外一幅是一间房子,房子上有个玻璃窗。按照常理来说,当两幅图像重叠的时候可以透过玻璃看到外面的景物的,而ALPHA混合就是用来实现这个功能。Alpha混合根据图像的alpha通道的值来计算两幅图像重叠后那一点的色彩值。所以修改这个值在位图上是看不出改变的。
还有一点要注意的是位图文件里面每一行像素数据的字节数一定要是4的倍数,所以在位图中每隔位图宽*3个字节数会有几个0字节是用来填充的,所以转换的时候要跳过这几个字节。
而位图文件头和信息头的修改可以直接参考MSDN相关说明。
程序和源码见附件。很久没用ASM写程序,用来练一下手,代码写得有点难看orz