【实战编程】编写0号中断处理程序

题目:编写0号中断处理程序,在除法溢出时,在屏幕中间显示字符串“hacker by admin!”

之前先补充一个rep movsb的指令知识

movsb和movsw是相反的,都是根据标志寄存器DF的值选择正向传递还是反向传递。

这两个指令都是把ds:si中的值传递到es:di的位置中去

如果df=0时,取正向移动。(inc si和di)

如果df=1时,取反向移动。(dec si和di)

由上可知,只需要改变si和di的值就可以选择正向还是反向

cld 指令 :使df=0;std 指令 :使df=1.

注:使用movsb或movsw时  正确时候操作是:rep movsb

下面开始正式编程

assume cs:code
data segment
db ‘hacker by admin!‘
data ends

code segment
start:
mov ax,cs
mov ds,ax
mov si,offset do
mov ax,0
mov es,ax
mov di,200h
mov cx,offset doend - offset do                        ;获取中断程序的长度,好进行复制
cld
rep movsb
mov word ptr es:[0],200h
mov word ptr es:[2],0h
mov dx,0ffffhmov bx,1div bx        ;测试除法溢出的代码
mov ax,4c00h
int 21h

do:
mov ax,data
mov ds,ax
mov si,0h
mov ax,0b800h
mov es,ax
mov di,0
mov cx,16
s:
mov ah,2    ;绿色字体
mov al,ds:[si]
mov es:[di],ax
inc si
inc di
inc di
loop s
mov ax,4c00h
int 21h
doend:nop

code ends
end start

上述代码写完后,可以执行看看

可以说是成功编写完毕了。

但这里其实还有个小毛病不知道各位有没有发现

我的data段数据是放在do子程序的外面!!!

懂8086机制的同学们就知道,每一次程序开启,所分配的空间都是系统自己给我们的,也就是说

在程序运行期间,data段的数据是存在的。

一旦程序退出了,原本存放在内存中的data数据就立马会被其他的程序数据覆盖掉!!

经更改后代码如下:

assume cs:code

code segment
start:
mov ax,cs
mov ds,ax
mov si,offset do
mov ax,0
mov es,ax
mov di,200h
mov cx,offset doend - offset do
cld
rep movsb
mov word ptr es:[0],200h
mov word ptr es:[2],0h
;mov dx,0ffffh
;mov bx,1
;div bx
mov ax,4c00h
int 21h

do:jmp short dostart
db ‘hacker by admin!‘   ;我们将data中的数据放带do子程序里来

dostart:
mov ax,0
mov ds,ax
mov si,202h
mov ax,0b800h
mov es,ax
mov di,160*8+80    ;取屏幕中间部分
mov cx,16
s:
mov ah,2
mov al,ds:[si]
mov es:[di],ax
inc si
inc di
inc di
loop s
mov ax,4c00h
int 21h
doend:nop

code ends
end start

将data中的数据放在子程序里来,可以看到,在数据的前面有一个jmp指令

用来跳转到我们真正的中断程序中!

在8086汇编中  jmp指令占用2个字节空间,所以我们的si将会在202H处开始复制数据到显示屏中

下图是我安装好程序,再去用debug查看0:0200内存区域 代码还是在那里【因为其他合法的程序一般都不会使用 0:200~0:2FF( 0:200h~0:2FFh)的 256个字节的空间】

接下来用debug的a指令让程序手动溢出试试

mov dx,0ffffh
mov bx,1
div bx

所以说,只要运行一遍这个程序,在之后无论什么时候出现除法溢出都会成功显示该字符串。

时间: 2024-10-10 05:34:23

【实战编程】编写0号中断处理程序的相关文章

汇编语言:0号中断处理程序

assume cs:code code segment ;第一步:把中断向量表中0号表项的内容进行修改,使之指向我们自己编写 ;的中断处理程序的入口地址 start: mov ax,0 mov ds,ax mov word ptr ds:[0],0200h mov word ptr ds:[2],0 ;第三步,把我们刚才编写好的0号中断处理程序拷贝到中断向量表中 ;0号表项所指向的内存地址中0000:0200 mov ax,cs mov ds,ax mov si,offset int0  ;ds

汇编试验十二 编写0号中断的处理程序

要求:除法溢出的时候,在屏幕中心处显示overflow! 分析: 0号中断,对应的中断入口地址中的程序可以不用修改,放到内存0:空余位置(空余位置一般是0000::0200~0000:02FF)于是,就将显示字符串的程序放到这里: 用一个do0安装程序,将这个中断程序复制到内存0000:0200那里去:格式是:es:di 目的地址,ds:si源程序,cld复制方向,rep movsb 复制 子程序(中断程序)中,显示的字符串,不能放到一个独立的代码段,而是放到一个中断程序本身里面,因为复制程序运

中断处理程序

中断处理程序的编写方法和子程序的比较相似,下面是常规的步骤: 1)保存用到的寄存器 2)处理中断 3)恢复用到的寄存器 4)用iret指令返回. 编程处理0号中断(除法错误) 1)编写可以显示"overflow!"的中断处理程序: do0; 2)将do0送入内存0000:2000处: 3)将do0的入口地址0000:0200存储在中断向量表0号表项中. assume cs:code code segment start: mov ax, cs mov ds, ax mov si, of

2.中断处理程序

回顾裸机的流程.在裸机下学期,通过按键玩中断. 裸机中断的过程: 中断会有统一的入口:当我们的程序产生中断的时候,无论是哪种中断.都会跳到中断向量表里的_irq这里.这是统一的入口. 2.用户要先注册中断处理程序. 3.根据中断源编号,调用中断处理程序. 接下来我们来看linux的中断,是不是也是这种模式的呢? 我们打开内核工程的entry-armv.S这个文件,在这个文件里有这样的代码: 这就是linux统一的入口:__irq svc. 进入了统一的入口之后,程序会去调用irq_handler

《Linux内核设计与实现》学习笔记——中断、中断处理程序

中断和中断处理程序 中断随时可能产生,打断CPU的执行,CPU转而处理中断. 不同的设备对应的中断不同,每个中断都通过一个唯一的数字标志. 这些中断值称为中断请求(IRQ)线,每个irq线关联一个数值. 中断处理程序 响应中断时,内核会执行一个函数,中断处理程序/中断服务例程ISR, 一个设备的中断处理程序是他的设备驱动的一部分. IO资源包括 : 中断,I/O端口,共享RAM,DMA.驱动程序需要管理注册释放这些资源. 上半部:接收到中断就立即执行,只做有严格时限的工作,如对中断应答或复位硬件

中断——中断处理程序的进入与退出(三) (基于3.16-rc4)

上一篇博文我们分析了中断描述符表的中断门初始化过程,并且在interrupt数组中初始化过程中,可以看到每个中断处理程序都会跳入common_interrupt中.下面我们分析下common_interrupt汇编片段(arch/x86/kernel/entrt_32.S). 1 .p2align CONFIG_X86_L1_CACHE_SHIFT 2 common_interrupt: 3 ASM_CLAC 4 addl $-0x80,(%esp) /* Adjust vector into

使用BIOS中断显示字符串笔记(int 10h 13号中断)

BIOS的10H中断的13号中断用于显示字符串,参数为: 1.AH=13H 2.AL=显示方式 如果AL=0,表示目标字符串仅仅包含字符,属性在BL中包含,不移动光标 如果AL=1,表示目标字符串仅仅包含字符,属性在BL中包含,移动光标 如果AL=2,表示目标字符串包含字符和属性,不移动光标 如果AL=3,表示目标字符串包含字符和属性,移动光标 总之,可以归纳为: |BIT7|BIT6|BIT5|BIT4|BIT3|BIT2|BIT1|BIT0| AL BIT0为0表示不移动光标,为1表示移动光

13.linux中断处理程序

linux中断处理程序 一.中断处理流程 在linux内核代码中进入entry-armv.S目录: linux统一的入口:__irq svc. 进入了统一的入口之后,程序跳到irq_handler标号(在同一个文件上面有说明): 而irq_handler实际上是调用上面的arch_irq_handler_defualt.该代码在entry-macro-multi.S里面. 在这个中断处理程序中.最重要的是get_irqnr_and_base获取产生中断的中断源,搜索这个宏.这里以2410的为例(

Python黑帽编程 4.0 网络互连层攻击概述

Python黑帽编程 4.0 网络互连层攻击概述 是时候重新温习下下面这张图了. 图2 本章的内容核心包含上图中的网络层和传输层.TCP/IP是整个网络协议体系中的核心,因为从这里开始,数据传输从局域网迈向了广阔的互联网,我们的程序也有能力处理来自互联网的数据,可以直接对互联网上的主机进行攻击和测试. 还是老话,希望各位深入的学习协议,通过抓包工具练习数据包分析,通过实例理解协议.下面我们把本章涉及到的内容做简略的描述. 4.0.1 嗅探与嗅探器原理 嗅探是一个综合概念,涉及到我们之前讲到的第二