当前位置:文档之家› 信安综合实习报告

信安综合实习报告

(6)得到目前最后节表的末尾偏移(紧接其后用于写入一个新的病毒节)节表起始位置+节的个数*(每个节表占用的字节数28H)=目前最后节表的末尾偏移。
(7)写入节表和修改PE文件其他相关首部
①写入节名(8字节)。
②写入节的实际字节数(4字节)。
③写入新节在内存中的开始偏移地址(4字节),同时可以计算出病毒入口位置。上节在内存中的开始偏移地址+(上节大小/节对齐+1)×节对齐=本节在内存中的开始偏移地址。
(3)通过PEB相关数据结构获取。fs:[0]指向TEB结构,首先从fs:[30h]获得PEB地址,然后通过PEB[0x0c]获得PEB_LDR_DATA数据结构地址,然后通过从PEB_LDR_DATA[0x1c]获取地址,最后在Flink[0x08]中得到模块的基地址。这种方法比较通用,适用于2K/XP/2003。在Exploit的编写中,也通常采用这种方式。
(7) FlushFileBuffers该函数将指定的文件句柄对应文件的缓冲区的所有内容写入到文件之中,并刷新内部文件缓冲区。
为了提高自己的生存能力,病毒是不应该破坏HOST程序的,既然如此,病毒应该在病毒执行完毕后,立刻将控制权交给HOST程序,病毒如何做到这一点呢
返回HOST程序相对来说比较简单,病毒在修改被感染文件代码开始执行位置(AddressOfEntryPoint)时,会保存原来的值,这样,病毒在执行完病毒代码之后用一个跳转语句跳到这段代码处继续执行即可。
WIN32_FIND_DATA结构中存放着找到的文件的详细信息,具体结构如下所示:
WIN32_FIND_DATA STRUCT
dwFileAttributes DWORD
③该目录搜索完毕是则返回,否则继续
④找到文件还是目录是目录则调用自身函数FindFile,否则继续
⑤是文件,如符合感染条件,则调用感染模块,否则继续
FindNextFile:该函数根据调用FindFirstFile函数时指定的一个文件名查找下一个文件,返回值非零表示成功,零表示失败。如不再有与指定条件相符的文件,会将GetLastError设置成ERROR_NO_MORE_FILES。
FindClose:该函数用来关闭由FindFirstFile函数创建的一个搜索句柄,返回值非零表示成功,零表示失败。会设置GetLastError。
④用刚才得到的指针pMem对整个HOST文件进行操作,对HOST程序进行病毒感染。
⑤调用UnmapViewFile函数解除文件映射,传入参数是pMem。
⑥调用CloseHandle来关闭内存映射文件,传入参数是hMap。
⑦调用CloseHandle来关闭HOST文件,传入参数是hFile。
PE病毒感染其他文件的方法之一是在文件中添加一个新节,然后往该新节中添加病毒代码和病毒执行后的返回Host程序的代码,并修改文件头中代码开始执行位置(AddressOfEntryPoint)指向新添加的病毒节的代码入口,以便程序运行后先执行病毒代码。下面我们具体分析一下感染文件步骤(这种方法将会在后面的例子中有具体代码介绍)。
④写入本节(即病毒节)在文件中对齐后的大小。
⑤写入本节在文件中的开始位置。上节在文件中的开始位置+上节对齐后的大小=本节(即病毒)在文件中的开始位置。
⑥修改映像文件头中的节表数目。
⑦修改AddressOfEntryPoint(即程序入口点指向病毒入口位置),同时保存旧的AddressOfEntryPoint,以便返回HOST继续执行。
以下代码通常用于重定位:
call delta ;这条语句执行之后,堆栈顶端为delta在内存中的真正地址
delta: pop ebp ;这条语句将delta在内存中的真正地址存放在ebp寄存器中
lea eax,[ebp+(offset var1-offset delta)];这时eax中存放着var1在内存中的真实地址
在计算机病毒中,通常采用如下几个步骤:
①调用CreateFile函数打开想要映射的HOST程序,返回文件句柄hFile。
②调用CreateFileMapping函数生成一个建立基于HOST文件句柄hFile的内存映射对象,返回内存映射对象句柄hMap。
③调用MapViewOfFile函数将整个文件(一般还要加上病毒体的大小)映射到内存中。得到指向映射到内存的第一个字节的指针(pMem)。
(2) SetFilePointer该函数在一个文件中设置当前的读写位置。
(3) ReadFile该函数用来从文件中读取数据。
(4) WriteFile该函数用来将数据写入文件。
(5) SetEndOfFile该函数针对一个打开的文件,将当前文件位置设为文件末尾。
(6) GetFileSize该函数用来返回指定文件的长度。。
③从导出表的NumberOfNames字段得到以命名函数的总数,并以这个数字做微循环的次数来构造一个循环。
④从AddressOfNames字段指向的函数名称地址表的第一项开始,在循环中将每一项定义的函数名与要查找的函数名比较,如果没有任何一个函数名符合,说明文件中没有指定名称的函数。
⑤如果某一项定义的函数名与要查找的函数名符合,那么记住这个函数名在字符串地址表中的索引值(如x),然后在AddressOfNameOrdinals指向的数组中以同样的索引值x去找数组项中的值,假如该值为m。
有感染能力的病毒,可能有的病毒具有自动能力,但一般没有破坏性)。
一个Win32 PE病毒基本上需要具有以下几个功能,或者说需要解决如下几个问题。
call指令一般用来调用一个子程序或用来进行转跳,当这个语句执行的时候,它会先将返回地址(即紧接着call语句之后的那条语句在内存中的真正地址)压入堆栈,然后将IP置为call语句所指向的地址。当子程序碰到ret命令后,就会将堆栈顶端的地址弹出来,并将该地址存放在IP中,这样,主程序就得以继续执行。
信安综合实习报告
PE

(1)掌握PE病毒的传播原理。
(2)掌握MASM编译工具的使用。
(3)掌握Ollydbg调试工具的使用。

(1)Windows桌面系统。
(2) MASM32。
(3)Ollydbg调试工具。
(4)Stup_PE等PE文件修改工具。

本节主要介绍PE病毒的基本原理。本节中的例子均属于概念病毒(概念病毒主要是具
当pop语句执行完毕之后,ebp中存放病毒程序中标号delta处在内存中的真正地址。如果病毒程序中有一个变量var1,那么该变量在内存中的实际地址应该是ebp+(offsetvar1-offset delta),即“参考量delta在内存中的地址+其它变量与参考量之间的距离=其它变量在内存中的真正地址”。有时候我们也采用(ebp-offset deltaห้องสมุดไป่ตู้+offset var1的形式进行变量var1的重定位。当然还有其它重定位的方法,但是它们的原理基本上都是一样的。
(9)将当前文件位置设为文件末尾。
(1) CreateFile该函数可打开和创建文件、管道、邮槽、通信服务、设备以及控制台,如执行成功,则返回值为文件句柄。返回值INVALID_HANDLE_VALUE则表示出错。即使函数成功,但若文件存在,且指定了CREATE_ALWAYS或OPEN_ALWAYS,GetLastError也会设为ERROR_ALREADY_EXISTS。
搜索目标文件是病毒技术中一个非常重要的功能。在Win32汇编中,通常用到了几个关键的API函数和一个WIN32_FIND_DATA结构:
FindFirstFile:该函数根据文件名查找文件,如果该函数执行成功,其返回一个搜索句柄。如果出错,返回一个INVALID_HANDLE_VALUE常数,一旦不再需要,应该用FindClose函数关闭这个句柄。
(1)判断目标文件开始的两个字节是否为“MZ”。
(2)判断PE文件标记“PE”。
(3)判断感染标记,如果已被感染过则跳出继续执行HOST程序,否则继续。
(4)获得Directory(数据目录)的个数,(每个数据目录信息占8个字节)。
(5)得到节表起始位置。(Directory的偏移地址+数据目录占用的字节数=节表起始位置)
⑥以m值作为索引值,在AddressOfFunctions字段指向的函数入口地址表中获取的RVA就是函数的入口地址,当函数被装入内存后,这个RVA值加上模块实际装入的基址(ImageBase),就得到了函数真正的入口地址。
对病毒来说,通常是通过API函数名称来查找API函数地址。找到某一函数名称之后,可以通过与目标函数名直接进行字符串比较来判断是否找到所需要的函数;也可以事先对API函数名称进行相关计算得到一个特征值,以后每次找到某一函数名称之后,对该函数名称用同样的算法计算特征值,如果两值相等,则说明找到需要的目标函数。后者相对而言节省了空间,但可能耗费更多时间。
⑧更新SizeOfImage(内存中整个PE映像尺寸=原SizeOfImage+病毒节经过内存节对齐后的大小)。
⑨写入感染标记(后面例子中是放在PE头中)。
(8)写入病毒代码到新添加的节中。
ECX =病毒长度
ESI =病毒代码位置(并不一定等于病毒执行代码开始位置)
EDI=病毒节写入位置(后面例子是在内存映射文件中的相应位置)
⑥搜索下一个文件(FindNextFile),转到C继续FindFile Endp
内存映射文件提供了一组独立的函数,这组内存映射文件函数将磁盘上的文件的全部或者部分映射到进程虚拟地址空间的某个位置,以后对文件内容的访问就如同在该地址区域内直接对内存访问一样简单。这样,对文件中数据的操作便是直接对内存进行操作,大大地提高了访问的速度,这对于计算机病毒来说,对减少资源占有是非常重要的。
如何获取API函数地址一直是病毒技术中的一个非常重要的话题。要获得API函数地址,我们首先需要获得Kernel32的基地址。
相关主题