当前位置:文档之家› OllyDBG 2.01软件调试入门教程

OllyDBG 2.01软件调试入门教程

OllyDBG 2.01软件调试入门教程
OllyDBG 2.01软件调试入门教程

OllyDBG2.01 入门系列(一)-认识OllyDBG

一、OllyDBG的安装与配置

OllyDBG1.10版的发布版本是个ZIP压缩包,只要解压到一个目录下,运行OllyDBG.exe就可以了。汉化版的发布版本是个RAR压缩包,同样只需解压到一个目录下运行OllyDBG.exe即可:

OllyDBG中各个窗口的功能如上图。简单解释一下各个窗口的功能,更详细的内容可以参考TT小组翻译的中文帮助:

反汇编窗口:显示被调试程序的反汇编代码,标题栏上的地址、HEX数据、反汇编、注释可以通过在窗口中右击出现的菜单界面选项->隐藏标题或显示标题来进行切换是否显示。用鼠标左键点击注释标签可以切换注释显示的方式。

寄存器窗口:显示当前所选线程的CPU寄存器内容。同样点击标签寄存器(FPU)可以切换显示寄存器的方式。

信息窗口:显示反汇编窗口中选中的第一个命令的参数及一些跳转目标地址、字串等。

数据窗口:显示内存或文件的内容。右键菜单可用于切换显示方式。

堆栈窗口:显示当前线程的堆栈。

要调整上面各个窗口的大小的话,只需左键按住边框拖动,等调整好了,重新启动一下OllyDBG就可以生效了。

启动后我们要把插件及UDD的目录配置为绝对路径,点击菜单上的选项->界面,将会出来一个界面选项的对话框,我们点击其中的目录标签:

因为我这里是把OllyDBG解压在F:\OllyDBG目录下,所以相应的UDD目录及插件目录按图上配置。还有一个常用到的标签就是上图后面那个字体,在这里你可以更改OllyDBG中显示的字体。上图中其它的选项可以保留为默认,若有需要也可以自己修改。修改完以后点击确定,弹出一个对话框,说我们更改了插件路径,要重新启动OllyDBG。在这个对话框上点确定,重新启动一下OllyDBG,我们再到界面选项中看一下,会发现我们原先设置好的路径都已保存了。有人可能知道插件的作用,但对那个UDD目录不清楚。我这简单解释一下:这个UDD目录的作用是保存你调试的工作。比如你调试一个软件,设置了断点,添加了注释,一次没做完,这时OllyDBG就会把你所做的工作保存到这个UDD目录,以便你下次调试时可以继续以前的工作。如果不设置这个UDD目录,OllyDBG默认是在其安装目录下保存这些后缀名为udd的文件,时间长了就会显的很乱,所以还是建议专门设置一个目录来保存这些文件。

另外一个重要的选项就是调试选项,可通过菜单选项->调试设置来配置:

新手一般不需更改这里的选项,默认已配置好,可以直接使用。建议在对OllyDBG已比较熟的情况下再来进行配置。上面那个异常标签中的选项经常会在脱壳中用到,建议在有一定调试基础后学脱壳时再配置这里。

除了直接启动OllyDBG来调试外,我们还可以把OllyDBG添加到资源管理器右键菜单,这样我们就可以直接在.exe及.dll文件上点右键选择“用Ollydbg打开”菜单来进行调试。要把OllyDBG添加到资源管理器右键菜单,只需点菜单选项->添加到浏览器,将会出现一个对话框,先点击“添加Ollydbg到系统资源管理器菜单”,再点击“完成”按钮即可。要从右键菜单中删除也很简单,还是这个对话框,点击“从系统资源管理器菜单删除Ollydbg”,再点击“完成”就行了。

OllyDBG支持插件功能,插件的安装也很简单,只要把下载的插件(一般是个DLL文件)复制到OllyDBG安装目录下的PLUGIN目录中就可以了,OllyDBG启动时会自动识别。要注意的是OllyDBG1.10对插件的个数有限制,最多不能超过32个,否则会出错。建议插件不要添加的太多。

到这里基本配置就完成了,OllyDBG把所有配置都放在安装目录下的ollydbg.ini文件中。

二、基本调试方法

OllyDBG有三种方式来载入程序进行调试,一种是点击菜单文件->打开(快捷键是F3)来打开一个可执行文件进行调试,另一种是点击菜单文件->附加来附加到一个已运行的进程上进行调试。注意这里要附加的程序必须已运行。第三种就是用右键菜单来载入程序(不知这种算不算)。一般情况下我们选第一种方式。比如我们选择一个test.exe来调试,通过菜单文件->打开来载入这个程序,OllyDBG中显示的内容将会是这样:

调试中我们经常要用到的快捷键有这些:

F2:设置断点,只要在光标定位的位置(上图中灰色条)按F2键即可,再按一次F2键则会删除断点。(相当于SoftICE中的F9)

F8:单步步过。每按一次这个键执行一条反汇编窗口中的一条指令,遇到CALL等子程序不进入其代码。(相当于SoftICE中的F10)

F7:单步步入。功能同单步步过(F8)类似,区别是遇到CALL等子程序时会进入其中,进入后首先会停留在子程序的第一条指令上。(相当于SoftICE中的F8)

F4:运行到选定位置。作用就是直接运行到光标所在位置处暂停。(相当于SoftICE中的F7)

F9:运行。按下这个键如果没有设置相应断点的话,被调试的程序将直接开始运行。(相当于SoftICE中的F5)

CTR+F9:执行到返回。此命令在执行到一个ret(返回指令)指令时暂停,常用于从系统领空返回到我们调试的程序领空。(相当于SoftICE中的F12)

ALT+F9:执行到用户代码。可用于从系统领空快速返回到我们调试的程序领空。(相当于SoftICE中的F11)

上面提到的几个快捷键对于一般的调试基本上已够用了。要开始调试只需设置好断点,找到你感兴趣的代码段再按F8或F7键来一条条分析指令功能就可以了。就写到这了,改天有空再接着灌。

OllyDBG 入门系列(二)-字串参考

上一篇是使用入门,现在我们开始正式进入破解。今天的目标程序是看雪兄《加密与解密》第一版附带光盘中的https://www.doczj.com/doc/4112666276.html,镜像打包中的CFF Crackme#3,采用用户名/序列号保护方式。原版加了个UPX的壳。刚开始学破解先不涉及壳的问题,我们主要是熟悉用OllyDBG来破解的一般方法。我这里把壳脱掉来分析,附件是脱壳后的文件,直接就可以拿来用。先说一下一般软件破解的流程:拿到一个软件先别接着马上用OllyDBG调试,先运行一下,有帮助文档的最好先看一下帮助,熟悉一下软件的使用方法,再看看注册的方式。如果是序列号方式可以先输个假的来试一下,看看有什么反应,也给我们破解留下一些有用的线索。如果没有输入注册码的地方,要考虑一下是不是读取注册表或Key文件(一般称keyfile,就是程序读取一个文件中的内容来判断是否注册),这些可以用其它工具来辅助分析。如果这些都不是,原程序只是一个功能不全的试用版,那要注册为正式版本就要自己来写代码完善了。有点跑题了,呵呵。获得程序的一些基本信息后,还要用查壳的工具来查一下程序是否加了壳,若没壳的话看看程序是什么编译器编的,如VC、Delphi、VB等。这样的查壳工具有PEiD和FI。有壳的话我们要尽量脱了壳后再来用OllyDBG调试,特殊情况下也可带壳调试。下面进入正题:

我们先来运行一下这个crackme(用PEiD检测显示是Delphi编的),界面如图:

这个crackme已经把用户名和注册码都输好了,省得我们动手^_^。我们在那个“Register now!”按钮上点击一下,

将会跳出一个对话框:

好了,今天我们就从这个错误对话框中显示的“Wrong Serial,try again!”来入手。启动OllyDBG,选择菜单文件->打开载入CrackMe3.exe文件,我们会停在这里:

我们在反汇编窗口中右击,出来一个菜单,我们在查找->所有参考文本字串上左键点击:

当然如果用上面那个超级字串参考+插件会更方便。但我们的目标是熟悉OllyDBG的一些操作,我就尽量使用OllyDBG自带的功能,少用插件。好了,现在出来另一个对话框,我们在这个对话框里右击,选择“查找文本”菜单项,输入“Wrong Serial,try again!”的开头单词“Wrong”(注意这里查找内容要区分大小写)来查找,找到一处:

在我们找到的字串上右击,再在出来的菜单上点击“反汇编窗口中跟随”,我们来到这里:

见上图,为了看看是否还有其他的参考,可以通过选择右键菜单查找参考->立即数,会出来一个对话框:

分别双击上面标出的两个地址,我们会来到对应的位置:

00440F79|.BA8C104400MOV EDX,CrackMe3.0044108C;ASCII"Wrong Serial,try again!"

00440F7E|.A1442C4400MOV EAX,DWORD PTR DS:[442C44]

00440F83|.8B00MOV EAX,DWORD PTR DS:[EAX]

00440F85|.E8DEC0FFFF CALL CrackMe3.0043D068

00440F8A|.EB18JMP SHORT CrackMe3.00440FA4

00440F8C|>6A00PUSH0

00440F8E|.B980104400MOV ECX,CrackMe3.00441080;ASCII"Beggar off!"

00440F93|.BA8C104400MOV EDX,CrackMe3.0044108C;ASCII"Wrong Serial,try again!" 00440F98|.A1442C4400MOV EAX,DWORD PTR DS:[442C44]

00440F9D|.8B00MOV EAX,DWORD PTR DS:[EAX]

00440F9F|.E8C4C0FFFF CALL CrackMe3.0043D068

我们在反汇编窗口中向上滚动一下再看看:

00440F2C|.8B45FC MOV EAX,DWORD PTR SS:[EBP-4]

00440F2F|.BA14104400MOV EDX,CrackMe3.00441014;ASCII"Registered User"

00440F34|.E8F32BFCFF CALL CrackMe3.00403B2C;关键,要用F7跟进去

00440F39|.7551JNZ SHORT CrackMe3.00440F8C;这里跳走就完蛋

00440F3B|.8D55FC LEA EDX,DWORD PTR SS:[EBP-4]

00440F3E|.8B83C8020000MOV EAX,DWORD PTR DS:[EBX+2C8]

00440F44|.E8D7FEFDFF CALL CrackMe3.00420E20

00440F49|.8B45FC MOV EAX,DWORD PTR SS:[EBP-4]

00440F4C|.BA2C104400MOV EDX,CrackMe3.0044102C;ASCII"GFX-754-IER-954"

00440F51|.E8D62BFCFF CALL CrackMe3.00403B2C;关键,要用F7跟进去

00440F56|.751A JNZ SHORT CrackMe3.00440F72;这里跳走就完蛋

00440F58|.6A00PUSH0

00440F5A|.B93C104400MOV ECX,CrackMe3.0044103C;ASCII"CrackMe cracked successfull y"

00440F5F|.BA5C104400MOV EDX,CrackMe3.0044105C;ASCII"Congrats!You cracked this CrackMe!"

00440F64|.A1442C4400MOV EAX,DWORD PTR DS:[442C44]

00440F69|.8B00MOV EAX,DWORD PTR DS:[EAX]

00440F6B|.E8F8C0FFFF CALL CrackMe3.0043D068

00440F70|.EB32JMP SHORT CrackMe3.00440FA4

00440F72|>6A00PUSH0

00440F74|.B980104400MOV ECX,CrackMe3.00441080;ASCII"Beggar off!"

00440F79|.BA8C104400MOV EDX,CrackMe3.0044108C;ASCII"Wrong Serial,try again!" 00440F7E|.A1442C4400MOV EAX,DWORD PTR DS:[442C44]

00440F83|.8B00MOV EAX,DWORD PTR DS:[EAX]

00440F85|.E8DEC0FFFF CALL CrackMe3.0043D068

00440F8A|.EB18JMP SHORT CrackMe3.00440FA4

00440F8C|>6A00PUSH0

00440F8E|.B980104400MOV ECX,CrackMe3.00441080;ASCII"Beggar off!"

00440F93|.BA8C104400MOV EDX,CrackMe3.0044108C;ASCII"Wrong Serial,try again!" 00440F98|.A1442C4400MOV EAX,DWORD PTR DS:[442C44]

00440F9D|.8B00MOV EAX,DWORD PTR DS:[EAX]

00440F9F|.E8C4C0FFFF CALL CrackMe3.0043D068

大家注意看一下上面的注释,我在上面标了两个关键点。有人可能要问,你怎么知道那两个地方是关键点?其实很简单,我是根据查看是哪条指令跳到“wrong serial,try again”这条字串对应的指令来决定的。如果你在调试选项->CPU标签中把“显示跳转路径”及其下面的两个“如跳转未实现则显示灰色路径”、“显示跳转到选定命令的路径”都选上的话,就会看到是从什么地方跳到出错字串处的:

我们在上图中地址00440F2C处按F2键设个断点,现在我们按F9键,程序已运行起来了。我在上面那个编辑框中随便输入一下,如CCDebuger,下面那个编辑框我还保留为原来的“754-GFX-IER-954”,我们点一下那个“Register now!”按钮,呵,OllyDBG跳了出来,暂停在我们下的断点处。我们看一下信息窗口,你应该发现了你刚才输入的内容了吧?我这里显示是这样:

堆栈SS:[0012F9AC]=00D44DB4,(ASCII"CCDebuger")

EAX=00000009

上面的内存地址00D44DB4中就是我们刚才输入的内容,我这里是CCDebuger。你可以在堆栈SS:[0012F9AC]=00D44DB4,(ASCII"CCDebuger")这条内容上左击选择一下,再点右键,在弹出菜单中选择“数据窗口中跟随数值”,你就会在下面的数据窗口中看到你刚才输入的内容。而EAX=00000009指的是你输入内容的长度。如我输入的CCDebuger是9个字符。如下图所示:

现在我们来按F8键一步步分析一下:

00440F2C|.8B45FC MOV EAX,DWORD PTR SS:[EBP-4];把我们输入的内容送到EAX,我这里是“CCDebuger”

00440F2F|.BA14104400MOV EDX,CrackMe3.00441014;ASCII"Registered User"

00440F34|.E8F32BFCFF CALL CrackMe3.00403B2C;关键,要用F7跟进去

00440F39|.7551JNZ SHORT CrackMe3.00440F8C;这里跳走就完蛋

当我们按F8键走到00440F34|.E8F32BFCFF CALL CrackMe3.00403B2C这一句时,我们按一下F7键,进入这个CALL,进去后光标停在这一句:

我们所看到的那些PUSH EBX、PUSH ESI等都是调用子程序保存堆栈时用的指令,不用管它,按F8键一步步过来,我们只关心关键部分:

00403B2C/$53PUSH EBX

00403B2D|.56PUSH ESI

00403B2E|.57PUSH EDI

00403B2F|.89C6MOV ESI,EAX;把EAX内我们输入的用户名送到ESI 00403B31|.89D7MOV EDI,EDX;把EDX内的数据“Registered User”送到EDI

00403B33|.39D0CMP EAX,EDX;用“Registered User”和我们输入的用户名作比较

00403B35|.0F848F000000JE CrackMe3.00403BCA;相同则跳

00403B3B|.85F6TEST ESI,ESI;看看ESI中是否有数据,主要是看看我们有没有输入用户名

00403B3D|.7468JE SHORT CrackMe3.00403BA7;用户名为空则跳

00403B3F|.85FF TEST EDI,EDI

00403B41|.746B JE SHORT CrackMe3.00403BAE

00403B43|.8B46FC MOV EAX,DWORD PTR DS:[ESI-4];用户名长度送EAX

00403B46|.8B57FC MOV EDX,DWORD PTR DS:[EDI-4];“Registered User”字串的长度送EDX 00403B49|.29D0SUB EAX,EDX;把用户名长度和“Registered User”字串长度相减

00403B4B|.7702JA SHORT CrackMe3.00403B4F;用户名长度大于“Registered User”长度则跳

00403B4D|.01C2ADD EDX,EAX;把减后值与“Registered User”长度相加,即用户名长度

00403B4F|>52PUSH EDX

00403B50|.C1EA02SHR EDX,2;用户名长度值右移2位,这里相当于长度除以4

00403B53|.7426JE SHORT CrackMe3.00403B7B;上面的指令及这条指令就是判断用户名长度最少不能低于4

00403B55|>8B0E MOV ECX,DWORD PTR DS:[ESI];把我们输入的用户名送到ECX

00403B57|.8B1F MOV EBX,DWORD PTR DS:[EDI];把“Registered User”送到EBX

00403B59|.39D9CMP ECX,EBX;比较

00403B5B|.7558JNZ SHORT CrackMe3.00403BB5;不等则完蛋

根据上面的分析,我们知道用户名必须是“Registered User”。我们按F9键让程序运行,出现错误对话框,点确定,重新在第一个编辑框中输入“Registered User”,再次点击那个“Register now!”按钮,被OllyDBG拦下。因为地址00440F34处的那个CALL我们已经分析清楚了,这次就不用再按F7键跟进去了,直接按F8键通过。我们一路按F8键,来到第二个关键代码处:

00440F49|.8B45FC MOV EAX,DWORD PTR SS:[EBP-4];取输入的注册码

00440F4C|.BA2C104400MOV EDX,CrackMe3.0044102C;ASCII"GFX-754-IER-954"

00440F51|.E8D62BFCFF CALL CrackMe3.00403B2C;关键,要用F7跟进去

00440F56|.751A JNZ SHORT CrackMe3.00440F72;这里跳走就完蛋

大家注意看一下,地址00440F51处的CALL CrackMe3.00403B2C和上面我们分析的地址00440F34处的CALL CrackMe3.00403B2C是不是汇编指令都一样啊?这说明检测用户名和注册码是用的同一个子程序。而这个子程序CALL我们在上面已经分析过了。我们执行到现在可以很容易得出结论,这个CALL也就是把我们输入的注册码与00440F4C地址处指令后的“GFX-754-IER-954”作比较,相等则OK。好了,我们已经得到足够的信息了。现在我们在菜单查看->断点上点击一下,打开断点窗口(也可以通过组合键ALT+B或点击工具栏上那个“B”图标打开断点窗口):

为什么要做这一步,而不是把这个断点删除呢?这里主要是为了保险一点,万一分析错误,我们还要接着分析,要是把断点删除了就要做一些重复工作了。还是先禁用一下,如果经过实际验证证明我们的分析是正确的,再删不迟。现在我们把断点禁用,在OllyDBG中按F9键让程序运行。输入我们经分析得出的内容:

用户名:Registered User

注册码:GFX-754-IER-954

点击“Register now!”按钮,呵呵,终于成功了:

OllyDBG 入门系列(三)-函数参考

现在进入第三篇,这一篇我们重点讲解怎样使用OllyDBG中的函数参考(即名称参考)功能。仍然选择https://www.doczj.com/doc/4112666276.html,镜像打包中的一个名称为CrackHead的crackme。老规矩,先运行一下这个程序看看:

呵,竟然没找到输入注册码的地方!别急,我们点一下程序上的那个菜单“Shit”(真是Shit啊,呵呵),在下拉菜单中选“Try It”,会来到如下界面:

我们点一下那个“Check It”按钮试一下,哦,竟然没反应!我再输个“78787878”试试,还是没反应。再试试输入字母或其它字符,输不进去。由此判断注册码应该都是数字,只有输入正确的注册码才有动静。用PEiD检测一下,结果为MASM32/TASM32,怪不得程序比较小。信息收集的差不多了,现在关掉这个程序,我们用OllyDBG载入,按F9键直接让它运行起来,依次点击上面图中所说的菜单,使被调试程序显示如上面的第二个图。先不要点那个“Check It”按钮,保留上图的状态。现在我们没有什么字串好参考了,我们就在API函数上下断点,来让被调试程序中断在我们希望的地方。我们在OllyDBG的反汇编窗口中右击鼠标,在弹出菜单中选择查找->当前模块中的名称(标签),或者我们通过按CTR+N组合键也可以达到同样的效果(注意在进行此操作时要在OllyDBG中保证是在当前被调试程序的领空,我在第一篇中已经介绍了领空的概念,如我这里调试这个程序时OllyDBG的标题栏显示的就是“[CPU-主线程,模块-CrackHea]”,这表明我们当前在被调试程序的领空)。通过上面的操作后会弹出一个对话框,如图:

对于这样的编辑框中输注册码的程序我们要设断点首选的API函数就是GetDlgItemText及GetWindowText。每个函数都有两个版本,一个是ASCII版,在函数后添加一个A表示,如GetDlgItemTextA,另一个是UNICODE版,在函数后添加一个W表示。如GetDlgItemTextW。对于编译为UNCODE版的程序可能在Win98下不能运行,因为Win98并非是完全

支持UNICODE的系统。而NT系统则从底层支持UNICODE,它可以在操作系统内对字串进行转换,同时支持ASCII和UNICODE版本函数的调用。一般我们打开的程序看到的调用都是ASCII类型的函数,以“A”结尾。又跑题了,呵呵。现在回到我们调试的程序上来,我们现在就是要找一下我们调试的程序有没有调用GetDlgItemTextA或GetWindowTextA函数。还好,找到一个GetWindowTextA。在这个函数上右击,在弹出菜单上选择“在每个参考上设置断点”,我们会在OllyDBG窗口最下面的那个状态栏里看到“已设置2个断点”。另一种方法就是那个GetWindowTextA函数上右击,在弹出菜单上选择“查找输入函数参考”(或者按回车键),将会出现下面的对话框:

看上图,我们可以把两条都设上断点。这个程序只需在第一条指令设断点就可以了。好,我们现在按前面提到的第一条方法,就是“在每个参考上设置断点”,这样上图中的两条指令都会设上断点。断点设好后我们转到我们调试的程序上来,现在我们在被我们调试的程序上点击那个“Check It”按钮,被OllyDBG断下:

00401323|.E84C010000CALL;GetWindowTextA

00401328|.E8A5000000CALL CrackHea.004013D2;关键,要按F7键跟进去

0040132D|.3BC6CMP EAX,ESI;比较

0040132F|.7542JNZ SHORT CrackHea.00401373;不等则完蛋

00401331|.EB2C JMP SHORT CrackHea.0040135F

00401333|.4E6F77207>ASCII"Now write a keyg"

00401343|.656E20616>ASCII"en and tut and y"

00401353|.6F7527726>ASCII"ou're done.",0

0040135F|>6A00PUSH0;Style=MB_OK|MB_APPLMODAL

00401361|.680F304000PUSH CrackHea.0040300F;Title="Crudd's Crack Head"

00401366|.6833134000PUSH CrackHea.00401333;Text="Now write a keygen and tut and you're d one."

0040136B|.FF7508PUSH DWORD PTR SS:[EBP+8];hOwner

0040136E|.E819010000CALL;MessageBoxA

从上面的代码,我们很容易看出00401328地址处的CALL CrackHea.004013D2是关键,必须仔细跟踪。而注册成功则会显示一个对话框,标题是“Crudd's Crack Head”,对话框显示的内容是“Now write a keygen and tut and you're done.”现在我按一下F8,准备步进到00401328地址处的那条CALL CrackHea.004013D2指令后再按F7键跟进去。等等,怎么回事?怎么按一下F8键跑到这来了:

00401474$-FF252C204000JMP DWORD PTR DS:[<&USER32.GetWindowText>;USER32.GetWindowTextA

0040147A$-FF2530204000JMP DWORD PTR DS:[<&USER32.LoadCursorA>];USER32.LoadCursorA

00401480$-FF251C204000JMP DWORD PTR DS:[<&USER32.LoadIconA>];USER32.LoadIconA

00401486$-FF2520204000JMP DWORD PTR DS:[<&USER32.LoadMenuA>];USER32.LoadMenuA

0040148C$-FF2524204000JMP DWORD PTR DS:[<&USER32.MessageBoxA>];USER32.MessageBoxA

原来是跳到另一个断点了。这个断点我们不需要,按一下F2键删掉它吧。删掉00401474地址处的断点后,我再按F8键,呵,完了,跑到User32.dll的领空了。看一下OllyDBG的标题栏:“[CPU-主线程,模块-USER32],跑到系统领空了,OllyDBG反汇编窗口中显示代码是这样:

77D3213C6A0C PUSH0C

77D3213E68A021D377PUSH USER32.77D321A0

77D32143E87864FEFF CALL USER32.77D185C0

怎么办?别急,我们按一下ALT+F9组合键,呵,回来了:

00401328|.E8A5000000CALL CrackHea.004013D2;关键,要按F7键跟进去

0040132D|.3BC6CMP EAX,ESI;比较

0040132F|.7542JNZ SHORT CrackHea.00401373;不等则完蛋

光标停在00401328地址处的那条指令上。现在我们按F7键跟进:

004013D2/$56PUSH ESI;ESI入栈

004013D3|.33C0XOR EAX,EAX;EAX清零

004013D5|.8D35C4334000LEA ESI,DWORD PTR DS:[4033C4];把注册码框中的数值送到ESI

004013DB|.33C9XOR ECX,ECX;ECX清零

004013DD|.33D2XOR EDX,EDX;EDX清零

004013DF|.8A06MOV AL,BYTE PTR DS:[ESI];把注册码中的每个字符送到AL

004013E1|.46INC ESI;指针加1,指向下一个字符

004013E2|.3C2D CMP AL,2D;把取得的字符与16进制值为2D的字符(即“-”)比较,这里主要用于判断输入的是不是负数

004013E4|.7508JNZ SHORT CrackHea.004013EE;不等则跳

004013E6|.BA FFFFFFFF MOV EDX,-1;如果输入的是负数,则把-1送到EDX,即16进制FFFFFFFF 004013EB|.8A06MOV AL,BYTE PTR DS:[ESI];取“-”号后的第一个字符

004013ED|.46INC ESI;指针加1,指向再下一个字符

004013EE|>EB0B JMP SHORT CrackHea.004013FB

004013F0|>2C30SUB AL,30;每位字符减16进制的30,因为这里都是数字,如1的ASCII 码是“31H”,减30H后为1,即我们平时看到的数值

004013F2|.8D0C89LEA ECX,DWORD PTR DS:[ECX+ECX*4];把前面运算后保存在ECX中的结果乘5再送到ECX

004013F5|.8D0C48LEA ECX,DWORD PTR DS:[EAX+ECX*2];每位字符运算后的值与2倍上一位字符运算后值相加后送ECX

004013F8|.8A06MOV AL,BYTE PTR DS:[ESI];取下一个字符

004013FA|.46INC ESI;指针加1,指向再下一个字符

004013FB|>0AC0OR AL,AL

004013FD|.^75F1JNZ SHORT CrackHea.004013F0;上面一条和这一条指令主要是用来判断是否已把用户输入的注册码计算完

004013FF|.8D040A LEA EAX,DWORD PTR DS:[EDX+ECX];把EDX中的值与经过上面运算后的ECX中值相加

送到EAX

00401402|.33C2XOR EAX,EDX;把EAX与EDX异或。如果我们输入的是负数,则此处功能就是把EAX中的值取反

00401404|.5E POP ESI;ESI出栈。看到这条和下一条指令,我们要考虑一下这个ESI的值是哪里运算得出的呢?

00401405|.81F653757A79XOR ESI,797A7553;把ESI中的值与797A7553H异或

0040140B\.C3RETN

这里留下了一个问题:那个ESI寄存器中的值是从哪运算出来的?先不管这里,我们接着按F8键往下走,来到0040140B地址处的那条RETN指令(这里可以通过在调试选项的“命令”标签中勾选“使用RET代替RETN”来更改返回指令的显示方式),再按一下F8,我们就走出00401328地址处的那个CALL了。现在我们回到了这里:

0040132D|.3BC6CMP EAX,ESI;比较

0040132F|.7542JNZ SHORT CrackHea.00401373;不等则完蛋

光标停在了0040132D地址处的那条指令上。根据前面的分析,我们知道EAX中存放的是我们输入的注册码经过计算后的值。我们来看一下信息窗口:

ESI=E6B5F2F9

EAX=FF439EBE

左键选择信息窗口中的ESI=E6B5F2F9,再按右键,在弹出菜单上选“修改寄存器”,我们会看到这样一个窗口:

可能你的显示跟我不一样,因为这个crackme中已经说了每个机器的序列号不一样。关掉上面的窗口,再对信息窗口中的EAX=FF439EBE做同样操作:

由上图我们知道了原来前面分析的对我们输入的注册码进行处理后的结果就是把字符格式转为数字格式。我们原来输入的是字串“12345666”,现在转换为了数字12345666。这下就很清楚了,随便在上面那个修改ESI图中显示的有符号或无符号编辑框中复制一个,粘贴到我们调试的程序中的编辑框中试一下:

呵呵,成功了。且慢高兴,这个crackme是要求写出注册机的。我们先不要求写注册机,但注册的算法我们要搞清楚。还记得我在前面说到的那个ESI寄存器值的问题吗?现在看看我们上面的分析,其实对做注册机来说是没有多少帮助的。要搞清注册算法,必须知道上面那个ESI寄存器值是如何产生的,这弄清楚后才能真正清楚这个crackme算法。今天就先说到这里,关于如何追出ESI寄存器的值我就留到下一篇OllyDBG入门系列(四)-内存断点中再讲吧。

OllyDBG 入门系列(四)-内存断点

还记得上一篇《OllyDBG入门系列(三)-函数参考》中的内容吗?在那篇文章中我们分析后发现一个ESI寄存器值不知是从什么地方产生的,要弄清这个问题必须要找到生成这个ESI值的计算部分。今天我们的任务就是使用OllyDBG的内存断点功能找到这个地方,搞清楚这个值是如何算出来的。这次分析的目标程序还是上一篇的那个crackme,附件我就不再上传了,用上篇中的附件就可以了。下面我们开始:

还记得我们上篇中所说的关键代码的地方吗?温习一下:

00401323|.E84C010000CALL;GetWindowTextA

00401328|.E8A5000000CALL CrackHea.004013D2;关键,要按F7键跟进去

0040132D|.3BC6CMP EAX,ESI;比较

0040132F|.7542JNZ SHORT CrackHea.00401373;不等则完蛋

我们重新用OllyDBG载入目标程序,F9运行来到上面代码所在的地方(你上次设的断点应该没删吧?),我们向上看看能不能找到那个ESI寄存器中最近是在哪里赋的值。哈哈,原来就在附近啊:

我们现在知道ESI寄存器的值是从内存地址40339C中送过来的,那内存地址40339C中的数据是什么时候产生的呢?

大家注意,我这里信息窗口中显示的是DS:[0040339C]=9FCF87AA,你那可能是DS:[0040339C]=XXXXXXXX,这里的XXXXXXXX表示的是其它的值,就是说与我这里显示的9FCF87AA不一样。我们按上图的操作在数据窗口中看一下:

从上图我们可以看出内存地址40339C处的值已经有了,说明早就算过了。现在怎么办呢?我们考虑一下,看情况程序是把这个值算出来以后写在这个内存地址,那我们要是能让OllyDBG在程序开始往这个内存地址写东西的时候中断下来,不就有可能知道目标程序是怎么算出这个值的吗?说干就干,我们在OllyDBG的菜单上点调试->重新开始,或者按CTR+F2组合键(还可以点击工具栏上的那个有两个实心左箭头的图标)来重新载入程序。这时会跳出一个“进程仍处于激活状态”的对话框(我们可以在在调试选项的安全标签下把“终止活动进程时警告”这条前面的勾去掉,这样下次就不会出现这个对话框了),问我们是否要终止进程。这里我们选“是”,程序被重新载入,我们停在下面这一句上:

00401000>/$6A00PUSH0;pModule=NULL

现在我们就要来设内存断点了。在OllyDBG中一般我们用到的内存断点有内存访问和内存写入断点。内存访问断点就是指程序访问内存中我们指定的内存地址时中断,内存写入断点就是指程序往我们指定的内存地址中写东西时中断。更多关于断点的知识大家可以参考论坛精华7->基础知识->断点技巧->断点原理这篇Lenus兄弟写的《如何对抗硬件断点之一---调试寄存器》文章,也可以看这个帖:https://www.doczj.com/doc/4112666276.html,/showthread.php?threadid=10829。根据当前我们调试的具体程序的情况,我们选用内存写入断点。还记得前面我叫大家记住的那个40339C内存地址吗?现在我们要用上了。我们先在OllyDBG的数据窗口中左键点击一下,再右击,会弹出一个如下图所示的菜单。我们选择其中的转到->表达式(也可以左键点击数据窗口后按CTR+G组合键)。如下图:

现在将会出现这样一个对话框:

我们在上面那个编辑框中输入我们想查看内容的内存地址40339C,然后点确定按钮,数据窗口中显示如下:

我们可以看到,40339C地址开始处的这段内存里面还没有内容。我们现在在40339C地址处后面的HEX数据或ASCII栏中按住左键往后拖放,选择一段。内存断点的特性就是不管你选几个字节,OllyDBG都会分配4096字节的内存区。这里我就选从40339C地址处开始的四个字节,主要是为了让大家提前了解一下硬件断点的设法,因为硬件断点最多只能选4个字节。选中部分会显示为灰色。选好以后松开鼠标左键,在我们选中的灰色部分上右击:

经过上面的操作,我们的内存断点就设好了(这里还有个要注意的地方:内存断点只在当前调试的进程中有效,就是说你如果重新载入程序的话内存断点就自动删除了。且内存断点每一时刻只能有一个。就是说你不能像按F2键那样同

时设置多个断点)。现在按F9键让程序运行,呵,OllyDBG中断了!

7C932F398808MOV BYTE PTR DS:[EAX],CL;这就是我们第一次断下来的地方

7C932F3B40INC EAX

7C932F3C4F DEC EDI

7C932F3D4E DEC ESI

7C932F3E^75CB JNZ SHORT ntdll.7C932F0B

7C932F408B4D10MOV ECX,DWORD PTR SS:[EBP+10]

上面就是我们中断后反汇编窗口中的代码。如果你是其它系统,如Win98的话,可能会有所不同。没关系,这里不是关键。我们看一下领空,原来是在ntdll.dll内。系统领空,我们现在要考虑返回到程序领空。返回前我们看一下数据窗口:

现在我们转到反汇编窗口,右击鼠标,在弹出菜单上选择断点->删除内存断点,这样内存断点就被删除了。

现在我们来按一下ALT+F9组合键,我们来到下面的代码:

00401431|.8D359C334000LEA ESI,DWORD PTR DS:[40339C];ALT+F9返回后来到的位置

00401437|.0FB60D EC334000MOVZX ECX,BYTE PTR DS:[4033EC]

0040143E|.33FF XOR EDI,EDI

我们把反汇编窗口往上翻翻,呵,原来就在我们上一篇分析的代码下面啊?

软件测试基础课程—慕课网

软件测试基础教程——慕课网 第一课时:软件测试概要 一、软件测试的定义 软件测试是使用人工或自动的手段来运行或测量软件系统的过程,以检验软件系统是否满足规定的要求,并找出与预期结果之间的差异。 二、软件测试的测试的对象 需求、概要设计、详细设计、运行环境、可运行程序、源代码。(软件测试≠程序测试) 三、软测的五大要素及两大目标 五大要素: 质量(最为核心),人员(决定因素),技术(实现手段)【测试技术,方法,测试工具】,资源【测试所需的硬件,网络环境,测试生命周期,测试时间】,流程(测试标准)【测试计划,测试执行,报告】目标:提升测试覆盖率及测试效率 四、软件测试所遵循的原则: 1.测试显示缺陷的存在,但不能证明系统不存在缺陷。 2.穷尽测试是不可能的,应设定及时终止的条件。 3.测试应该尽早进行。

4.缺陷具备群集特性。越是发现问题多的模块,就是我们重点关注的对象。 5.测试的杀虫剂悖论。在测试当中,我们采用同样的测试用例、同样的测试方法,多次、重复的来测试某一个模块,那最后我们就不能够再发现新的缺陷。所以我们的测试用例和测试方法应该不定期的评审和修改,并增加不同的测试方法或测试用例来测试软件或系统的不同部分,从而发现更多的缺陷。 6.测试的二八原则。就是我们应该把80%的时间或资源用在20%的重点模块上,重点测试这款软件中20%的重要模块,来达到我们测试的效率和资源配置最佳的比例。 7.测试活动依赖于测试背景。 第二课时:软件测试阶段、手段、模式 一、软件测试阶段 软件测试按测试阶段来分类:单元测试、集成测试、系统测试、验收测试。 (一)单元测试 是各个阶段测试的基础,是对软件中的最小可测试单元进行检查和验证。单元是人为规定的可测试的最小的模块。(java面向对象语言来说,最小可测试单元是每一个类) 单元测试是对代码进行测试 测试框架:junit针对JAVA nunit针对.net phpunit针对PHP CppUnit针对C++ 原则: 1.尽可能的保证各个测试用例是互相独立的。尽量避免使用依赖的方法。编写一个模拟的方法来取代使用外部依赖。 2.一般由代码的开发人员来实施,用以检验所开发的代码功能符合自己的设计要求。 益处: 1.能尽早发现缺陷。 2.有利于重构。 3.简化集成。 4.文档。简化文档作用 5.用于设计。 限制: 1.不可能覆盖所有的执行路径,所以不可能保证捕捉到所有路径的错误。 2.每一行代码,一般需要3~5行测试代码才能完成单元测试。所以存在投入和产出的一个平衡。 (二)集成测试(偏于技术角度验证)

软件测试免费教程下载教程讲解

软件测试免费教程下载教程讲解 软件测试是指使用人工或者自动的手段来运行或测定某个软件产品系统的过程,其目的是在于检验是否满足规定的需求或者弄清预期的结果与实际结果的区别。那么问题来了软件测试视频教程讲解在哪里找?软件测试视频教程讲解都有什么?本文主要描述软件测试的类型。 一、多语种测试又称本地化测试 是指为各个地方开发产品的测试,如英文版,中文版等等,包括程序是否能够正常运行,界面是否符合当地习俗,快捷键是否正常起作用等等,特别测试在A语言环境下运行B语言软件(比如在英文win98下试图运行中文版的程序),出现现象是否正常。 本地化测试还要考虑: ?当语言从A翻译到B,字符长度变化是否影响页面效果。 ?要考虑同一单词在各个国家的不同意思 ?要考虑各个国家的民族习惯 二、文字测试 文字测试测试软件中是否拼写正确,是否易懂,不存在二义性,没有语法错

误;文字与内容是否有出入等等,包括图片文字。比如:“比如,请输入正确的证件号码!”何谓正确的证件号码,证件可以为身份证,驾驶证,也可为军官证,如果改为“请输入正确的身份证号码!”用户就比较容易理解了。三、分辨率测试 测试在不同分辨率下,界面的美观程度,分为800*600,1024*768,1152*864,1280*768,1280*1024,1200*1600大小字体下测试。一个好的软件要有一个极佳的分辨率,而在其他分辨率下也都能可以运行。 四、发布测试 主要在产品发布前对一些附带产品,比如说明书,广告稿等进行测试?说明书测试:主要为语言检查(检查说明书语言是否正确,用词是否易于理解)、功能检查(功能是否描述完全,或者描述了并没有的功能等)、图片检查(检查图片是否正确) ?宣传材料测试:主要测试产品中的附带的宣传材料中的语言,描述功能,图片。 ?帮助文件测试:帮助文件是否正确、易懂、是否人性化。最好能够提供检索功能。 ?广告用语:产品出公司前的广告材料文字、功能、图片、人性化的检查。 五、文档审核测试 文档审核测试目前越来越引起人们的重视,软件质量不是检查出来的,而是融进软件开发中来。前置软件测试发越来越受到重视。请看一个资料:文档审核测试主要包括需求文档测试,设计文档测试,为前置软件测试测试中的一部

软件测试入门教程

软件测试入门教程 软件测试(Software Testing),描述一种用来促进鉴定软件的正确性、完整性、安全性和质量的过程。换句话说,软件测试是一种实际输出与预期输出之间的审核或者比较过程。软件测试的经典定义是:在规定的条件下对程序进行操作,以发现程序错误,衡量软件质量,并对其是否能满足设计要求进行评估的过程。 软件测试是使用人工操作或者软件自动运行的方式来检验它是否满足规定的需求或弄清预期结果与实际结果之间的差别的过程。 它是帮助识别开发完成(中间或最终的版本)的计算机软件(整体或部分)的正确度(correctness) 、完全度(completeness)和质量(quality)的软件过程;是SQA(software quality assurance)的重要子域。 Glenford J.Myers曾对软件测试的目的提出过以下观点:

(1)测试是为了发现程序中的错误而执行程序的过程。 (2)好的测试方案是极可能发现迄今为止尚未发现的错误的测试方案。 (3)成功的测试是发现了至今为止尚未发现的错误的测试。 (4)测试并不仅仅是为了找出错误。通过分析错误产生的原因和错误的发生趋势,可以帮助项目管理者发现当前软件开发过程中的缺陷,以便及时改进。 (5)这种分析也能帮助测试人员设计出有针对性的测试方法,改善测试的效率和有效性。 (6)没有发现错误的测试也是有价值的,完整的测试是评定软件质量的一种方法。 (7)另外,根据测试目的的不同,还有回归测试、压力测试、性能测试等,分别为了检验修改或优化过程是否引发新的问题、软件所能达到处理能力和是否达到预期的处理能力等。 测试原则

软件测试自学指南---从入门到精通

近来,软件测试行业发展迅速,企业越来越重视测试了。越来越多的人加入了测试大军中,很多人也想通过自学来学习软件测试技术加入这个行业,但是现在软件测试的书籍越来越多,也良莠不齐,而且软件测试涉及的技术也越来越多。本文主要说明的是从事软件测试行业需要必备的知识,以及该如何学习,主要给大家提供一些比较优秀的书籍,并给出学习的顺序。希望通过阅读本文,读者可以明确该如何学习测试,并学习哪些知识。由于仅是个人建议,如有错误不妥的地方,敬请提出批评。 一、软件测试基础知识

要想进入测试这个行业,就必须要了解什么是软件测试,该如何测试? 这部分的学习目标:掌握软件测试的基本概念、软件测试的流程,并能熟练的应用常见的用例设计方法来设计测试用例。掌握常见的测试方法和类型,并知道如何进行每个阶段的测试。 下面是推荐的参考书: 1、软件测试(原书第2版) (美)佩腾(Patton,R.)著,张小松等译 这本书可以用来作为进入行业的第一本书,本书讲解的都是实用的技术,通过阅读本书可以快速的去学会如何测试软件。个人建议,这本书至少要读3遍以上。

看完这本书,自己可以去找一个项目(可以到开源中国上查找)来测一测,应用一下学的知识,找一找缺陷。在测试这个项目中要体会一下测试的流程,学习如何搭建测试环境。 2、软件测试的艺术(原书第3版) (美)梅耶等 第二本就是这本软件测试的“圣经”,这本书据说是硅谷测试人员必备的书。这本书最值得看的地方就是测试的思想。阅读这本书可以让你有豁然开朗的感觉。 3、计算机软件测试(原书第2版)(美)卡尼尔这本书也是值得一读的,同样也是非常适合初学者阅读的。 4、全程软件测试朱少民 上面的都是外国人写的,来本国产的。

软件测试技术经典教程笔记(修).docx

第一章基础知识 1.1、软件 1)、软件=程序+文档 2)、分类 功能:系统+应用 架构:单机+C/S+B/S 用户:产品+项目 规模:小型+中型+大型 1.2、Bug 1)、类型一(广义上,软件生命周期,与用户需求不符的问题): 完全没有实现的功能 基本实现功能,但有功能上或性能上的问题 实现了用户不需要的功能 2)、类型二(测试执行阶段的问题) Defect---------Requirements&Design Error-----------Development Bug------------Testing Failure---------Post production 1.3、测试 1)、概念: 测试是为了检验实际的软件是否符合用户需求,所以不能为了发现错误而发现错误。使用人工或自动手段,来运行或测试某个系统的过程。 2)、测试环境:硬件+软件+网络 要求:真实(项目、产品)+干净+无毒+独立(测试与开发) 1.4、测试用例 测试用例=输入+输出+测试环境 便于团队交流,便于重复测试,便于跟踪统计,比纳与用户自测 开发生命周期 需求分析→概要设计→详细设计→编码→维护 测试生命周期 测试计划→测试设计→测试执行→测试评估 需求分析和测试计划完成后,根据《系统需求规格说明书》和软件原型(DEMO)写测试用例 1.5 其他 1)、测试人员素质要求:细心、耐心、信心、服务意识、团队合作意识、沟通能力 2)、如何成为优秀的测试工程师:1、不断学习充电2、阅读原版书籍3、阅读缺陷管理系 统中的缺陷报告4、阅读高手写的测试用例5、学习产品相关 的业务知识

1.6 软件测试的基本规则 1) Zero Bug 与Good Enough Good Enough原则:不充分测试是不负责任,过分的测试是一种资源浪费。 参考:*遗留bug不超过10个,严重的不超过5个 *测试用例执行率为100%,通过率为95% *单元测试,关键模块语句覆盖率达到100%,分支覆盖率达到85% 2) 不要视图穷举法 3) 开发人员不能既是运动员又是裁判员 4) 软件测试要尽早执行 一般情况下,软件80%的缺陷集中在20%的模块中。 7) 缺陷具有免疫性 缺陷具有免疫性,需要根据新版本修改维护测试用例,另外,有一个值得注意的经验:没修复3-4个bug,可能会产生一个新bug。 第二章测试分类 2.1、是否运行程序 Static Testing------------代码规范、界面、文档 Dynamic Testing--------运行程序 2.2、根据阶段分类 Unit Testing(单元测试)----------10% 最小模块,依据源程序和《详细设计》 白盒测试人员||开发人员 编译代码→静态测试→动态测试 桩模块(Stub)、驱动模块(Driver) Integration Testing(集成测试)----------20% 模块间的接口,依据单元测试的模块和《概要设计》 白盒测试人员||开发人员 一般单元和集成同步进行 System Testing(系统测试)----------40% 整个系统(功能、性能、软硬件环境),依据《需求规格说明书》 黑盒测试工程师 Acceptance Testing(验收测试)----------20% 整个系统(功能、性能、软硬件环境),依据《需求规格说明书》和验收标准

软件测试基础(经典测试面试题答案)

软件测试基础教程 测试的基本概念 测试是软件生存周期中十分重要的一个过程,是产品发布、提交给最终用户前的稳定化阶段。 1、测试的分类: 从测试方法的角度可以分为手工测试和自动化测试。 手工测试:不使用任何测试工具,根据事先设计好的测试用例来运行系统,测试各功能模块。 自动化测试:利用测试工具,通过编写测试脚本和输入测试数据,自动运行测试程序。目前最常用的自动化测试工具是基于GUI的自动化测试工具,基本原理都是录制、回放技术。 从整体的角度可以分为单元测试、集成测试、系统测试、确认测试。 单元测试:是针对软件设计的最小单位—程序模块,进行正确性检验的测试工作。一般包括逻辑检查、结构检查、接口检查、出错处理、代码注释、输入校验、边界值检查。 单元测试的依据是系统的详细设计;一般由项目组开发人员自己完成。 集成测试:在单元测试的基础上,将所有模块按照设计要求组装进行测试。一般包括逻辑关系检查、数据关系检查、业务关系检查、模块间接口检查、外部接口检查。 系统测试:系统测试是在所有单元、集成测试后,对系统的功能及性能的总体测试。 确认测试:模拟用户运行的业务环境,运用黑盒测试方法,验证软件系统是否满足用户需求或软件需求说明书中指明的软件特性(功能、非功能)上的。 从测试原理上分为:白盒测试、黑盒测试和灰盒测试。 白盒测试:是通过程序的源代码进行测试而不使用用户界面。这种类型的测试需要从代码句法发现内部代码在算法,溢出,路径,条件等等中的缺点或者错误,进而加以修正。 黑盒测试:是通过使用整个软件或某种软件功能来严格地测试, 而并没有通过检查程序的源代码或者很清楚地了解该软件的源代码程序具体是怎样设计的。测试人员通过输入他们的数据然后看输出的结果从而了解软件怎样工作。在测试时,把程序看作一个不能打开的黑盆子, 在完全不考虑程序内部结构和内部 特性的情况下,测试者在程序接口进行测试,它只检查程序功能是否按照需求 规格说明书的规定正常使用,程序是否能适当地接收和正确的输出。黑盒测试 方法主要有等价类划分、边界值分析、因—果图、错误推测法。 等价类划分: 是把所有可能的输入数据,即程序的输入域划分成若干部分(子集),然后从每一个子集中选取少数具有代表性的数据作为测试用例.该方法是一种重要的,常用的黑盒测试用例设计方法. 1) 划分等价类: 等价类是指某个输入域的子集合.在该子集合中,各个输入数据对于揭露程序中的错误都是等效的.并合理地假定:测试某等价类的代表值就等于对这一类其它值的测试.因此,

软件测试技术基础课后习题答案[1]

第1章软件测试概述 1.简述软件测试的意义。 解:随着计算机技术的迅速发展和广泛深入的应用,软件质量问题已成为开发和使用软件人员关注的焦点。而由于软件本身的特性,软件中的错误是不开避免的。不断改进的开发技术和工具只能减少错误的发生,但是却不可能完全避免错误。因此为了保证软件质量,必须对软件进行测试。软件测试是软件开发中必不可少的环节,是最有效的排除和防治软件缺陷的手段,是保证软件质量、提高软件可靠性的最重要手段。 2.什么是软件缺陷?它的表现形式有哪些? 解:从产品内部看,软件缺陷是软件产品开发或维护过程中所存在的错误、毛病等各种问题;从外部看,软件缺陷是系统所需实现的某种功能的失效或违背。 它的表现形式主要有以下几种:(1)软件未达到产品说明书中已经标明的功能;(2)软件出现了产品说明书中指明不会出现的错误;(3)软件未达到产品说明书中虽未指出但应当达到的目标;(4)软件功能超出了产品说明书中指出的范围;(5)软件测试人员认为软件难以理解、不易使用,或者最终用户认为该软件使用效果不良。 3.简单分析软件缺陷产生的原因,其中那个阶段引入的缺陷最多,修复成本又最低? 解:软件缺陷产生的主要原因有:需求规格说明错误;设计错误;程序代码有误;其他。其中在需求分析阶段引入的缺陷最多,修复的成本又最低。 4.当用户登录某网站购物完毕并退出后,忽然想查查购物时付账的总金额,于是按了浏览器左上角的“退回”按钮, 就又回到了退出前的网页,你认为该购物软件有缺陷吗?如果有,属于哪一类? 解:有缺陷。其所属类别与软件产品说明书的要求有关。 5.什么是软件测试?简述其目的与原则。 解:软件测试是为了尽快尽早地发现在软件产品中所存在的各种软件缺陷而展开的贯穿整个软件开发生命周期,对软件产品(包括阶段性产品)进行验证和确认的活动过程。 测试目的:(1)证明:获取系统在可接受风险范围内可用的信心;尝试在非正常情况和条件下的功能和特性;保证一个工作产品是完整的并且可用或可被集成。(2)检测:发现缺陷、错误和系统不足;定义系统的能力和局限性;提供组件、工作产品和系统的质量信息。(3)预防:澄清系统的规格和性能;提供预防或减少可能制造错误的信息;在过程中尽早检测错误;确认问题和风险,并且提前确认解决这些问题和风险的途径。 测试过程中应注意和遵循的原则:(1)测试不是为了证明程序的正确性,而是为了证明程序不能工作。(2)测试应当有重点。(3)事先定义好产品的质量标准。(4)软件项目一启动,软件测试也就开始,而不是等到程序写完才开始进行测试。(5)穷举测试是不可能的。(6)第三方进行测试会更客观,更有效。(7)软件测试计划是做好软件测试工作的前提。(8)测试用例是设计出来的,不是写出来的。(9)对发现错误较多的程序段,应进行更深入的测试。(10)重视文档,妥善保存一切测试过程文档。 6.件测试阶段是如何划分的? 解:软件测试的阶段划分为:规格说明书审查;系统和程序设计审查;单元测试;集成测试;确认测试;系统测试;验

初学者入门教程:软件测试从零开始

https://www.doczj.com/doc/4112666276.html,/296/3112296.shtml 本文面向软件测试新手,从测试前的准备工作、测试需求收集、测试用例设计、测试用例执行、测试结果分析几个方面给出建议和方法。鉴于国内的软件开发、测试不规范的现状,本文为软件测试新手提供了若干个软件测试的关注点。 【关键词】软件测试、测试用例、测试需求、测试结果分析 引言 几年前,从学校毕业后,第一份工作就是软件测试。那时候,国内的软件企业大多对软件测试还没有什么概念,书店里除了郑人杰编写的《计算机软件测试技术》之外,几乎没有其它的软件测试相关书籍,软件测试仅仅在软件工程的教材中作为一个章节列出来,因此,我对软件测试一无所知。不过,在正式走上工作岗位之前,公司提供了为期两周的系统的软件测试技术专题培训,对接下来的软件测试工作有很大的指导意义。现在,我继续从事软件测试的培训与咨询服务,在这个过程中,亲眼目睹了很多软件测试新手面对的困惑,他们初涉软件测试行业,没有接受系统的培训,对软件测试一无所知,既不知道该测试什么,也不知道如何开始测试。下面针对上述情况,给出若干解决办法。 测试准备工作 在测试工作伊始,软件测试工程师应该搞清楚软件测试工作的目的是什么。如果你把这个问题提给项目经理,他往往会这样回答:“发现我们产品里面的所有 BUG ,这就是你的工作目的”。作为一名软件测试新手,如何才能发现所有的 BUG ?如何开始测试工作?即便面对的是一个很小的软件项目,测试需要考虑的问题也是方方面面的,包括硬件环境、操作系统、产品的软件配置环境、产品相关的业务流程、用户的并发容量等等。该从何处下手呢? 向有经验的测试人员学习 如果你进入的是一家运作规范的软件公司,有独立的软件测试部门、规范的软件测试流程、软件测试技术有一定的积累,那么,恭喜你!你可以请求测试经理委派有经验的测试人员作为你工作上的业务导师,由他列出软件测试技术相关书籍目录、软件测试流程相关文档目录、产品业务相关的文档目录,在业务导师的指导下逐步熟悉软件测试的相关工作。其实,在很多运作规范的软件公司,已经把上述的师父带徒弟的方式固化到流程中。 如果你进入的是一个软件测试一片空白的软件企业,那么,也恭喜你!你可以在这里开创一片自己的软件测试事业,当然,前提是老板确实认识到软件测试的重要性,实实在在需要提高产品的质量。这时候,可以到国内的软件测试论坛和相关网站上寻找软件测试资源,这种情况下,自学能力和对技术的悟性就至关重要了。 阅读软件测试的相关书籍 现在,中文版的软件测试书籍越来越多,有的是国人自己写的,有的是翻译国外经典之作。可以到 https://www.doczj.com/doc/4112666276.html, 或者 https://www.doczj.com/doc/4112666276.html, 等网络购书的站点查找软件测试相

软件测试基础知识整理

软件测试基础教程 测试是软件生存周期中十分重要的一个过程,是产品发布、提交给最终用户前的稳定化阶段。 一、测试的分类: 从测试方法的角度分为: (1)手工测试:不使用任何测试工具,根据事先设计好的测试用例来运行系统,测试各功能模块。 (2)自动化测试:利用测试工具,通过编写测试脚本和输入测试数据,自动运行测试程序。目前最常用的自动化测试工具是基于GUI的自动化测试工具,基本原理都是录制、回放技术。 > 从整体的角度分为: (1)单元测试:是针对软件设计的最小单位—程序模块,进行正确性检验的测试工作。一般包括逻辑检查、结构检查、接口检查、出错处理、代码注释、输入校验、边界值检查。单元测试的依据是系统的详细设计;一般由项目组开发人员自己 完成。 (2)集成测试:在单元测试的基础上,将所有模块按照设计要求组装进行测试。一般包括逻辑关系检查、数据关系检查、业务关系检查、模块间接口检查、外部接口检查。 (3)系统测试:系统测试是在所有单元、集成测试后,对系统的功能及性能的总体测试。 (4)确认测试:模拟用户运行的业务环境,运用黑盒测试方法,验证软件系统是否满足用户需求或软件需求说明书中指明的软件特性(功能、非功能)上的。 从测试原理上分为: . (1)白盒测试:是通过程序的源代码进行测试而不使用用户界面。这种类型的测试需要从代码句法发现内部代码在算法,溢出,路径,条件等等中的缺点或者错误,进而加以修正。 (2)黑盒测试:是通过使用整个软件或某种软件功能来严格地测试,而并没有通过检查程序的源代码或者很清楚地了解该软件的源代码程序具体是怎样设计的。测试人员通过输入他们的数据然后看输出的结果从而了解软件怎样工作。在测试时, 把程序看作一个不能打开的黑盆子,在完全不考虑程序内部结构和内部特性的情况下,测试者在程序接口进行测试,它 只检查程序功能是否按照需求规格说明书的规定正常使用,程序是否能适当地接收和正确的输出。 黑盒测试方法主要有等价类划分、边界值分析、因—果图、错误推测法。 A、等价类划分:是把所有可能的输入数据,即程序的输入域划分成若干部分(子集),然后从每一个子 集中选取少数具有代表性的数据作为测试用例。该方法是一种重要的,常用的黑盒测试 用例设计方法。 B、边界值分析:长期的测试工作经验告诉我们,大量的错误是发生在输入或输出范围的边界上,而不是 发生在输入输出范围的内部。因此针对各种边界情况设计测试用例,可以查出更多的错 误。 C、错误推测法:基于经验和直觉推测程序中所有可能存在的各种错误,从而有针对性的设计测试用例的 方法。错误推测方法的基本思想:列举出程序中所有可能有的错误和容易发生错误的特 殊情况,根据他们选择测试用例。例如,在单元测试时曾列出的许多在模块中常见的 错误。以前产品测试中曾经发现的错误等,这些就是经验的总结。还有,输入数据 和输出数据为0的情况。输入表格为空格或输入表格只有一行。这些都是容易发生错 误的情况。可选择这些情况下的例子作为测试用例。

软件测试技术基础教程(第2版)-习题答案

软件测试技术基础教程(第2版)-习题答案

第一章软件测试理论 一、选择题 1、C 2、A 3、D 4、B 5、D 6、 D 7、B 8、B 二、简答题 1. 参考答案: 软件测试是伴随着软件的产生而产生的。在软件行业发展初期,没有系统意义上的软件测试,更多的是一种类似调试的测试,测试用例的设计和选取也都是根据测试人员的经验随机进行的,大多数测试的目的是为了证明系统可以正常运行。 到了20世纪70年代以后,很多测试理论和测试方法应运而生,逐渐形成了一套完整的体系。在产业界,从20世纪70年代后期到20世纪80年代中期,很多软件企业成立了QA或者SQA部门。后来QA的职能转变为流程监控(包括监控测试流程),而测试(Testing)则从QA中分离出来成为独立的组织职能。 到了20世纪80年代初期,一些软件测试的基础理论和实用技术开始形成,软件测试作为软件

质量保证(SQA)的主要职能,包含软件质量评价的内容。软件测试已有了行业标准(IEEE/ANSI )。 在我国,软件测试目前还没有形成一个真正的产业,尚处于起步阶段。 但是,在国内,现在在软件测试行业中各种软件测试的方法、技术和标准都还在探索阶段。 总之,国内软件测试行业与一些发达国家相比还存在一定的差距。 2. 参考答案: 软件缺陷造成的修复费用随着时间的推移呈指数级地增长,如下图所示。 3. 参考答案: 软件测试的复杂性体现在:

?不可能对程序实现完全测试。 ?杀虫剂现象,即为了克服被测试软件的免疫力,软件测试员必须不断编写新的测试程 序,对程序的各个部分进行不断测试,以避 免被测试软件对单一的测试程序具有免疫 力而使软件缺陷不被发现。 ?软件测试的代价不容易掌握,因为随着测试量的增加,测试成本将呈几何数级上升,而 软件缺陷数量降低到某一数值之后将没有 明显的变化,寻求最优测试点,掌握好测试 工作量是至关重要的。 ?在实际操作过程中,测试人员要进行正确的判断,合理的取舍,根据风险分析来决定哪 些故障需要修复,哪些故障可以不修复,即 并不是所有的软件缺陷都需要被修复。 4. 参考答案: 软件测试是软件生命期中费用消耗最大的环节。测试费用除了测试的直接消耗外,还包括其他的相关费用。影响测试费用的主要因素有:(1)软件的功能,软件产品需要达到的标

软件测试学习课程全集

软件测试学习课程全集 最近,IT人才市场在软件测试工程师方面的人才缺口逐渐扩大,很多朋友也瞄准机会,想要学习软件测试,有很多朋友喜欢自学,那么笔者就必须提醒各位一句了,软件测试这个行业,常学常新,由于市场的不断发展,软件测试要学习的东西也在不断更新,所以下载软件测试培训视频一定尽量找最新最近的。另外,往远了说,软件测试这个行业又博又深,因此,在大家看软件测试学习课程学习软件测试之前,有这么三个问题有必要搞明白: 1、一定要懂代码吗? 很多公司对一般测试员的要求很低;而且现在铺天盖地的培训机构都在宣传"零基础入门软件测试,培训三个月包找工作",所以导致很多人误以为测试很简单。其实测试不是简单的,当开发人员将软件提交到测试人员那里以后,测试人

员最好要迅速透彻的理解软件的功能。如果你有一定的编码基础,就能更好的了解所要测软件的功能及测试需要的软硬件环境,和开发沟通遇到的问题。 2、软件测试人员如何成长? 现在网络这么发达,学习编程可以去CSDN、开源中国等论坛,学习测试可以去千锋教育这样的老牌培训机构了。 可以多去浏览,总会看到很多行业资讯、学习资料等,比较高效的是参与其中,分享一些自己的学习心得,参与一些自己感兴趣的活动,这样你会成长的更快更好。如果坚持自学的话,也完全可以去千锋教育的网站要软件测试学习课程,比较系统,适合新手学。 3、工作技能要广还是精? 软件测试种类很多:功能测试、性能测试、自动化测试等等;但其实很多人能接触的可能只是某一个方面。最好能广泛接触下各个方面的测试,比如自动化测试网上有很多免费资料、视频及工具,刚开始可以下载已成型的工具试用,跟着相关资料不断学习,等到后期可以研究下各个自动化测试框架,再厉害的就可以自己编写自动化测试工具了。通过广泛接触各个方面的知识,了解清楚行业发展及自己兴趣爱好,选择自己喜欢的一个方面不断深入,学到精通,你就应该已经成为一名优秀的测试员了。 随着时代的不断发展,每个行业都会不断的整合、改变,我们能做的就是选择好自己喜欢的行业,不断学习,自学是枯燥的,不管是下载软件测试学习课程

软件测试自学指南

软件测试自学指南 软件测试自学指南一、软件测试基础知识 要想进入测试这个行业,就必须要了解什么是软件测试,该如何测试? 这部分的学习目标:掌握软件测试的基本概念、软件测试的流程,并能熟练的应用常见的用例设计方法来设计测试用例。掌握常见的测试方法和类型,并知道如何进行每个阶段的测试。 下面是推荐的参考书: 1、软件测试(原书第2版) (美)佩腾(Patton,R.)著,张小松等译 这本书可以用来作为进入行业的第一本书,本书讲解的都是实用的技术,通过阅读本书可以快速的去学会如何测试软件。个人建议,这本书至少要读3遍以上。 看完这本书,自己可以去找一个项目(可以到开源中国上查找)来测一测,应用一下学的知识,找一找缺陷。在测试这个项目中要体会一下测试的流程,学习如何搭建测试环境。 2、软件测试的艺术(原书第3版) (美)梅耶等 第二本就是这本软件测试的“圣经”,这本书据说是硅谷测试人员必备的书。这本书最值得看的地方就是测试的思想。阅读这本书可以让你有豁然开朗的感觉。 3、计算机软件测试(原书第2版)(美)卡尼尔 这本书也是值得一读的,同样也是非常适合初学者阅读的。 4、全程软件测试朱少民 上面的都是外国人写的,来本国产的。 还有很多经典的测试书,例如:Paul C.Jorgensen的软件测试(第2版)这本书,但是笔者认为他不是很适合初学者,这本书都是用来做研究生教材的,做过一段测试的可以来看看。 二、软件测试进阶书籍 这部分主要是针对有过一年左右测试经验的,真正测试过几个项目的。推荐的参考书主要是提高测试效率的,一些测试的经验。 1、有效软件测试

这本书主要是给软件测试的各个阶段提出了一些建议,一共50条。这些建议都十分中肯,值得一读。 2、软件测试经验与教训 听书名也应该了解了一大半了吧,这本书一共给出了293条经验,阅读它吧。它会让你重新思考关于测试的基本理论。 还有一些很好的书籍了,但是没有读过的就不做推荐了。 三、自动化测试 我们都知道,目前自动化测试是软件测试的趋势,而且目前公司在招聘的过程中都会考察自动化相关的知识。这里我们介绍一下QTP和Loadrunner等测试工具。 目标:掌握自动化测试的概念、流程和方法。能够使用相关的工具进行自动化的测试。QTP部分: 目标:掌握QTP的测试流程、工作原理和基本使用。能够使用QTP进行自动化测试。进阶需要掌握自动化框架设计的原理,并能独立设计自动化框架。 目前网络资源很丰富,有很多前辈录制了很多视频,大家可以先来看看。 1、IT播吧- 小强老师零基础学习软件测试系列视频教程之QTP学习指南 首先可以先看这套视频,这里主要讲的是QTP的基本使用。学习视频的过程中,最好能够独立的测试QTP自带的飞机订票的例子。这个最好了,QTP的基本使用就没问题了。 2、精通QTP——自动化测试技术领航余杰赵旭斌编著 第一个视频还是讲的录制和回放,并且也是以飞机订票作为的例子,但是实际工作中,很少有录制的项目,基本上都是需要自己开发脚本的。所以这本书会给你很大帮助的。 3、QTP自动化测试权威指南(第二版) 这本是QTP的大牛Tarun Lalwani的经典力作,公认的QTP测试的“圣经”。无论是初学者还是使用过QTP的都应该好好的读一读。

软件测试技术基础教程

软件测试技术基础教程 软件测试技术基础教程。近来,软件测试行业发展迅速,企业越来越重视测试了。越来越多的人加入了测试大军中,很多人也想通过自学来学习软件测试技术加入这个行业,更多的人开始关注软件测试案例教程,那么软件测试案例教程哪里好呢?软件测试案例教程内容有什么?软件测试案例教程学什么?下面我为大家简要介绍一下软件测试案例教程——黑盒测试和白盒测试 黑盒测试:已知产品的功能设计规格,可以进行测试证明每个实现了的功能是否符合要求。 白盒测试:已知产品的内部工作过程,可以通过测试证明每种内部操作是否符合设计规格要求,所有内部成分是否以经过检查。 软件的黑盒测试意味着测试要在软件的接口处进行。这种方法是把测试对象看做一个黑盒子,测试人员完全不考虑程序内部的逻辑结构和内部特性,只依据程序的需求规格说明书,检查程序的功能是否符合它的功能说明。因此黑盒测试又叫功能测试或数据驱动测试。黑盒测试主要是为了发现以下几类错误: 1、是否有不正确或遗漏的功能? 2、在接口上,输入是否能正确的接受?能否输出正确的结果? 3、是否有数据结构错误或外部信息(例如数据文件)访问错误?

4、性能上是否能够满足要求? 5、是否有初始化或终止性错误? 软件的白盒测试是对软件的过程性细节做细致的检查。这种方法是把测试对象看做一个打开的盒子,它允许测试人员利用程序内部的逻辑结构及有关信息,设计或选择测试用例,对程序所有逻辑路径进行测试。通过在不同点检查程序状态,确定实际状态是否与预期的状态一致。因此白盒测试又称为结构测试或逻辑驱动测试。白盒测试主要是想对程序模块进行如下检查: 1、对程序模块的所有独立的执行路径至少测试一遍。 2、对所有的逻辑判定,取“真”与取“假”的两种情况都能至少测一遍。 3、在循环的边界和运行的界限内执行循环体。 4、测试内部数据结构的有效性,等等。

软件测试技术基础教程》习题解答

第一章软件测试理论 一、选择题 1.软件测试的目的是C。 A.表明软件的正确性B.评价软件质量 C.尽可能发现软件中的错误D.判定软件是否合格 2.下面关于软件测试的说法,A是错误的。 A.软件测试是程序测试 B.软件测试贯穿于软件定义和开发的整个期间 C.需求规格说明、设计规格说明都是软件测试的对象 D.程序是软件测试的对象 3.某软件公司在招聘软件评测师时,应聘者甲向公司做如下保证: ①经过自己测试的软件今后不会再出现问题; ②在工作中对所有程序员一视同仁,不会因为在某个程序员编写的程序中发现的问题多,就重点审查该程序,以免不利于团结; ③承诺不需要其他人员,自己就可以独立进行测试工作; ④发扬咬定青山不放松的精神,不把所有问题都找出来,决不罢休; 你认为应聘者甲的保证B。 A.①、④是正确的B.②是正确的 C.都是正确的D.都不正确 4.软件测试的对象包括B。 A.目标程序和相关文档B.源程序、目标程序、数据及相关文档 C.目标程序、操作系统和平台软件D.源程序和目标程序 5.导致软件缺陷的原因有很多,①-④是可能的原因,其中最主要的原因包括D。 ①软件需求说明书编写的不全面,不完整,不准确,而且经常更改②软件设计说明书③软件操作人员的水平④开发人员不能很好的理解需求说明书和沟通不足 A.①、②、③B.①、③C.②、③D.①、④ 二、简答题 1.简述软件测试发展的历史及软件测试的现状。 参考答案: 软件测试是伴随着软件的产生而产生的。在软件行业发展初期,没有系统意义上的软件测试,更多的是一种类似调试的测试,测试用例的设计和选取也都是根据测试人员的经验随机进行的,大多数测试的目的是为了证明系统可以正常运行。 到了20世纪70年代以后,很多测试理论和测试方法应运而生,逐渐形成了一套完整的体系。在产业界,从20世纪70年代后期到20世纪80年代中期,很多软件企业成立了QA或者SQA部门。后来QA的职能转变为流程监控(包括监控测试流程),而测试(Testing)则从QA中分离出来成为独立的组织职能。 到了20世纪80年代初期,一些软件测试的基础理论和实用技术开始形成,软件测试作为软件质量保证(SQA)的主要职能,包含软件质量评价的内容。软件测试已有了行业标准(IEEE/ANSI)。 在我国,软件测试目前还没有形成一个真正的产业,尚处于起步阶段。 但是,在国内,现在在软件测试行业中各种软件测试的方法、技术和标准都还在探索阶段。 总之,国内软件测试行业与一些发达国家相比还存在一定的差距。 2.简述软件缺陷在不同阶段发现错误修复的费用。 参考答案:

软件测试入门教程视频教程讲解—必须知道的事

软件测试入门教程视频教程讲解—必须知道的事 软件测试是指使用人工或者自动的手段来运行或测定某个软件产品系统的过程,其目的是在于检验是否满足规定的需求或者弄清预期的结果与实际结果的区别。那么问题来了软件测试视频教程讲解在哪里找?软件测试视频教程讲解都有什么?本文主要描述软件测试的类型。 一、多语种测试又称本地化测试 是指为各个地方开发产品的测试,如英文版,中文版等等,包括程序是否能够正常运行,界面是否符合当地习俗,快捷键是否正常起作用等等,特别测试在A语言环境下运行B语言软件(比如在英文win98下试图运行中文版的程序),出现现象是否正常。 本地化测试还要考虑: ?当语言从A翻译到B,字符长度变化是否影响页面效果。 ?要考虑同一单词在各个国家的不同意思 ?要考虑各个国家的民族习惯 二、文字测试 文字测试测试软件中是否拼写正确,是否易懂,不存在二义性,没有语法错

误;文字与内容是否有出入等等,包括图片文字。比如:“比如,请输入正确的证件号码!”何谓正确的证件号码,证件可以为身份证,驾驶证,也可为军官证,如果改为“请输入正确的身份证号码!”用户就比较容易理解了。三、分辨率测试 测试在不同分辨率下,界面的美观程度,分为800*600,1024*768,1152*864,1280*768,1280*1024,1200*1600大小字体下测试。一个好的软件要有一个极佳的分辨率,而在其他分辨率下也都能可以运行。 四、发布测试 主要在产品发布前对一些附带产品,比如说明书,广告稿等进行测试?说明书测试:主要为语言检查(检查说明书语言是否正确,用词是否易于理解)、功能检查(功能是否描述完全,或者描述了并没有的功能等)、图片检查(检查图片是否正确) ?宣传材料测试:主要测试产品中的附带的宣传材料中的语言,描述功能,图片。 ?帮助文件测试:帮助文件是否正确、易懂、是否人性化。最好能够提供检索功能。 ?广告用语:产品出公司前的广告材料文字、功能、图片、人性化的检查。 五、文档审核测试 文档审核测试目前越来越引起人们的重视,软件质量不是检查出来的,而是融进软件开发中来。前置软件测试发越来越受到重视。请看一个资料:文档审核测试主要包括需求文档测试,设计文档测试,为前置软件测试测试中的一部

软件测试技术基础教程(第2版)

软件测试技术基础教程(第2版) 第一章软件测试理论一、选择题1、C2、A3、D4、B5、D6、D7、B 8、B 二、简答题1.参考答案:软件测试是伴随着软件的产生而产生的。在软件行业发展初期,没有系统意义上的软件测试,更多的是一种类似调试的测试,测试用例的设计和选取也都是根据测试人员的经验随机进行的,大多数测试的目的是为了证明系统可以正常运行。到了20世纪70年代以后,很多测试理论和测试方法应运而生,逐渐形成了一套完整的体系。在产业界,从20世纪70年代后期到20世纪80年代中期,很多软件企业成立了QA或者SQA部门。后来QA的职能转变为流程监控(包括监控测试流程),而测试(Testing)则从QA中分离出来成为独立的组织职能。到了20世纪80年代初

期,一些软件测试的基础理论和实用技术开始形成,软件测试作为软件质量保证的主要职能,包含软件质量评价的内容。软件测试已有了行业标准。在我国,软件测试目前还没有形成一个真正的产业,尚处于起步阶段。但是,在国内,现在在软件测试行业中各种软件测试的方法、技术和标准都还在探索阶段。总之,国内软件测试行业与一些发达国家相比还存在一定的差距。 2. 参考答案:软件缺陷造成的修复费用随着时间的推移呈指数级地增长,如下图所示。3.参考答案:软件测试的复杂性体现在:? 不可能对程序实现完全测试。? 杀虫剂现象,即为了克服被测试软件的免疫力,软件测试员必须不断编写新的测试程序,对程序的各个部分进行不断测试,以避免被测试软件对单一的测试程序具有免疫力而使软件缺陷不被发现。? 软件测试的代价不容易掌握,因为随着测试量的增加,

测试成本将呈几何数级上升,而软件缺陷数量降低到某一数值之后将没有明显的变化,寻求最优测试点,掌握好测试工作量是至关重要的。? 在实际操作过程中,测试人员要进行正确的判断,合理的取舍,根据风险分析来决定哪些故障需要修复,哪些故障可以不修复,即并不是所有的软件缺陷都需要被修复。4.参考答案:软件测试是软件生命期中费用消耗最大的环节。测试费用除了测试的直接消耗外,还包括其他的相关费用。影响测试费用的主要因素有:软件的功能,软件产品需要达到的标准决定了测试的数量。对于那些至关重要的系统必须进行更多的测试。目标用户的数量,一个系统的目标用户数量的多少也在很大程度上影响了测试必要性的程度。潜在缺陷造成的影响在考虑测试的必要性时,还需要将系统中所包含的信息价值考虑在内。因此我们应该从经济方面考虑,投入与经济价值相对应的时间

软件测试技术基础教程习题解答

软件测试技术基础教程习 题解答 Last updated on the afternoon of January 3, 2021

一、选择题 1.软件测试的目的是C。 A.表明软件的正确性B.评价软件质量 C.尽可能发现软件中的错误D.判定软件是否合格 2.下面关于软件测试的说法,A是错误的。 A.软件测试是程序测试 B.软件测试贯穿于软件定义和开发的整个期间 C.需求规格说明、设计规格说明都是软件测试的对象 D.程序是软件测试的对象 3.某软件公司在招聘软件评测师时,应聘者甲向公司做如下保证: ①经过自己测试的软件今后不会再出现问题; ②在工作中对所有程序员一视同仁,不会因为在某个程序员编写的程序中发现的问题多,就重点审查该程序,以免不利于团结; ③承诺不需要其他人员,自己就可以独立进行测试工作; ④发扬咬定青山不放松的精神,不把所有问题都找出来,决不罢休; 你认为应聘者甲的保证B。 A.①、④是正确的B.②是正确的 C.都是正确的D.都不正确 4.软件测试的对象包括B。 A.目标程序和相关文档B.源程序、目标程序、数据及相关文档 C.目标程序、操作系统和平台软件D.源程序和目标程序

5.导致软件缺陷的原因有很多,①-④是可能的原因,其中最主要的原因包括D。 ①软件需求说明书编写的不全面,不完整,不准确,而且经常更改②软件设计说明书③软件操作人员的水平④开发人员不能很好的理解需求说明书和沟通不足 A.①、②、③B.①、③C.②、③D.①、④ 二、简答题 1.简述软件测试发展的历史及软件测试的现状。 参考答案: 软件测试是伴随着软件的产生而产生的。在软件行业发展初期,没有系统意义上的软件测试,更多的是一种类似调试的测试,测试用例的设计和选取也都是根据测试人员的经验随机进行的,大多数测试的目的是为了证明系统可以正常运行。 到了20世纪70年代以后,很多测试理论和测试方法应运而生,逐渐形成了一套完整的体系。在产业界,从20世纪70年代后期到20世纪80年代中期,很多软件企业成立了QA或者SQA 部门。后来QA的职能转变为流程监控(包括监控测试流程),而测试(Testing)则从QA中分离出来成为独立的组织职能。 到了20世纪80年代初期,一些软件测试的基础理论和实用技术开始形成,软件测试作为软件质量保证(SQA)的主要职能,包含软件质量评价的内容。软件测试已有了行业标准(IEEE/ANSI)。 在我国,软件测试目前还没有形成一个真正的产业,尚处于起步阶段。 但是,在国内,现在在软件测试行业中各种软件测试的方法、和标准都还在探索阶段。 总之,国内软件测试行业与一些发达国家相比还存在一定的差距。 2.简述软件缺陷在不同阶段发现错误修复的费用。 参考答案: 软件缺陷造成的修复费用随着时间的推移呈指数级地增长,如下图所示。 3.简述软件测试的复杂性。 参考答案: 软件测试的复杂性体现在: ?不可能对程序实现完全测试。 ?杀虫剂现象,即为了克服被测试软件的免疫力,软件测试员必须不断编写新的测试程序,对程序的各个部分进行不断测试,以避免被测试软件对单一的测试程序具有免疫力而使软件缺陷不被发现。 ?软件测试的代价不容易掌握,因为随着测试量的增加,测试成本将呈几何数级上升,而软件缺陷数量降低到某一数值之后将没有明显的变化,寻求最优测试点,掌握好测试工作量是至关重要的。 ?在实际操作过程中,测试人员要进行正确的判断,合理的取舍,根据风险分析来决定哪些故障需要修复,哪些故障可以不修复,即并不是所有的软件缺陷都需要被修复。 4.对软件测试的经济性进行总结和分析 参考答案: 软件测试是软件生命期中费用消耗最大的环节。测试费用除了测试的直接消耗外,还包括其

相关主题
文本预览
相关文档 最新文档