反汇编技术在代码测试中的应用
上一篇 / 下一篇 2012-05-22 09:06:58 / 个人分类:杂谈
随着计算机技术的不断发展和应用领域的不断扩大,人们对计算机软件的安全性的要求越来越高。而作为保证软件质量最有效的测试技术,已经越来越受到人们的重视。反汇编技术可以帮助软件测试人员更轻松的理解二进制代码的行为,从而测试软件的正确性和可靠性。51Testing软件测试网w%q;Y0w)]$w&kL
51Testing软件测试网1\FlpORYq文中主要讨论了反汇编技术,及其在二进制代码分析和测试中的作用。通过反汇编技术,可以在不改变代码含义的前提下,把难懂的二进制代码转化为更清晰易懂的汇编代码。可以帮助测试人员理解目标代码,提高测试效率。51Testing软件测试网h2l8L%iS4Y!it1g
%b%iJ5MuJ7C?'eu0 反汇编技术简介51Testing软件测试网0\5vf@3Z%t z
51Testing软件测试网SM[7C4x1p$z反汇编:把目标代码转为汇编代码的过程,也可说是把机器语言转为汇编语言代码,低级转高级的意思,常用于软件破解。51Testing软件测试网7t:f;|x'foF Ii+L
51Testing软件测试网(I1B.Bm$tRm6W A从对目标代码的执行角度来看,反汇编分为静态反汇编和动态反汇编,前者是指将二进制目标文件根据对应的指令系统转换为相应的可读的汇编语句,但是并不执 行这段程序;后者主要是指要跟踪执行目标文件,具体反映出程序的运行情况。静态反汇编的优点之一是能够一次对整个文件进行处理,而动态反汇编只能处理程序 中被执行到的部分;另一个优点是静态反汇编的时间与文件的长度成正比,而动态反汇编的时间与被执行的指令数成正比。通常认为前者的时间比后者少,静态反汇 编的效率更高。
]e4c M3s051Testing软件测试网,lpA^T本文主要探讨静态反汇编在软件测试中的使用。
t!n4y JE0|/TN$Q~0 二进制代码简介
|%G i4f;@:DA,n/w07AD$X]2fpJ7\N0 由于输入的目标代码是hex文件,所以,我们重点讨论hex文件的格式。51Testing软件测试网2GjG"Y:rLm
s&S$hml V.]0 Intel HEX文件是记录文本行的ASCII文本文件,在Intel HEX文件中,每一行是一个HEX记录,由十六进制数组成的机器码或者数据常量,Intel HEX文件经常被用于将程序或数据传输存储到ROM.EPROM,大多数编程器和模拟器使用Intel HEX文件。
!b$z,fq^DN/{G+@051Testing软件测试网g1R4D#~Z(A一个Intel HEX文件可以包含任意多的十六进制记录,每条记录有五个域,下面是一个记录的格式.[10]
H}9Mw+c cw08hdf'NY0 :llaaaatt[dd...]cc
h2c*I`:svB6Lr0Ar["k9[!J4Se8j0 每一组字母是独立的一域,每一个字母是一个十六进制数字,每一域至少由两个十六进制数字组成,下面是字节的描述。51Testing软件测试网!H_}3^ @
51Testing软件测试网Pugb'GC NL:冒号是每一条Intel HEX记录的开始
SC.P;V-]%\!vil`051Testing软件测试网8E biP"}y,og!j Yll是这条记录的长度域,他表示数据(dd)的字节数目。
#q6P'|D#o:|jxA _0;h4Nvagy.Ec0z0 aaaa是地址域,他表示数据的起始地址51Testing软件测试网+Oh7f)h.`
51Testing软件测试网@n-T p1L$h<如果是数据记录,这表示将要烧录的这条记录中的数据在EPROM中的偏移地址,对于不支持扩展段地址和扩展线性地址的,如89C51,这就是此条记录的起始地址>51Testing软件测试网&[f'[X;w^m!{T
51Testing软件测试网 NHLH~tt这个域表示这条HEX记录的类型,他有可能是下面这几种类型
g0W^"@ t~'^j/rq0M{S[a AaW[0 00 ----数据记录
f"V5W"t6R B|0 01 ----文件结束记录
4?"t%N-?BvG m0 02 ----扩展段地址记录
~&Y:lt)f.K5J0 04 ----扩展线性地址记录51Testing软件测试网!e)v loN)A
X
dd是数据域,表示一个字节的数据,一个记录可能有多个数据字节,字节数目可以查看ll域的说明
.m*tA1T(Mo+q-g07?3a"~1rl*Ph0 cc是效验和域,表示记录的效验和,计算方法是将本条记录冒号开始的所有字母对51Testing软件测试网x odPu(D:p.D
^)X#z[&Dh0 <不包括本效验字和冒号>所表示的十六进制数字
t9A ]S6ILkIm0m*DU/Es0 <一对字母表示一个十六进制数,这样的一个十六进制数为一个字节>