查看: 296|回复: 0

[易语言] 隐写源码分享-把任意文件转换为位图

[复制链接]
发表于 2019-5-12 22:02:58 | 显示全部楼层 |阅读模式
本程序可以把任意文件藏到图片里,可以是exe,可以是图片,也可以是源码!
129295cd8262af2a76.png
这张图片是win7 system32目录下 ntdll.dll 这个文件,把它写成位图保存在指定目录
370635cd82566ddfc0.png
转完后谁都看不懂这是什么图片.....适合隐写,一个像素点占用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))

如果自己想用,拿到源码需要修改的地方:
429435cd823f46f38e.png 源码如下:
隐藏图片易语言源码.zip (82.7 KB, 下载次数: 0)
温馨提示:
1.如果您喜欢这篇帖子,请给作者点赞评分,点赞会增加帖子的热度,评分会给作者加学币。(评分不会扣掉您的积分,系统每天都会重置您的评分额度)。
2.回复帖子不仅是对作者的最好奖励,还可以获得学币奖励,请尊重作者的劳动成果,拒绝做伸手党!
3.发广告、灌水回复等违规行为一经发现直接禁言,如果本帖内容涉嫌违规,请点击论坛底部的举报反馈按钮,也可以在【投诉建议】板块发帖举报。
善莫大焉-2019
关闭

论坛公告上一条 /2 下一条

快速回复 返回顶部 返回列表