程序中关于变量的引用,和函数的调用
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是操作数。可以知道操作数是一个绝对地址。
在进行函数调用的时候
13E7:0068 E80400 CALL 006F
你可能会以为call 006f是通过绝对地址来进行函数的调用的。
可是这是反汇编之后的,是经过加工了的。
我们要看的是操作码和操作数,在该指令中
操作码是e8,操作数是0400(也就是4),可见是相对于
13E7:006B B44C MOV AH,4C(call 006f的下一条语句)的指令偏移。
这些知识都是写COM之类病毒的最基本的知识
附:函数的调用分为near,short,far.
short最惨,被调用的函数和调用点只能有128字节的偏移量。
near可以达到64k(可以调用本段的函数),随意对于COM足够用了。
far则可以调用任意段的函数。
上一篇:如何优化C语言代码
下一篇:PC与单片机USB(D12)数据通讯过程描述
推荐阅读最新更新时间:2024-03-16 13:52