首页
社区
课程
招聘
[讨论]请问int 21h是不是中断?21h是不是中断向量号?
2008-12-16 12:26 6598

[讨论]请问int 21h是不是中断?21h是不是中断向量号?

2008-12-16 12:26
6598
这只是刚才一个问题的延续,我只是在一个问题中间提到了int 21h是个中断,然后嘉宾版主就据此认为我没有汇编的基础同时认为我也没有打好汇编基础的意图。我知道这个话题可能被删也可能封我的ID,但我还是不服,我只是提了一个问题,而且嘉宾版主的回答也不一定正确,我怎么就不能发表我的看法,还给我加了一个恶言相向的恶名,我哪里恶言相向了???!!!

[CTF入门培训]顶尖高校博士及硕士团队亲授《30小时教你玩转CTF》,视频+靶场+题目!助力进入CTF世界

收藏
点赞0
打赏
分享
最新回复 (15)
雪    币: 2071
活跃值: (77)
能力值: ( LV9,RANK:180 )
在线值:
发帖
回帖
粉丝
sessiondiy 4 2008-12-16 16:38
2
0
是的, 是个中断
是的, 21h 是中断号
雪    币: 155
活跃值: (10)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
greatbob 2008-12-16 16:45
3
0
呵呵。。。。。。。。。。。。。。。。
雪    币: 2071
活跃值: (77)
能力值: ( LV9,RANK:180 )
在线值:
发帖
回帖
粉丝
sessiondiy 4 2008-12-16 17:01
4
0
你提到的人是很热心和善的, 可能有所误会吧. 不管这个.
3th party的文件难找了, 有些根本没公布, 手册找得到的只有下列3个
而且不详细, 少到你可能看不懂:

1. DOS 某些版本 - OEM功能
        AH=FF

2. CDE(命令编辑器) - 可安装之命令
        AH=FF
        AL=子功能  00h ' 01h ' 02h

    注: CED是一个shareware, 为一个DOS命令列的加强器

3. Topware NetWare Operationg System - 未知
         AH=FF
雪    币: 201
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
axe 2008-12-16 19:45
5
0
感谢sessiondiy,其他的我就不多说了。
雪    币: 201
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
axe 2008-12-16 19:57
6
0
我自己编了一下,发现使用ax = ff87再调用int 21h后al被清零了,但ax与dx分别与4944以及3332做比较,继续跟踪下去会发现经过一个lodsw指令后,ax就变为4449了。我用到是turbo debugger跟踪的,不太熟练,一旦es被改了,原来那个访问es段的窗口还是显示原先es段的数据,我找了半天也没能找到方法查看当前es段的内容。请高手帮忙推荐一个dos下的debugger。
雪    币: 442
活跃值: (43)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
ucantseeme 2008-12-17 08:12
7
0
是中断,就像call子程序一样(有区别的)他是个系统预设的程序

不过是用int的方式调用出来
雪    币: 2071
活跃值: (77)
能力值: ( LV9,RANK:180 )
在线值:
发帖
回帖
粉丝
sessiondiy 4 2008-12-17 08:15
8
0
自带的 debug.exe

程序码整段列出来看看or文章出处连结
雪    币: 2368
活跃值: (81)
能力值: (RANK:300 )
在线值:
发帖
回帖
粉丝
北极狐狸 7 2008-12-17 08:51
9
0
int 21h
只能在dos下使用....
雪    币: 201
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
axe 2008-12-17 11:23
10
0
有点保密问题,只能贴一段程序,我估计程序在一开始已经将一部分数据放在一段内存里了,在lodsw前将ds值改了,但不大会用TD所以没办法提前直接查看那段内存。
以下是IDA分析出的入口函数的一段:
seg002:2F48
seg002:2F48                 sti
seg002:2F49                 push    cs
seg002:2F4A                 pop     ds
seg002:2F4B                 assume ds:seg002
seg002:2F4B                 mov     word_16036, ds ;以下三行就是将这些段地址放入一段
seg002:2F4F                 mov     word_16038, es ;内存中,可能之后会重新载入
seg002:2F53                 mov     word_1603A, ss
seg002:2F57                 mov     ax, es:2Ch
seg002:2F5B                 mov     word_1603C, ax
seg002:2F5E                 cld
seg002:2F5F                 call    sub_12D00
seg002:2F62                 call    sub_12D72
seg002:2F65                 call    sub_12FEC
seg002:2F68                 mov     ax, ss
seg002:2F6A                 mov     si, es:2
seg002:2F6F                 add     ax, 0C0h ; '?
seg002:2F72                 mov     word_1603E, ax
seg002:2F75                 add     ax, word_16064
seg002:2F79                 mov     word_16062, ax
seg002:2F7C                 sub     si, ax
seg002:2F7E                 jnb     short loc_15C92
seg002:2F80

那段int代码在第一个call中,待会把那段子程序全部放出。
雪    币: 201
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
axe 2008-12-17 11:25
11
0
第一个子例程
seg002:0000 ; =============== S U B R O U T I N E =======================================
seg002:0000
seg002:0000
seg002:0000 sub_12D00       proc near               ; CODE XREF: start+17p
seg002:0000                 push    ds
seg002:0001                 push    es
seg002:0002                 mov     ax, seg seg000
seg002:0005
seg002:0005 loc_12D05:                              ; CODE XREF: sub_12DB5+1Fj
seg002:0005                 mov     dx, seg seg001
seg002:0008                 mov     ds:3344h, ax
seg002:000B                 mov     ds:3346h, dx
seg002:000F                 push    ax
seg002:0010                 push    dx
seg002:0011                 mov     ax, 0FF87h
seg002:0014                 int     21h             ; DOS - DOS v??? - OEM FUNCTION
seg002:0016                 cmp     dx, 4944h
seg002:001A                 jnz     short loc_12D37
seg002:001C                 cmp     ax, 3332h
seg002:001F                 jnz     short loc_12D37
seg002:0021                 mov     es, cs:word_16044
seg002:0026                 assume es:nothing
seg002:0026                 xor     di, di
seg002:0028                 mov     cx, 0Ch
seg002:002B                 rep movsw
seg002:002D                 mov     ds, cs:word_16036
seg002:0032                 or      word ptr ds:331Ah, 1
seg002:0037
seg002:0037 loc_12D37:                              ; CODE XREF: sub_12D00+1Aj
seg002:0037                                         ; sub_12D00+1Fj
seg002:0037                 pop     dx
seg002:0038                 pop     ax
seg002:0039                 mov     ds, ax
seg002:003B                 mov     es, dx
seg002:003D                 assume es:nothing
seg002:003D                 xor     si, si
seg002:003F                 mov     di, 0
seg002:0042                 lodsw                         ;这里ax值就会变为4449
seg002:0043                 cmp     ax, 4449h
seg002:0046                 jnz     short loc_12D6E
seg002:0048                 lodsw
seg002:0049                 cmp     ax, 3233h
seg002:004C                 jnz     short loc_12D6E
seg002:004E                 mov     cx, 10h
seg002:0051                 rep movsb
seg002:0053                 mov     es, cs:word_16036
seg002:0058                 and     word ptr [si], 7FFFh
seg002:005C                 lodsw
seg002:005D                 mov     es:3314h, ax
seg002:0061                 lodsw
seg002:0062                 mov     es:3364h, ax
seg002:0066                 lodsw
seg002:0067                 mov     es:3316h, ax
seg002:006B                 clc
seg002:006C                 jmp     short loc_12D6F
seg002:006E ; ---------------------------------------------------------------------------
seg002:006E
seg002:006E loc_12D6E:                              ; CODE XREF: sub_12D00+46j
seg002:006E                                         ; sub_12D00+4Cj
seg002:006E                 stc
seg002:006F
seg002:006F loc_12D6F:                              ; CODE XREF: sub_12D00+6Cj
seg002:006F                 pop     es
seg002:0070                 pop     ds
seg002:0071                 retn
seg002:0071 sub_12D00       endp
seg002:0071
seg002:0072

入口函数中的第二个子例程
seg002:0072 ; =============== S U B R O U T I N E =======================================
seg002:0072
seg002:0072
seg002:0072 sub_12D72       proc near               ; CODE XREF: start+1Ap
seg002:0072                 push    ds
seg002:0073                 push    es
seg002:0074                 jb      short loc_12DB2
seg002:0076                 test    byte ptr ds:3315h, 1
seg002:007B                 jz      short loc_12DB2
seg002:007D                 mov     es, word ptr ds:333Ch
seg002:0081                 xor     di, di
seg002:0083                 mov     cx, 0FFFFh
seg002:0086                 xor     ax, ax
seg002:0088
seg002:0088 loc_12D88:                              ; CODE XREF: sub_12D72+27j
seg002:0088                 push    cx
seg002:0089                 mov     cx, 7
seg002:008C                 mov     si, 3469h
seg002:008F                 repe cmpsb
seg002:0091                 pop     cx
seg002:0092                 jz      short loc_12D9D
seg002:0094                 repne scasb
seg002:0096                 cmp     al, es:[di]
seg002:0099                 jnz     short loc_12D88
seg002:009B                 jmp     short loc_12DB2
seg002:009D ; ---------------------------------------------------------------------------
seg002:009D
seg002:009D loc_12D9D:                              ; CODE XREF: sub_12D72+20j
seg002:009D                                         ; sub_12D72+3Ej
seg002:009D                 call    sub_12DD9
seg002:00A0                 cmp     byte ptr es:[di], 0
seg002:00A4                 jz      short loc_12DB2
seg002:00A6                 call    sub_12DB5
seg002:00A9                 call    sub_12DED
seg002:00AC                 cmp     byte ptr es:[di], 0
seg002:00B0                 jnz     short loc_12D9D
seg002:00B2
seg002:00B2 loc_12DB2:                              ; CODE XREF: sub_12D72+2j
seg002:00B2                                         ; sub_12D72+9j ...
seg002:00B2                 pop     es
seg002:00B3                 pop     ds
seg002:00B4                 retn
seg002:00B4 sub_12D72       endp
雪    币: 201
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
axe 2008-12-17 11:30
12
0
这是一个firmware的烧录程序,需要带参数运行的,我也不知道怎么带参数跟踪,试了TD感觉还是不行。我只是想知道大概的原理,毕竟还有其他资料供参考,将来还是要用c编写的。
雪    币: 201
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
axe 2008-12-17 11:32
13
0
第三个子程序
seg002:02EC ; =============== S U B R O U T I N E =======================================
seg002:02EC
seg002:02EC
seg002:02EC sub_12FEC       proc near               ; CODE XREF: start+1Dp
seg002:02EC                 test    byte ptr ds:3315h, 8
seg002:02F1                 jz      short locret_13024
seg002:02F3                 mov     ax, ds:3316h
seg002:02F6                 mov     bx, 33EFh
seg002:02F9                 mov     si, 33C3h
seg002:02FC                 push    ax
seg002:02FD                 mov     al, ah
seg002:02FF                 aam
seg002:0301                 add     al, 30h ; '0'
seg002:0303                 mov     [bx], al
seg002:0305                 pop     ax
seg002:0306                 aam
seg002:0308                 add     ax, 3030h
seg002:030B                 cmp     al, 30h ; '0'
seg002:030D                 jnz     short loc_13011
seg002:030F                 mov     al, 20h ; ' '
seg002:0311
seg002:0311 loc_13011:                              ; CODE XREF: sub_12FEC+21j
seg002:0311                 xchg    ah, al
seg002:0313                 mov     [bx+2], ax
seg002:0316                 mov     cx, 62h ; 'b'
seg002:0319
seg002:0319 loc_13019:                              ; CODE XREF: sub_12FEC+36j
seg002:0319                 lodsb
seg002:031A                 push    cx
seg002:031B                 xor     bx, bx
seg002:031D                 mov     ah, 0Eh
seg002:031F                 int     10h             ; - VIDEO - WRITE CHARACTER AND ADVANCE CURSOR (TTY WRITE)
seg002:031F                                         ; AL = character, BH = display page (alpha modes)
seg002:031F                                         ; BL = foreground color (graphics modes)
seg002:0321                 pop     cx
seg002:0322                 loop    loc_13019
seg002:0324
seg002:0324 locret_13024:                           ; CODE XREF: sub_12FEC+5j
seg002:0324                 retn
seg002:0324 sub_12FEC       endp
雪    币: 201
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
axe 2008-12-17 11:33
14
0
此程序如果不带参数运行,就会显示类似 command /?的效果。
雪    币: 2071
活跃值: (77)
能力值: ( LV9,RANK:180 )
在线值:
发帖
回帖
粉丝
sessiondiy 4 2008-12-17 14:08
15
0
你这些code是看不出什么东西的, 你可往下列方向试试

1. 用 debug.exe 去调试, (可进入 int21h去分析 FF87 在干嘛的)

2. 你贴的 sub_12FEC 若有显示字符串, 可猜个大概.
  注:seg002:005D mov   es:3314h, ax
    会决定 seg002:02EC  test  byte ptr ds:3315h, 8

3. 你是用 IDA, 请找出所有 [331A] , 其 bit0 在其它地方是做为什么的判断条件

4. 看一下 seg000:0 附近有什么字符串
雪    币: 201
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
axe 2008-12-17 15:39
16
0
对,这只是入口函数的一小部分,后面还有很多,我也不着急分析完他,只是学习一下顺便挖出点底层硬件的端口啊,内存配置空间啊什么的。还是要感谢sessiondiy,你的提示对我很有帮助!!
游客
登录 | 注册 方可回帖
返回