能力值:
( LV9,RANK:180 )
|
-
-
2 楼
是的, 是个中断
是的, 21h 是中断号
|
能力值:
( LV3,RANK:20 )
|
-
-
3 楼
呵呵。。。。。。。。。。。。。。。。
|
能力值:
( LV9,RANK:180 )
|
-
-
4 楼
你提到的人是很热心和善的, 可能有所误会吧. 不管这个.
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
|
能力值:
( LV2,RANK:10 )
|
-
-
5 楼
感谢sessiondiy,其他的我就不多说了。
|
能力值:
( LV2,RANK:10 )
|
-
-
6 楼
我自己编了一下,发现使用ax = ff87再调用int 21h后al被清零了,但ax与dx分别与4944以及3332做比较,继续跟踪下去会发现经过一个lodsw指令后,ax就变为4449了。我用到是turbo debugger跟踪的,不太熟练,一旦es被改了,原来那个访问es段的窗口还是显示原先es段的数据,我找了半天也没能找到方法查看当前es段的内容。请高手帮忙推荐一个dos下的debugger。
|
能力值:
( LV2,RANK:10 )
|
-
-
7 楼
是中断,就像call子程序一样(有区别的)他是个系统预设的程序
不过是用int的方式调用出来
|
能力值:
( LV9,RANK:180 )
|
-
-
8 楼
自带的 debug.exe
程序码整段列出来看看or文章出处连结
|
能力值:
(RANK:300 )
|
-
-
9 楼
int 21h
只能在dos下使用....
|
能力值:
( LV2,RANK:10 )
|
-
-
10 楼
有点保密问题,只能贴一段程序,我估计程序在一开始已经将一部分数据放在一段内存里了,在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中,待会把那段子程序全部放出。
|
能力值:
( LV2,RANK:10 )
|
-
-
11 楼
第一个子例程
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
|
能力值:
( LV2,RANK:10 )
|
-
-
12 楼
这是一个firmware的烧录程序,需要带参数运行的,我也不知道怎么带参数跟踪,试了TD感觉还是不行。我只是想知道大概的原理,毕竟还有其他资料供参考,将来还是要用c编写的。
|
能力值:
( LV2,RANK:10 )
|
-
-
13 楼
第三个子程序
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
|
能力值:
( LV2,RANK:10 )
|
-
-
14 楼
此程序如果不带参数运行,就会显示类似 command /?的效果。
|
能力值:
( LV9,RANK:180 )
|
-
-
15 楼
你这些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 附近有什么字符串
|
能力值:
( LV2,RANK:10 )
|
-
-
16 楼
对,这只是入口函数的一小部分,后面还有很多,我也不着急分析完他,只是学习一下顺便挖出点底层硬件的端口啊,内存配置空间啊什么的。还是要感谢sessiondiy,你的提示对我很有帮助!!
|