内存驻留一般用于病毒等, 在dos下, 他们被激活的方式一般是使用截获中断, 弄了好几天参考别的程序, 我写了自己的一个内存驻留, 说简单也简单, 可我知道, 里面还有不少我要弄清楚的。
assume cs:code
code segment
org 100H
start:
jmp init
INT9H dd ?
TSR:
push ax ; 保存所有用到的寄存器
push es
push di
push cx
mov ax, 0b800H
mov es, ax
mov di, 1
in al, 60H
cmp al, 3bH
jnz tsrexit
mov ah, 02H
int 1aH
mov al, dh
mov cx, 2000
s:
mov es:[di], al
add di, 2
loop s
tsrexit:
pop cx
pop di
pop es
pop ax
jmp cs:INT9H
init:
mov ax, cs
mov ds, ax
cli
mov ax, 3509H
int 21H
mov word ptr INT9H, bx
mov word ptr INT9H + 2, es
mov ax, 2509H
lea dx, TSR
int 21H
sti
lea dx, init ; 取从驻留程序的偏移量
add dx, 15 ; 把偏移量转换成节,一节是16字节
mov cl, 4
shr dx, cl
mov ax, 3100H
int 21H
code ends
end start
assume cs:code
code segment
ORG 100H
start:
JMP init
INT1C DD ?
SEC DW ?
TSR:
PUSH AX
PUSH BX
PUSH CX
PUSH DX
PUSH BP
PUSH DS
PUSH ES ;保存所用到的寄存器
MOV AX, CS
MOV DS, AX
MOV ES, AX ;把CS的值赋给DS和ES
MOV AH, 2H
INT 1AH ;读取当前时间
MOV DL, DH
AND DH, 0FH
MOV CL, 4
SHR DL, CL
ADD DX, 3030H
MOV SEC, DX ;把当前秒数转化成字符串
MOV AH, 13H
MOV AL, 0
MOV BH, 0
MOV BL, 7
MOV CX, 2
MOV DX, 004EH ;指定显示位置为(0,0)
LEA BP, SEC
INT 10H ;在指定位置显示秒数
POP ES ;恢复所用寄存器的值
POP DS
POP BP
POP DX
POP CX
POP BX
POP AX
JMP CS:INT1C ;转向中断1CH原服务程序
init:
mov ax, cs
mov ds, ax
mov es, ax
CLI ; 关闭中断
MOV AX, 351CH ; 取1cH的中断向量
INT 21H
MOV word ptr INT1C, BX ; 保存在这个位置
MOV word ptr INT1C+2, ES ; es:bx
MOV AX, 251CH ; 设置中断向量
LEA DX, TSR ; ds:dx为中断向量
INT 21H
STI ; 打开中断
LEA DX, init
ADD DX, 15
MOV CL, 4 ;把init的偏移量转换成“节数”
SHR DX, CL ;每节内有16个字节
MOV AX, 3100H
INT 21H
code ends
END start
我很累, 不解释了, 去休息会
- [chervy] 我还是初学汇编的。 我学着弄了一遍,接下来怎么弄呢?谢谢。 09/17 17:24
- [ghi] 先收藏了 以后再看 哈哈 好东西都得看见就收藏了 07/02 22:06
- [wuerlang] 我也收藏. 也许用来研究学习汇编的时候有用. 至于研究病毒,倒不觉得有什么兴趣. 12/25 17:24
- [happy] 学习了! 10/22 20:19
- [happy] 厉害! 10/22 20:07
- [happy] 不错,支持一下 10/22 20:05
- [goal00001111] 很不错,收藏了。 10/21 12:51
- [dreamhk] 博主可否把病毒文件加密码virus压缩发送到 rar.virus@gmail.com 谢谢,我没有 10/20 21:27
- [jyycool] 呵呵,不错强啊,我还不行,我想最多半个月,我就可以看的懂了 10/20 19:48