本程序可以把任意文件藏到图片里,可以是exe,可以是图片,也可以是源码!
这张图片是win7 system32目录下 ntdll.dll 这个文件,把它写成位图保存在指定目录
转完后谁都看不懂这是什么图片.....适合隐写,一个像素点占用4个字节,把数据写入这个像素点,图片的大小就看你数据的大小了
如果不懂位图的格式和相应算法,可以百度一下如何创建位图以及位图的数据结构。
数据转图片算法如下:
.版本 2
.子程序 数据转图片, 字节集, 公开, 内含压缩操作,如果运行目录下有zlib.dll这个文件的话,会调用压缩功能,没有的话不压缩
.参数 数据, 字节集
.参数 附加数据, 字节集, 可空, 额外的数据加入到图片中
.局部变量 dwSize, 整数型, , , 位图文件大小,包含数据和文件头,信息头
.局部变量 dwBitsSize, 整数型, , , 位图数据大小,不包含头信息
.局部变量 nWidth, 整数型, , , 位图宽度
.局部变量 nHeight, 整数型, , , 位图高度
.局部变量 hMem, 整数型, , , 内存句柄
.局部变量 pMem, 整数型, , , 内存句柄的首地址
.局部变量 ret, 字节集, , , 把位图句柄转成位图文件后保存到这里
.局部变量 BitCount, 整数型, , , 位图色深
.局部变量 nPlanes, 整数型, , , 图像面数
.局部变量 bin, 字节集
.局部变量 dwLen, 整数型
.如果真 (取字节集长度 (数据) = 0)
返回 ({ })
.如果真结束
bin = 到字节集 (取字节集长度 (附加数据)) + 附加数据 + 到字节集 (取字节集长度 (数据)) + 数据
bin = 压缩 (bin)
dwBitsSize = 取字节集长度 (bin)
nWidth = 到整数 (求平方根 (dwBitsSize × 8 ÷ 32)) + 1 ' 计算宽度
nHeight = nWidth
nPlanes = 1 ' bmPlanes
BitCount = 32 ' bmBitsPixel
dwLen = nWidth × nHeight × BitCount ÷ 8 ' 位图数据大小
bin = bin + 取空白字节集 (dwLen - dwBitsSize)
dwBitsSize = 取字节集长度 (bin)
dwSize = dwBitsSize + 14 + 40 ' 位图文件大小=头文件大小+头信息大小+位图数据大小
hMem = GlobalAlloc (#GHND, dwSize) ' 申请一块内存存放图片数据
pMem = GlobalLock (hMem) ' 锁定内存,返回这个内存句柄的内存起始地址
' 这里用了指针的方式写入,易语言的数据类型是个坑,短整数也占用4字节
' pMem 这个内存地址是存放位图转成文件的所有数据
' 把一个位图句柄转成文件需要以下步骤
' 1.设置位图头文件,占用14个字节 是 BITMAPFILEHEADER 这个结构
' 2.设置位图信息头,占用40个字节 是 BITMAPINFOHEADER 这个结构
' 3.设置调色板,16位 24位 32位不需要调色板
' 4.图像数据
' ------------写入位图头文件
' ----下面这几步是写入 BITMAPFILEHEADER 位图文件头
__set_short (pMem, 0, 19778) ' bfType BM,bmp文件头标志
__set (pMem, 2, dwSize) ' bfSize 生成的bmp文件大小
__set_short (pMem, 6, 0) ' bfReserved1,bfReserved2 设为0,两个占用4字节,等于一个整数
__set_short (pMem, 8, 0) ' bfReserved1,bfReserved2 设为0,两个占用4字节,等于一个整数
__set (pMem, 10, 54) ' bfOffBits 图像数据偏移
' --------------写入位图信息头
' ----下面几步是写入位图信息头 BITMAPINFOHEADER
pMem = pMem + 14 ' 前面14个字节是文件头,+14让他指向到信息头位置
__set (pMem, 0, 40) ' biSize
__set (pMem, 4, nWidth) ' biWidth
__set (pMem, 8, nHeight) ' biHeight
__set_short (pMem, 12, nPlanes) ' biPlanes
__set_short (pMem, 14, BitCount) ' biBitCount
__set (pMem, 16, 0) ' biCompression
__set (pMem, 20, 0) ' biSizeImage
__set (pMem, 24, 0) ' biXPelsPerMeter
__set (pMem, 28, 0) ' biYPelsPerMeter
__set (pMem, 32, 0) ' biClrUsed
__set (pMem, 36, 0) ' biClrImportant
RtlMoveMemory (pMem + 40, 取指针_字节集型 (bin), dwBitsSize)
' 取出的结果存放到 pMem+40 这个位置,这时整个图片已经设置完成,取出整个数据就是BMP图片文件
' 因为前面已经+14了,所以这里偏移只需要偏移信息头的大小
' 倒数第二个参数就是上面设置的 BITMAPINFOHEADER 整个结构
ret = 指针到字节集 (pMem - 14, dwSize)
GlobalUnlock (hMem)
GlobalFree (hMem)
返回 (ret)
图片转数据算法如下
.版本 2
.子程序 图片转数据, 字节集, 公开, 内含解压操作,如果运行目录下有zlib.dll这个文件的话,会调用解压功能,没有的话不解压,如果转换时压缩,这里不解压,会获取失败
.参数 图片数据, 字节集, , 学逆向论坛xuenixiang.com
.参数 附加数据, 字节集, 参考 可空, 转图片时添加的附加数据
.局部变量 bin, 字节集
.局部变量 pAddr, 整数型
.局部变量 dwSize, 整数型
.局部变量 offset, 整数型
.局部变量 dwLen, 整数型
.如果真 (取字节集长度 (图片数据) = 0)
返回 ({ })
.如果真结束
bin = 图片数据
pAddr = 取指针_字节集型 (bin)
dwSize = __get (pAddr, 2) ' 位图数据大小
offset = __get (pAddr, 10) ' 位图数据偏移
bin = 指针到字节集 (pAddr + offset, dwSize)
bin = 解压 (bin)
pAddr = 取指针_字节集型 (bin)
dwLen = __get (pAddr, 0) ' 附加数据长度
.如果真 (取反 (是否为空 (附加数据)))
附加数据 = 指针到字节集 (pAddr + 4, dwLen)
.如果真结束
pAddr = pAddr + dwLen + 4 ' 指向图片长度这里
dwLen = __get (pAddr, 0) ' 在取出打包的数据长度
返回 (指针到字节集 (pAddr + 4, dwLen))
如果自己想用,拿到源码需要修改的地方:
源码如下:
隐藏图片易语言源码.zip
(82.7 KB, 下载次数: 3)
|