debug在信息隐藏中简单的应用.docx
《debug在信息隐藏中简单的应用.docx》由会员分享,可在线阅读,更多相关《debug在信息隐藏中简单的应用.docx(13页珍藏版)》请在冰豆网上搜索。
![debug在信息隐藏中简单的应用.docx](https://file1.bdocx.com/fileroot1/2023-2/6/2b73370b-710a-4fe1-afae-533a6bab8b35/2b73370b-710a-4fe1-afae-533a6bab8b351.gif)
debug在信息隐藏中简单的应用
MicrosoftPC操作系统工具Debug在信息隐藏中的应用
目录
1、debug和位图文件的基础
1.1debug简单介绍....................................................................3
1.2位图文件格式简单介绍.........................................................3
2、使用debug编写信息隐藏算法以及提取算法
2.1隐藏隐藏算法.........................................................................8
2.2提取算法.................................................................................9
2.3生成程序文件........................................................................11
3、总结
3.1总结........................................................................................11
一debug和位图文件基础
1.1debug简单介绍
这里说的debug是windows从dos时代就带有的一个工具。
它是一个16位的调试器,同时也是一个简单的汇编器,和16进制编辑器。
虽然很小巧但是功能强大。
这里用它和bmp格式文件来进行简单的信息隐藏。
关于debug的指令这里就不详解了,用到时会说明用法的。
使用debug的信息隐藏缺点是编程复杂,对个人的汇编编程能力要求极高。
造成上述缺点的原因是在debug中写算法使用的是汇编语言,汇编语言对于算法的表达由于个人汇编编程能力而具有一定的局限性。
优点是在windows甚至是dos下随时随地都可以做,即使没有安装任何的编程软件,因为debug是windows自带的
1.2位图文件格式简单介绍
这里只说明带有调色板的这种bmp文件格式。
位图文件包含如下部分:
位图文件头
位图信息头
色彩表(又称调色板)
图像数据阵列字节
位图文件头:
开头的两个字节是用来标示位图(表明这个文件是一个位图)一般情况下位“BM”,下面用debug载入位图文件验证一下:
左图是源图像文件,第一行指令是将文件路径导入debug,第二行加载文件到默认地址(100)处,第三行查看100处的值右边对应的是ascii。
可以看到前连个字母位”BM“。
接下来的一些字节是位图文件的各种参数:
文件的大小标志位,图像数据偏移。
位图的文件头共占有文件的前十四个字节。
信息头:
这里的数据主要是和位图的像素参数色彩参数相关的,这里就不一一的列出了。
这部分共占有40个字节
调色板:
256色位图的调色板共有256中颜色,这个是显而易见的,调色板就像一个数组数组每个元素的大小位4byte,设置调色板的目的是为了对位文件进行一定的压缩,有的图像需要的颜色种类可能不要那么多,而如果每中颜色用一个字节的话,每个像素有三基色组成颜色就要用三个字节。
带有调色板的位图文件中的图像数据,只要使用对应的位图文件在调色板中对应颜色的索引号,每个像素只要一个字节即可。
调色板的组成结构位(蓝,绿,红,ALpha),每一种颜色占有一个字节。
调色板的数据在文件中依次排开。
256种颜色一共用去256*4=1024=1k个字节。
图像数据阵列(这里是用于显示的图像数据):
正如前边所说,带有调色板位的文件的图像数据种类每个像素占有一个字节,反之则每个占有四个字节。
位图图像的格式就简单的介绍完了。
为了验证上述的格式,我用16位的汇编编写了一个简单的位图文件显示软件,这个软件可以在dos和xp(vista和win7子系统对于视频16位中断支持不好,容易产生蓝屏死机现象)下显示128*128位的256色的文件
源代码如下:
这里没有使用文图文件的调色板,使用的是系统默认的调色板。
;作者:
仲崇阳
;版权所有,如有引用,请联系cutaLk@gmaiL.com
datasegment;huoquwenjiandaxiao;文件长度放在dx:
ax
Lujindb"d:
\a.bmp"
shujudb10dup(0)
tishidb"PLEASEENTERTHEPATH",0DH,0AH,'$'
LUJINJINDB100DUP(0)
dataends
bmpsegment
buffdb64000dup(0)
shjdb10dup(0)
bmpends
codesegment
assumecs:
code,ds:
data
start:
movax,data
movds,ax
LEADX,TISHI
MOVAH,09
INT21H
;;;;;;;;;;;;BELLOWENTERTHEPATH;;;
MOVBX,0
SHURU:
MOVAH,1
INT21H
CMPAL,0DH
JESHURUEND
MOVLUJINJIN[BX],AL
INCBX
JMPSHURU
SHURUEND:
;;;;;;;;;;;;ABOVEENTERTHEPATH;;;
;;;;;;;;;;;;0A0D;;;;
MOVDL,0AH
MOVAH,2
INT21H
MOVDL,0DH
MOVAH,2
INT21H
;;;;;;;;;;;;0A0D;;;;
movdx,offsetLujin
movax,3d00h
int21h
movbx,ax
movcx,0
movdx,0
movax,4202h
int21h
pushax
;xianshihuancuntianhcong
movsi,0
xianshi:
movdx,0
movbx,10
divbx
pushax
adddL,48
movshuju[si],dL
incsi
popax
cmpax,0
jaxianshi
;
;xianshi
decsi
Looper:
movdL,shuju[si]
movah,2
int21h
decsi
cmpsi,-1
jneLooper
;;;;;;;;;;;;;;;;;;;;;;;;;;;;
Leadx,Lujin
movah,3dh
movaL,02h
xorcx,cx
int21h
movbx,ax
popax
movcx,ax
pushax
movax,bmp
movES,ax
MOVDS,AX
Leadx,buff
movah,3fh
movaL,0h
int21h
;;;;;;;;;;;;0A0D;;;;
MOVDL,0AH
MOVAH,2
INT21H
MOVDL,0DH
MOVAH,2
INT21H
;;;;;;;;;;;;0A0D;;;;
;;;;;;;;;BELLOWREADINGX,Y;;;;;;;;
MOVAX,BMP
MOVDS,AX
MOVAL,ES:
BUFF[12H]
MOVDL,AL
MOVAH,2
INT21H
;;;;;;;;;ABOVEREADINGX,Y;;;;;;;;
movah,1
int21h
movah,4ch
int21h
codeends
endstart
这个代码就不做解释了,两年前写的,注释使用的是汉语拼音加英语,很容易看懂的代码编译后可以运行的,主要原理是读取图像像素阵列数据然后使用dos中断查找调色板,然后显示。
运行截图如下:
在dos全屏模式下不能使用截图软件,只能拍照
由上面的位图的图像格式可以知道对于空域中能隐藏信息的地方主要在图像阵列数据曲的每个字节最底几位,和调色版中的ALpha位。
下面用debug将信息隐藏在位图文件中,源文件使用的是第一页的128*128的256色的位图文件。
首先使用windows运行如下指令:
cmd——>debug。
然后使用debug的n指令和L指令将文件载入到内存,如下图。
其中指令r是查看寄存器的值,其中寄存器cx保存载入文件的16进制大小(由图可知g.bmp大小为4436h,十进制为17462,在资源管理器下查看文件大小如图)
2、使用debug编写信息隐藏算法以及提取算法
2.1隐藏隐藏算法
由位图文件格式可知带有256色调色板的位图的调色板开始于文件偏移54(16进制为36h)处,这里对调色板进行最底有效位的信息隐藏是因为带调色板的位图图像像素阵列数据不是颜色数据而是调色板的一个索引,要是对其进行改变则不能预测颜色变化,即使索引号改变1调板中对于的颜色也有可能由白变黑,这样就起不到隐藏作用了。
下面将字符“a”隐藏在图像中的算法以及详细的deubg操作。
首先将文件载入到debug中,然后使用a指令输入隐藏算法的汇编代码,输入完成后使用指令g=46004603执行,然后用p指令单步执行完Loop汇编指令,执行到movah,ah(这几行代码是标志代码,目的单步时不至于执行到代码之外)后,执行完所有代码后使用nd:
\gg.bmp,rcx4436,w100指令图像数据写入gg.bmp文件,这个文件就是隐藏了字符“a”的文件.
如图
下面通过c指令来比较这两个文件
首先用前面的方法,将g.bmp文件加载到地址100h处,将gg.bmp文件加载到5000处,然后使用指令c100,1405000(解释:
c内存是比较指令100为第一块要比较内存的起始地址,140为结束地址5000为下一块内存的起始地址地址,因为刚才的汇编代码只对136h到13dh数据改变,所以使用100到140,这样做既包含了136h到13dh而且输入起来要方便,没什么特殊原因)
如图:
根据指令执行结果可以得到二进制1100001b,十六进制为61h表示为字符既是“a”。
2.2提取算法
使用nd:
\gg.bmp和L100指令将隐藏了数据的gg.bmp文件加载到地址为100h处
然后使用a5000指令输入提取算法,通过g=50005003和p指令执行完代码,然后使用
nd:
\src.txt和rcx1,w100指令将提取出来的数据写入到src.txt中,打开src.txt可以看见字符“a”。
算法以及指令执行截图:
如上图可以看到p指令执行int21h中断后输出完我们隐藏的数据“a”,在算法中将提取出来的信息写入地址位100h处,如图:
然后将提取出来的信息写入SRC.TXT文件,如图
打开SRC.TXT如图:
2.3生成程序文件
使用debug可以生成数据隐藏和数据提取程序的,使用指令nd:
\,rcxrbx和w5000来生成数据隐藏程序,数据提取程序的生成和这个类似nd:
\,rcxrbx和w5000。
(其中rcx执行后填写最后一条汇编指令偏移地址减去5000,rbx执行后填写0).但是生成的程序不可以直接使用的,做隐藏使用时先将128*128256色的位图加载至100h处,然后将程序加载到5000h处,使g=50005003,单步执行完即可,做提取使用时和这个类似,此时加载的图像应为隐藏过信息的载体图像。
这里就不截图了。
三、总结
使用debug这个工具来做信息隐藏的想法是无意间想到的,当时不知道16位的debug程序能不能胜任这项任务,于是就试着写指令和代码,在最后遇到一个小问题,就是当我把提取出来的数据写入src.txt文件的时候,出现了错误,我的原指令如下:
-nd:
\src.txt
-rcx
-:
1
-w100
但是显示的为
Writing6100001bytes
这明显是不对的,本意是将地址100h处的字符“a“写入到文件,但是实际写入6兆的字符,经过反复试验发现w指令是将bx乘以ffff加上cx所得到的数字,按照这个数字来写文件。
Debug是个很强大的工具,如果不怕麻烦的话,可以用它写出复杂的算法。
本文只是简单的介绍了最低有效位隐藏算法。
时间有限,只隐藏了一个字符的数据。
隐藏更多的数据也是可以的,但那样会增加错误率,浪费不必要的时间。
至于debug的应用只是个人爱好而已,当然可以使用matlab但是相比较而言debug小巧精湛,而且从dos到Windows都自带debug。