testdx,0f000h ………………④ http://www.paper51.com jnzgetK32Base paper51.com cmpecx,dword ptr 内容来自论文无忧网 www.paper51.com [ecx+edx+IMAGE_NT_HEADERS.OptionalHeader.ImageBase] copyright paper51.com jnzgetK32Base……………. ⑤ http://www.paper51.com mov[ebp+offset k32Base],ecx….. ⑥ 内容来自论文无忧网 www.paper51.com …… copyright paper51.com ① 将堆栈顶端的数据赋给ecx。 paper51.com ② 逐字节比较验证,也可以一页一页地搜。 内容来自论文无忧网 www.paper51.com ③ 就是ecx+3ch(比较方式类似判断PE文件的有效性第一步思想一致)。 内容来自www.paper51.com ④ Dos Header+stub值不会太大,不可能超过4096byte。 内容来自www.paper51.com ⑤ 看Image_Base值是否等于ecx即模块起始值。 copyright paper51.com ⑥ 如果是,就认为找到kernel32的Base值。 copyright paper51.com
2.利用Kerner32基地址来获取API函数地址 内容来自www.paper51.com
在参照了引出表结构之后,那么获得API函数地址的方法就不理解了。 内容来自www.paper51.com ⑴ 引出表的结构定义如下: 内容来自www.paper51.com 00H Characteristics 内容来自www.paper51.com 04H TimeDateStamp 文件生成时间 http://www.paper51.com
08H MajorVesion 主版本号 内容来自www.paper51.com 0AH MinerVesion 次版本号 http://www.paper51.com
0CH Name 指向DLL的名字 内容来自www.paper51.com 10H Base 开始的序号 paper51.com
14H NumberOfFunction AddressOfFunctions的项数 paper51.com 18H NumberOfNames AddressOfNames的项数 http://www.paper51.com 1CH AddressOfFunctions 指向函数地址的数组 copyright paper51.com 20H AddressOfNames 指向函数名称的地址的数组 内容来自www.paper51.com 24H AddressOfNameOrdinals 指向输入序列号的数组 内容来自论文无忧网 www.paper51.com 只要理解好最后5项的具体含义,那么搜索API地址的方法就显而易见了。AddressOfFunctions指向一个数组,这个数组的每个成员就指向了一个API函数的地址,也就是说我们只要从这个数组里获得了一个API函数的地址,那么我们就可以使用相应的API函数了,但里面的API函数地址是按数组存放的,那么我们要使用一个指定的API函数,就必须知道该API函数在数组中的具体的位置,也就是一个索引号。 内容来自论文无忧网 www.paper51.com 上面说的这个索引号则需要表中的最后2项来获得,AddressOfNames与AddressOfNameOrdinals指向2个数组,一个是函数名字的数组,一个是函数名称的数组,一个是函数名字所对应的索引号的数组,这2个数组是一一对应的,也就是说,如果第一个数组中的第M项是我们要查找的函数的名字,那么第二个数组中的第M项就是该函数的索引号。这样我们就可以通过在第一个数组中查找我们需要查找的函数的名字,如果查到,便记住该项目在数组中的位置,然后再到第二个数组中相同位置就可以获得该函数在AddressOfFunctions中的索引号了。 paper51.com 解决以上问题后,我们就知道了如何利用引出表的结构来查找我们需要的函数地址了。但我们还得需要获得引出表的结构的地址,其实方法也比较简单,PE文件中可选映像头中60H有一个数据目录表DataDirectory[],该目录表的第一个数据目录就存放了导出表结构的地址。 paper51.com
⑵ 已知API函数名称利用Kernel32 Base来获取函数地址的方法 http://www.paper51.com ①定位到PE文件头。 http://www.paper51.com ②从PE文件头中的可选文件头中取出数据目录表的第一个数据目录,得到导出表的地址。 http://www.paper51.com ③从导出表的NumberOfNames字段得到以命名函数的总数,并以这个数字做微循环的次数来构造一个循环。 http://www.paper51.com ④从AddressOfNames字段指向的函数名称地址表的第一项开始,在循环中将每一项定义的函数名与要查找的函数名比较,如果没有任何一个函数名符合,说明文件中没有指定名称的函数。 http://www.paper51.com
⑤如果某一项定义的函数名与要查找的函数名符合,那么记住这个函数名在字符串地址表中的索引值(如x),然后在AddressOfNameOrdinals指向的数组中以同样的索引值x去找数组项中的值,假如该值为m。 内容来自www.paper51.com ⑥以m值作为索引值,在AddressOfFunctions字段指向的函数入口地址表中获取的RVA就是函数的入口地址,当函数被装入内存后,这个RVA值加上模块实际装入的基址(ImageBase),就得到了函数真正的入口地址。对于病毒来说,通常是通过API函数名称来查找API函数地址。 http://www.paper51.com 3.2.5文件操作 http://www.paper51.com
3.2.5.1关于文件搜索 copyright paper51.com 1.文件搜索函数 copyright paper51.com 搜索文件是病毒寻找目标文件的非常重要的功能。在Win32汇编中,通常采用三个API函数进行文件搜索。 copyright paper51.com ① FindFirstFile 该函数根据文件名查找文件。 http://www.paper51.com
② FindNextFile 该函数根据调用FindFirstFile函数时指定的一个文件名查找下一个文件。 copyright paper51.com ③ FindClose 该函数用来关闭由FindFirstFile函数创建的一个搜索句柄。 copyright paper51.com 2.文件搜索算法 copyright paper51.com 文件搜索一般采用递归算法进行搜索,也可以采用非递归搜索方法,这里我们仅介绍递归的算法 内容来自论文无忧网 www.paper51.com
FindFile Proc http://www.paper51.com ①指定找到的目录为当前工作目录。 内容来自论文无忧网 www.paper51.com ②开始搜索文件(*.*)。 内容来自www.paper51.com ③该目录搜索完毕?是则返回,否则继续。 http://www.paper51.com ④找到文件还是目录?是目录则调用自身函数FindFile,否则继续。 paper51.com ⑤是文件,如符合感染条件,则调用感染模块,否则继续。 http://www.paper51.com ⑥搜索下一个文件(FindNextFile),转到③继续。 copyright paper51.com
FindFile Endp 内容来自www.paper51.com 3.2.5.2内存映射文件 http://www.paper51.com 内存映射文件提供了一组独立的函数,是应用程序能够通过内存指针像访问内存一样对磁盘上的文件进行访问。这组内存映射文件函数将磁盘上的文件的全部或者部分映射到进程虚拟地址空间的某个位置,以后对文件内容的访问就如同在该地址区域内直接对内存访问一样简单。这样,对文件中数据的操作便是直接对内存进行操作,大大地提高了访问的速度,这对于计算机病毒来说,对减少资源占有是非常重要的。 http://www.paper51.com 1.内存映射文件函数 copyright paper51.com ① CreateFileMapping该函数用来创建一个新的文件映射对象。 http://www.paper51.com
② MapViewOfFile 该函数将一个文件映射对象映射到当前应用程序的地址空间。 paper51.com ③ UnMapViewOfFile 该函数在当前应用程序的内存地址空间解除对一个文件映射对象的映射。 内容来自论文无忧网 www.paper51.com
④ CloseHandle 该函数用来关闭一个内核对象,其中包括文件、文件映射、进程、线程、安全和同步对象等。 copyright paper51.com 2.内存映射文件方法 copyright paper51.com 在计算机病毒中,通常采用如下几个步骤: http://www.paper51.com
① 调用CreateFile函数打开想要映射的HOST程序,返回文件句柄hFile。 http://www.paper51.com ② 调用CreateFileMapping函数生成一个建立基于HOST文件句柄hFile的内存映射对象,返回内存映射对象句柄hMap。 http://www.paper51.com ③ 调用MapViewOfFile函数将整个文件(一般还要加上病毒体的大小)映射到内存中。得到指向映射到内存的第一个字节的指针(pMem)。 内容来自论文无忧网 www.paper51.com ④ 用刚才得到的指针pMem对整个HOST文件进行操作,对HOST程序进行病毒感染。 http://www.paper51.com ⑤ 调用UnmapViewFile函数解除文件映射,传入参数是pMem。 内容来自论文无忧网 www.paper51.com
⑥ 调用CloseHandle来关闭内存映射文件,传入参数是hMap。 内容来自www.paper51.com ⑦ 调用CloseHandle来关闭HOST文件,传入参数是hFile。 http://www.paper51.com |