说起“感染技术”,一般印象里都是——感染文件,准确说,是“感染可执行文件”。事实上,除了文件感染,也可以是“进程感染”,也就是“进程注入”。但是相比而言,文件感染古老多了——早在单进程环境的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