程序中關于變量的引用,和函數(shù)的調用
cseg segment
assume cs:cseg,ds:cseg
org 100
start:
mov bx,word ptr aaa
virus_start:
call get_start
mov ah,4ch
int 21h
get_start:
mov ax,offset virus_start
ret
aaa db ''abcd'',0
cseg ends
end start
上面的程序進行反匯編之后。
-u
13E7:0064 8B1E7300 MOV BX,[0073]
13E7:0068 E80400 CALL 006F
13E7:006B B44C MOV AH,4C
13E7:006D CD21 INT 21
13E7:006F B86800 MOV AX,0068
13E7:0072 C3 RET
13E7:0073 61 DB 61
13E7:0074 62 DB 62
13E7:0075 63 DB 63
13E7:0076 64 DB 64
可以看到程序引用變量aaa的時候,是通過絕對地址進行引用的。
13E7:0064 8B1E7300 MOV BX,[0073]
8b1e 是操作碼,7300是操作數(shù)。可以知道操作數(shù)是一個絕對地址。
在進行函數(shù)調用的時候
13E7:0068 E80400 CALL 006F
你可能會以為call 006f是通過絕對地址來進行函數(shù)的調用的。
可是這是反匯編之后的,是經過加工了的。
我們要看的是操作碼和操作數(shù),在該指令中
操作碼是e8,操作數(shù)是0400(也就是4),可見是相對于
13E7:006B B44C MOV AH,4C(call 006f的下一條語句)的指令偏移。
這些知識都是寫COM之類病毒的最基本的知識
附:函數(shù)的調用分為near,short,far.
short最慘,被調用的函數(shù)和調用點只能有128字節(jié)的偏移量。
near可以達到64k(可以調用本段的函數(shù)),隨意對于COM足夠用了。
far則可以調用任意段的函數(shù)。