[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)
最后附上各个键盘的扫描码
注意,,程序中用了死循环!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· winform 绘制太阳,地球,月球 运作规律
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 上周热点回顾(3.3-3.9)