信安综合实习报告.docx
![资源得分’ title=](/images/score_1.gif)
![资源得分’ title=](/images/score_1.gif)
![资源得分’ title=](/images/score_1.gif)
![资源得分’ title=](/images/score_1.gif)
![资源得分’ title=](/images/score_05.gif)
《信安综合实习报告.docx》由会员分享,可在线阅读,更多相关《信安综合实习报告.docx(38页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、目录PE 病毒实验4一 实验目的4二 实验准备4三 预备知识43.1 病毒的重定位43.2 获取API函数地址53.3 文件搜索73.4 内存映射文件83.5 病毒如何通过添加新节感染其他文件93.5.1 感染文件的基本步骤93.5.2 文件操作相关API 函数103.6 病毒如何返回到Host程序11四 实验内容11完全脆弱图像水印17一 实验目的17二 实验环境17三 原理简介17四 实验步骤184.1Checksum水印嵌入184.2判断图像是否被修改或篡改21五 实验总结23联想网御N3000 IDS24一 实验目的及要求24二 实验环境24三 实验基础243.1产品组成及环境243.
2、1.1产品的组成243.1.2系统要求253.2安装前注意事项25四 实验步骤264.1安装控制台264.1.1 控制台安装位置264.1.2 架构网络环境264.1.3控制台安装步骤264.1.4 确认控制台安装314.2安装探测器324.2.1探测器的安装位置324.2.2 探测器安装前准备324.2.3安装探测器(配置IP地址和路由)334.3配置探测器354.4控制台的设置364.4.1生成完整性值364.4.2管理员登录364.4.3 注册探测器364.5实施网络监测37PE 病毒实验一 实验目的(1)掌握PE 病毒的传播原理。(2)掌握MASM 编译工具的使用。(3)掌握Ollyd
3、bg 调试工具的使用。二 实验准备(1)Windows 桌面系统。(2) MASM32。(3)Ollydbg 调试工具。(4)Stup_PE 等PE 文件修改工具。三 预备知识本节主要介绍PE 病毒的基本原理。本节中的例子均属于概念病毒(概念病毒主要是具有感染能力的病毒,可能有的病毒具有自动能力,但一般没有破坏性)。一个Win32 PE 病毒基本上需要具有以下几个功能,或者说需要解决如下几个问题。3.1 病毒的重定位call 指令一般用来调用一个子程序或用来进行转跳,当这个语句执行的时候,它会先将返回地址(即紧接着call 语句之后的那条语句在内存中的真正地址)压入堆栈,然后将IP 置为cal
4、l 语句所指向的地址。当子程序碰到ret 命令后,就会将堆栈顶端的地址弹出来,并将该地址存放在IP 中,这样,主程序就得以继续执行。以下代码通常用于重定位:call delta ;这条语句执行之后,堆栈顶端为delta 在内存中的真正地址delta: pop ebp ;这条语句将delta 在内存中的真正地址存放在ebp 寄存器中lea eax,ebp+(offset var1-offset delta);这时eax 中存放着var1 在内存中的真实地址当pop 语句执行完毕之后,ebp 中存放病毒程序中标号delta 处在内存中的真正地址。如果病毒程序中有一个变量var1,那么该变量在内存中
5、的实际地址应该是ebp+(offsetvar1-offset delta),即“参考量delta 在内存中的地址+其它变量与参考量之间的距离=其它变量在内存中的真正地址”。有时候我们也采用(ebp-offset delta)+offset var1的形式进行变量var1 的重定位。当然还有其它重定位的方法,但是它们的原理基本上都是一样的。3.2 获取API函数地址如何获取API 函数地址一直是病毒技术中的一个非常重要的话题。要获得API 函数地址,我们首先需要获得Kernel32 的基地址。下面介绍几种获得Kernel32 基地址的方法:(1) 利用程序的返回地址,在其附近搜索KERNEL32
6、 模块基地址。系统打开一个可执行文件时,它会调用Kernel32.dll 中的CreateProcess 函数,CreateProcess 函数在完成应用程序装载后,会先将返回地址压入到堆栈顶端,然后转向执行刚才装载的应用程序。当该应用程序结束后,会将返回地址弹出放到EIP 中,继续执行。而这个返回地址正处于Kernel32.dll 的地址空间之中。这样,利用PE 文件格式的相关特征(如03CH 偏移处内容存放着“PE”标志的内存地址等),在此地址的基础上往低地址方向逐渐搜索,必然可以找到KERNEL32.DLL 模块的首地址。不过这种暴力搜索方法比较费时,并且可能会碰到一些异常情况。(2)
7、通过SEH 链获得KERNEL32 模块内地址遍历SEH 链,在链中查找prev 成员等于0xFFFFFFFF 的EXCEPTION_REGISTER 结构,该结构中handler 值指向系统异常处理例程,它总是位于KERNEL32 模块中!根据这一特性,然后配合类似(1)的向前搜索方法就可以查找KERNEL32.DLL 在内存中的基地址。(3) 通过PEB 相关数据结构获取。fs:0指向TEB 结构,首先从fs:30h获得PEB 地址,然后通过PEB0x0c获得PEB_LDR_DATA 数据结构地址, 然后通过从PEB_LDR_DATA0x1c 获取InInitializationOrder
8、ModuleList.Flink 地址,最后在Flink0x08中得到KERNEL32.DLL模块的基地址。这种方法比较通用,适用于2K/XP/2003。在Exploit 的编写中,也通常采用这种方式。(4) 对相应操作系统分别给出固定的KERNEL32 模块的基地址,对于不同的Windows 操作系统来说,KERNEL32 模块的地址是固定的,甚至一些API 函数的大致位置都是固定的。譬如,Windows 98 为BFF70000,Windows 2000 为77E80000,WindowsXP 为77E60000。病毒在先对目标操作系统进行大致判断之后,可以直接使用相关KERNEL32模块
9、的基地址。在得到了Kernel32 的模块地址以后,我们就可以在该模块中搜索我们所需要的API 地址。对于给定的API,搜索其地址可以直接通过Kernel32.dll 的引出表信息搜索,同样我们也可以先搜索出GetProcAddress 和LoadLibrary 两个API 函数的地址,然后利用这两个API 函数得到我们所需要的API 函数地址。关于各个关键项的具体含义我们在课本PE 文件格式一节中详细描述过,这里不再重复。解决了以上问题之后,我们就知道如何从引出表结构查找我们需要函数的地址了。下面给出已知API 函数的函数名搜索API 函数地址的过程:定位到PE 文件头。从PE 文件头中的可
10、选文件头中取出数据目录表的第一个数据目录,得到导出表的地址。从导出表的NumberOfNames 字段得到以命名函数的总数,并以这个数字做微循环的次数来构造一个循环。从AddressOfNames 字段指向的函数名称地址表的第一项开始,在循环中将每一项定义的函数名与要查找的函数名比较,如果没有任何一个函数名符合,说明文件中没有指定名称的函数。如果某一项定义的函数名与要查找的函数名符合,那么记住这个函数名在字符串地址表中的索引值(如x),然后在AddressOfNameOrdinals 指向的数组中以同样的索引值x 去找数组项中的值,假如该值为m。以m 值作为索引值,在AddressOfFunc
11、tions 字段指向的函数入口地址表中获取的RVA就是函数的入口地址,当函数被装入内存后,这个RVA 值加上模块实际装入的基址(ImageBase),就得到了函数真正的入口地址。对病毒来说,通常是通过API 函数名称来查找API 函数地址。找到某一函数名称之后,可以通过与目标函数名直接进行字符串比较来判断是否找到所需要的函数;也可以事先对API 函数名称进行相关计算得到一个特征值,以后每次找到某一函数名称之后,对该函数名称用同样的算法计算特征值,如果两值相等,则说明找到需要的目标函数。后者相对而言节省了空间,但可能耗费更多时间。3.3 文件搜索搜索目标文件是病毒技术中一个非常重要的功能。在Wi
12、n32 汇编中,通常用到了几个关键的API 函数和一个WIN32_FIND_DATA 结构:FindFirstFile:该函数根据文件名查找文件,如果该函数执行成功,其返回一个搜索句柄。如果出错,返回一个INVALID_HANDLE_VALUE 常数,一旦不再需要,应该用FindClose函数关闭这个句柄。FindNextFile:该函数根据调用FindFirstFile 函数时指定的一个文件名查找下一个文件,返回值非零表示成功,零表示失败。如不再有与指定条件相符的文件,会将GetLastError设置成ERROR_NO_MORE_FILES。FindClose:该函数用来关闭由FindFir
13、stFile 函数创建的一个搜索句柄,返回值非零表示成功,零表示失败。会设置GetLastError。WIN32_FIND_DATA 结构中存放着找到的文件的详细信息,具体结构如下所示:WIN32_FIND_DATA STRUCTdwFileAttributes DWORD ? /文件属性,/如果改值为FILE_ATTRIBUTE_DIRECTORY,则说明是目录ftCreationTime FILETIME /文件创建时间ftLastAccessTime FILETIME /文件或目录的访问时间ftLastWriteTime FILETIME /文件最后一次修改时间,对于目录是创建时间nFi
14、leSizeHigh DWORD ? /文件大小的高位nFileSizeLow DWORD ? /文件大小的地位dwReserved0 DWORD ? /保留dwReserved1 DWORD ? /保留cFileName BYTE MAX_PATH dup(?) /文件名字符串,以0 结尾cAlternate BYTE 14 dup(?) /8.3 格式的文件名WIN32_FIND_DATA ENDS通过该结构的第一个字段,我们可以判断该找到的文件是目录还是文件,通过cFileName 我们可以获得该文件的文件名,继而可以对找到的文件进行操作。文件搜索一般采用递归算法进行搜索,也可以采用非递
15、归搜索方法,这里我们仅介绍第一种算法:FindFile Proc指定找到的目录为当前工作目录开始搜索文件(*.*)该目录搜索完毕?是则返回,否则继续找到文件还是目录?是目录则调用自身函数FindFile,否则继续是文件,如符合感染条件,则调用感染模块,否则继续搜索下一个文件(FindNextFile),转到C 继续FindFile Endp3.4 内存映射文件内存映射文件提供了一组独立的函数,这组内存映射文件函数将磁盘上的文件的全部或者部分映射到进程虚拟地址空间的某个位置,以后对文件内容的访问就如同在该地址区域内直接对内存访问一样简单。这样,对文件中数据的操作便是直接对内存进行操作,大大地提高
16、了访问的速度,这对于计算机病毒来说,对减少资源占有是非常重要的。在计算机病毒中,通常采用如下几个步骤:调用CreateFile 函数打开想要映射的HOST 程序,返回文件句柄hFile。调用CreateFileMapping 函数生成一个建立基于HOST 文件句柄hFile 的内存映射对象,返回内存映射对象句柄hMap。调用MapViewOfFile 函数将整个文件(一般还要加上病毒体的大小)映射到内存中。得到指向映射到内存的第一个字节的指针(pMem)。用刚才得到的指针pMem 对整个HOST 文件进行操作,对HOST 程序进行病毒感染。调用UnmapViewFile 函数解除文件映射,传入
17、参数是pMem。调用CloseHandle 来关闭内存映射文件,传入参数是hMap。调用CloseHandle 来关闭HOST 文件,传入参数是hFile。3.5 病毒如何通过添加新节感染其他文件PE 病毒感染其他文件的方法之一是在文件中添加一个新节,然后往该新节中添加病毒代码和病毒执行后的返回Host 程序的代码, 并修改文件头中代码开始执行位置(AddressOfEntryPoint)指向新添加的病毒节的代码入口,以便程序运行后先执行病毒代码。下面我们具体分析一下感染文件步骤(这种方法将会在后面的例子中有具体代码介绍)。3.5.1 感染文件的基本步骤(1)判断目标文件开始的两个字节是否为“
18、MZ”。(2)判断PE 文件标记“PE”。(3)判断感染标记,如果已被感染过则跳出继续执行HOST 程序,否则继续。(4)获得Directory(数据目录)的个数,(每个数据目录信息占8 个字节)。(5)得到节表起始位置。(Directory 的偏移地址+数据目录占用的字节数=节表起始位置)(6)得到目前最后节表的末尾偏移(紧接其后用于写入一个新的病毒节)节表起始位置+节的个数*(每个节表占用的字节数28H)=目前最后节表的末尾偏移。(7)写入节表和修改PE 文件其他相关首部写入节名(8 字节)。写入节的实际字节数(4 字节)。写入新节在内存中的开始偏移地址(4 字节),同时可以计算出病毒入口
19、位置。上节在内存中的开始偏移地址+(上节大小/节对齐+1)节对齐=本节在内存中的开始偏移地址。写入本节(即病毒节)在文件中对齐后的大小。写入本节在文件中的开始位置。上节在文件中的开始位置+上节对齐后的大小=本节(即病毒)在文件中的开始位置。修改映像文件头中的节表数目。修改AddressOfEntryPoint(即程序入口点指向病毒入口位置),同时保存旧的AddressOfEntryPoint,以便返回HOST 继续执行。更新SizeOfImage(内存中整个PE 映像尺寸=原SizeOfImage+病毒节经过内存节对齐后的大小)。写入感染标记(后面例子中是放在PE 头中)。(8)写入病毒代码到
20、新添加的节中。ECX =病毒长度ESI =病毒代码位置(并不一定等于病毒执行代码开始位置)EDI=病毒节写入位置(后面例子是在内存映射文件中的相应位置)(9)将当前文件位置设为文件末尾。3.5.2 文件操作相关API 函数(1) CreateFile该函数可打开和创建文件、管道、邮槽、通信服务、设备以及控制台,如执行成功,则返回值为文件句柄。返回值INVALID_HANDLE_VALUE 则表示出错。即使函数成功,但若文件存在, 且指定了CREATE_ALWAYS 或 OPEN_ALWAYS , GetLastError 也会设为ERROR_ALREADY_EXISTS。(2) SetFile
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 综合 实习 报告
![提示](https://www.taowenge.com/images/bang_tan.gif)
限制150内