汇编网首页登录博客注册
mnzn2530的学习博客
博客首页博客互动【做检测题】论坛求助

我的博客

个人首页 |  我的文章 |  我的相册 |  我的好友 |  最新访客 |  文章收藏 |  论坛提问 |  友情链接 |  给我留言  

[2007-10-22 16:27] 2个内存驻留程序

内存驻留一般用于病毒等, 在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 

我很累, 不解释了, 去休息会
评论次数(1)  |  浏览次数(1283)  |  类型(默认类型) |  收藏此文  | 

[  happy   发表于  2007-10-22 20:07  ]

厉害!

 
 请输入验证码  (提示:点击验证码输入框,以获取验证码