使用中断处理程序实现loop功能
思路:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 | assume cs:code code segment start: mov ax, 0b800h mov es, ax mov di, 160*12 mov bx, offset s-offset se mov cx, 80 s: mov byte ptr es:[di], '!' add di, 2 int 7ch se: nop mov ax, 4c00h; int 21h code ends end start 在7ch中断处理程序中,需要返回到s处来完成循环 在跳转到7ch时,cs和ip入栈,ip存放的正是se的偏移量 bx=s-se,现在我们得到了se的偏移量,只需要加上bx就能得到 s的偏移量了 因此在处理程序中,我们使用下面这段代码: show: push bp mov bp, sp dec cx jcxz showret add [bp+2], bx showret: pop bp iret 分析一下这段代码,访问栈段内存,所以要使用bp寄存器 先保存他的值,然后让他指向栈顶,现在的栈中存储的数据是这样的: +----+ 每次将cx的值减1,当cx值为0时,恢复bp的值并返回 | bp | 如果cx的值不为0,就修改ip的值,将其加上bx,得到标号s的 +----+ 偏移地址,然后恢复bp的值,执行iret指令,相当于 | ip | pop ip pop cs +----+ 这样一来,程序就会执行到s标号处 | cs | 如果add [bp+2], bx没有被执行,当iret执行完之后 +----+ 就会执行到se处,这时程序也就结束了 |flag| +----+ 完整的安装程序: |····| assume cs:code +----+ code segment start: mov ax, cs mov ds, ax mov si, offset show mov ax, 0 mov es, ax mov di, 200h mov cx, offset showend-offset show cld rep movsb mov ax, 0 mov es, ax mov word ptr es:[7ch*4], 200h mov word ptr es:[7ch*4+2], 0 mov ax, 4c00h int 21h show: push bp mov bp, sp dec cx jcxz showret add [bp+2], bx showret:pop bp iret showend:nop code ends end start |
t2.asm:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 | assume cs:code code segment start: mov ax, 0b800h mov es, ax mov di, 160*12 mov bx, offset s-offset se mov cx, 80 s: mov byte ptr es:[di], '!' mov byte ptr es:[di+1], 02h add di, 2 int 7ch se: nop mov ax, 4c00h; int 21h code ends end start t1.asm(安装程序) assume cs:code code segment start: mov ax, cs mov ds, ax mov si, offset show mov ax, 0 mov es, ax mov di, 200h mov cx, offset showend-offset show cld rep movsb mov ax, 0 mov es, ax mov word ptr es:[7ch*4], 200h mov word ptr es:[7ch*4+2], 0 mov ax, 4c00h int 21h show: push bp mov bp, sp dec cx jcxz showret add [bp+2], bx showret:pop bp iret showend:nop code ends end start |
运行过程:
先运行t1.exe,安装中断程序
再通过debug调试t2.exe
运行至int 7ch处时如下所示:
可以看出此时的CS 、IP、和栈中的内容,栈中的数值为之前单步中断保存的flag、CS、IP等寄存器的值,再执行一步-t,进入中断服务函数,如下所示
此时栈顶指针为FFFA(指向1C),其中076A为保存的CS,001C为保存的IP值,继续执行两次-t,看到:
SP变为FFF8指向(00),BP的值0000入栈后,将SP的值赋值给了BP。继续多次执行-t后如图:
栈中保存的IP值已经被重新赋值为000E(001c+FFF2),继续执行如下:
将栈中的BP、IP、CS、flag寄存器依次出栈,栈顶指针SP变为0000.程序将会跳到S处继续运行,
至此,完成了第一次循环。后面的循环调用过程类似
posted on 2020-07-15 14:17 lh03061238 阅读(204) 评论(0) 编辑 收藏 举报
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· winform 绘制太阳,地球,月球 运作规律
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
2019-07-15 UBOOT2016.05 看门狗