把文件数据写入到图片像素中
来源:互联网 发布:网络教育文凭含金量 编辑:程序博客网 时间:2024/05/20 15:39
做这个东西,是因为看到了乌云网友写的一篇文章 (http://drops.wooyun.org/tips/14568)。
文章提供了一个数据传输的思路。在一台不能连网的虚拟机中运行软件,虚拟机只提供包含软件运行时的截图的分析报告。也就是说虚拟机的数据能通过图片显示出来,于是把虚拟机的文件写入到图片像素中,从而得到虚拟机的数据。
看到这文章时感到好惊艳,以前压根就没想过数据能以rgb三个颜色通道写三个字节的形式写到图片中。好像开启一片天地一样惊奇,实在增长见识。于是就想用php写一个这样的程序:能把文件数据写到图片中,也能从图片中还原文件。
程序和图片如下。先读取rar的数据然后进行base64加密,然后再逐个字符转为十进制,一个像素由rgb三个颜色通道组成,可以写三个字符 。一个1.83M的rar压缩文件写成的图片有2.12M大,如下图。不过数据越大生成的图片越大,数据处理起来也比较慢。
由此联想到数据都是0和1组成的,也就是说只要能体现两种不同状态的事物都可以做为传输介质,联想到之前看到新闻,说有黑客通过电脑发热盗取电脑数据,这也很好理解了。然后又联想到量子传输,好像也是这个原理的。
/** * 从图片中按象素读数据 * @param type $file */function getDataFromPic( $file ) { $image = imagecreatefrompng( $file ); $aY = imagesy( $image ); $aX = imagesx( $image ); $aData = array(); $str = ''; for ( $x = 0; $x < $aX; $x++ ) { for ( $y = 0; $y < $aY; $y++ ) { $aRgb = imagecolorsforindex( $image, imagecolorat( $image, $x, $y ) ); $str .= chr( $aRgb['red'] );//十进制数据转为字符 $str .= chr( $aRgb['green'] ); $str .= chr( $aRgb['blue'] ); } } $data = base64_decode( $str ); return $data;}/** * 把数据写到图片像素中 * @param max $binData 数据 * @param string $picfile 生成图片路径 */function createpic( $binData, $picfile ) { $a = base64_encode( $binData ); $len = strlen( $a ); $w = $h = ceil( sqrt( ceil( $len/3 ) ) );//图片长宽 $im = imagecreatetruecolor( $w, $h ); $x = $y = 0; $aData = array(); for ( $i = 0; $i < $len; $i++ ) { $s = ord( $a{$i} );//转为十进制数据 $aData[] = $s; if ( count( $aData ) == 3 ) { $red = $aData ? $aData[0] : 255; $green = $aData ? $aData[1] : 255; $blue = $aData ? $aData[2] : 255; $col = imagecolorallocate( $im, $red, $green, $blue ); imagesetpixel( $im, $x, $y, $col ); $y++; if( $y >= $w ){ $y=0; $x++; } $aData = array(); } }//header( 'Content-type: image/png' ); imagepng( $im, $picfile ); imagedestroy( $im );}$file = './1.rar';$file2 = './2.rar';set_time_limit(0);$binData = file_get_contents( $file );//$binData = '123456789';createpic( $binData, './2.png' );$data = getDataFromPic( './2.png' );//echo $data;file_put_contents($file2, $data);exit;
0 0
- 把文件数据写入到图片像素中
- 通过POI组件把数据写入到Excel文件中
- object-c把数据写入到文件中
- object-c把数据写入到文件中
- <归档> object-c把数据写入到文件中
- 把一个bmp图片写入文件中
- 把数据库文件写入csv文件和从csv文件中导入数据到数据库中
- Java把double数据写入文件中
- Java把double数据写入文件中
- .NET中把数据写入到Text中
- java 把一个文件写入到另一个文件中
- 写入数据到MP3文件中
- 视频中直线像素采样(cvInitLineIterator )把每个像素点的三个值写入csv文件中
- spintf函数把格式化的数据写入到字符串中
- 用Python把EXCEL中的数据写入到MySQL中
- Java 实现把异常信息写入到文件中
- C++ 把输出结果写入到文件中
- C++ 把输出结果写入到文件中
- uvalive5848
- 自定义View-2-重写onMeasure
- 电子商务大赛
- python学习笔记三:解析html(HTMLParser、SGMLParser),并抓取图片
- Java1.8之ConcurrentHashMap源码
- 把文件数据写入到图片像素中
- logger日志记录的一个小技巧
- MFC改变自定义鼠标图标的大小
- 移动web js触屏事件 按下 松开 滑动讲解
- Linux内核数据结构 kfifo
- ACM第二次练习—1008
- gitlab的用户使用手册
- 关于ActionContext.getContext()
- codeforces429B working out(dp)