zoukankan      html  css  js  c++  java
  • [Assembly]汇编编写简易键盘记录器

    环境:
    Windows xp sp3
    工具:
    masm
    notepad++

    首先列出本次编程程序要执行的步骤:
    (1)、读取键盘所输入的字符
    (2)、输出到屏幕上
    (3)、完善Esc、Backspace、空格、回车的输出

    首先解决(1)
    这里我们可以利用int 16h的中断功能读取字符缓存区的字符

    mov ah,0
    int 16h

    执行完int 16h后 ah=扫描码 al=ASCII码

    例如我们输入abc后
    字符缓存区如下状态

    然后执行int 16h
    缓存区状态如下

    前面的1E61被读进了ah和al

    解决(2)
    既然解决了(1),也成功读取了ASCII码到al中
    这时候就是输出字符到屏幕上了

    这里可以用内存中的b800H~bffffH这段32KB的空间输出
    B800:0000就对应屏幕上第一列第一行了

    mov ax,0b800h
    mov es,ax
    mov ah,2
    mov al,41
    mov es:[si],ax
    add si,2

    高位存放该字符的属性 这里ah=2代码字符以绿色输出
    地位存放该字符的ASCII码 这里选择41H(A)来测试

    可以明显看到左上角屏幕出现了A

    最后可以编写出大概的程序如下;

    assume cs:code
    code segment
    start:
    mov cx,2h
    mov si,0
    ints:
    mov ah,0
    int 16h
    mov bl,al
    mov ax,0b800h
    mov es,ax
    mov al,bl
    mov ah,2
    mov es:[si],ax
    add si,2
    add cx,1
    loop ints
    mov ax,4c00h
    int 21h
    
    code ends
    end start

    执行完int16h之后就不断的往屏幕上输出,然后si+2指向下一个字符输出的屏幕地址

    随便输入几个字符,可以成功在屏幕上输出

    接下来优化下Esc、Backspace、空格、回车的输出
    根据上面的编程,已经知道程序是根据ASCII码到屏幕上输出的,可是Esc、Backspace、空格、回车的ASCII码不太明显
    这里用cmp指令判断Esc、Backspace、空格、回车的扫描码,然后再修改对应的al中的ASCII码
    程序如下

    assume cs:code
    code segment
    start:
    mov cx,2h
    mov si,0
    ints:
    mov ah,0
    int 16h
    cmp ah,1ch
    je ent
    cmp ah,39h
    je kg
    fh:mov bl,al
    mov ax,0b800h
    mov es,ax
    mov al,bl
    mov ah,2
    mov es:[si],ax
    add si,2
    add cx,1
    loop ints
    mov ax,4c00h
    int 21h
    
    ent:
    mov al,19h
    jmp fh
    kg:
    mov al,07h
    jmp fh
    
    code ends
    end start

    编译后我们依次输入Esc、空格、回车、Backspace

    可以看到屏幕出现了←(Esc)•(空格)↓(回车)◘(Backspace)


    最后附上各个键盘的扫描码

    注意,,程序中用了死循环!

  • 相关阅读:
    How to create jar for Android Library Project
    Very large tabs in eclipse panes on Ubuntu
    64bit Ubuntu, Android AAPT, R.java
    Linux(Ubuntu)下如何安装JDK
    Configure xterm Fonts and Colors for Your Eyeball
    建立、配置和使用Activity——启动其他Activity并返回结果
    建立、配置和使用Activity——使用Bundle在Activity之间交换数据
    建立、配置和使用Activity——启动、关闭Activity
    建立、配置和使用Activity——Activity
    异步任务(AsyncTask)
  • 原文地址:https://www.cnblogs.com/wh4am1/p/7708373.html
Copyright © 2011-2022 走看看