📄 db17.htm
字号:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<!-- saved from url=(0050)file://\\Server\pub\Hacker\Documents\JM\jm1-01.txt -->
<HTML><HEAD>
<META content="text/html; charset=gb2312" http-equiv=Content-Type>
<META content="MSHTML 5.00.2614.3500" name=GENERATOR></HEAD>
<BODY><XMP>1.OCW1
位元7~0 = 分别表示IRQx是否启动,0表示允能(enable),1表示
禁能(disable)。
说明∶本命令也就是设定岔断的罩遮值(IMR,Interrupt Mask Register)。
在使用时,通常先读取原值後,再设置所要处理的岔断所对应的位
元,以避免影响到其他岔断。
2.OCW2
位元7~5 = 000 取消自动EOI时旋转优先权模式
001 不特别指定IRQx方式结束岔断
010 无作用
011 指定IRQx方式结束岔断
100 设定自动EOI时旋转优先权模式
101 不特别指定IRQx结束岔断时旋转优先权
110 设定优先权
111 指定IRQx结束岔断时旋转优先权
位元4~3 = 固定为0
位元2~0 = 指定的IRQx
说明∶本命令是用来指定岔断优先权的处理方式(请参阅相关书籍),以
及指示岔断是否处理完毕。一般在PC上大都使用20h做不特别指定
IRQx方式来结束8259的岔断。所谓不特别指定IRQx方式,指的是要
处理的IRQ编号并不由位元2~0来指定,而以目前已发生且优先权
最高的岔断为准。
3.OCW3
位元7 = 固定为0
位元6~5 = 0x 无作用
10 取消特殊罩值(reset special mask)
11 设定特殊罩值(set special mask)
位元4 = 固定为0
位元3 = 固定为1
位元2 = 0表使用岔断方式服务
1表不使用岔断方式服务(poll command)
位元1~0 = 0x 无作用
10 读取岔断需求暂存器(IRR)
11 读取内部服务暂存器(ISR)
说明∶特殊罩值功能,主要是提供给需要任意改变岔断的禁能、允能,而
又不希望因未送出EOI命令,而导致其他较低优先权的岔断无法发
生的程式使用。当设定了特殊罩值後,则每次在OCW1重设罩值时,
均会将所有未被罩遮掉的IRQ重新启用。IRR及ISR这两个暂存器的
值可用来辨别各岔断的产生与否。IRR(Interrupt Request
Register)记录了硬体已产生岔断需求,但8259尚未发出岔断讯号
或CPU尚未回应确认讯号的岔断;ISR(Interrupt Service Register)
则记录了CPU已接收到岔断讯号但处理程式尚未回应EOI命令的岔断。
当要读取这两个暂存器值时,首先必须送出OCW3指定所要读取的暂
存器,然後再由相同的输出入埠将之读取。
备注∶不使用岔断服务的方式(poll command),依8259之零件说明为RD
讯号会读取Priority Level值,其值意义如下∶
位元7 = 1表有岔断发生
位元6~3 = 保留
位元2~0 = 岔断发生的编号
又说明Poll Command是使用在8259的岔断输出讯号不使用,或CPU
线路已将岔断讯号输入禁能的情况。据作者实际测试结果,在PC上
将OCW3修改成Poll Command形态,并不影响到原岔断的执行,读取
而得的值也并非Priority Level的值。至於为何如此,作者遍寻相
关书籍,也问过许多硬体设计从业人员,竟找不到答案。作者猜测
可能是因PC CPU仍然接收并使用8259的岔断输出讯号,使得8259的
岔断确认讯号并非由Poll Command的RD讯号确认所致,至於真正原
因,则不得而知了。
当8259重新初始化後,IMR的值均会重设为FFh(也就是允许所有的岔
断产生),并取消特殊罩值功能。因此当我们要重新初始化8259时,必须
记录原来的IMR值,并在初始化後将之设回,以免初始化後某些原已被禁
能的岔断再次产生而发生问题。当然,初始化後视情况也必须重新设定
OCW3的值。
上述所有命令字组在PC上均透过I/O Port 20h、21h(第一个8259)
和A0h、A1h(第二个8259)来读写。I/O Port 20h和A0h做为ICW1、OCW2
和OCW3命令的输入,以及IRR、ISR暂存器值的输出。I/O Port 21h和A1h
则做为ICW2、ICW3、ICW4和OCW1命令的输入,以及IMR暂存器值的输出。
至於8259是如何去分辨送来的是那个命令字组,这倒不必我们费心,因为
这些命令字组中大都已安排好某些位元均固定为0或1。由这些固定位元,
8259便能轻易地辨别出所输入的命令种类。以下是目前在PC/AT中两个8259
所处理的16个硬体岔断内容∶
┌ IRQ0 计时岔断
┃ IRQ1 键盘岔断
┃ IRQ2 串接第二个8259
第一个8259 ━┤ IRQ3 次串列通讯埠(COM2)
┃ IRQ4 主串列通讯埠(COM1)
┃ IRQ5 印表机岔断(LPT2)
┃ IRQ6 软碟岔断
└ IRQ7 印表机岔断(LPT1)
┌ IRQ0 即时时脉岔断
┃ IRQ1 保留
┃ IRQ2 保留
第二个8259 ━┤ IRQ3 保留
┃ IRQ4 保留
┃ IRQ5 数学处理单元岔断
┃ IRQ6 硬碟岔断
└ IRQ7 保留
以下为各岔断在本附录中所对应的硬体说明∶
计时岔断 = 8253、8254
键盘岔断 = 8042、8255
即时时脉岔断 = 146818
数学处理单元岔断 = 8087、80287
解魔武王 追踪过程
C:\DKS>DEBUG DKS.EXE (284965 BYTE 免解压缩)
-U BFF0
1052:BFF0 E8FF76 CALL 36F2
1052:BFF3 E69A OUT 9A,AL
1052:BFF5 F3 REPZ
1052:BFF6 0BE3 OR SP,BX
1052:BFF8 3F AAS
1052:BFF9 83C414 ADD SP,+14
1052:BFFC 48 DEC AX
1052:BFFD 8946D4 MOV [BP-2C],AX
1052:C000 8B46D4 MOV AX,[BP-2C] <---正确密码存放位址
1052:C003 3B46EE CMP AX,[BP-12] <---比较输入密码
1052:C006 7523 JNZ C02B <---若不同 就跳到 C02B
1052:C008 68 DB 68
1052:C009 B004 MOV AL,04
1052:C00B FF366822 PUSH [2268]
1052:C00F FF366622 PUSH [2266]
1052:C013 6A DB 6A
1052:C014 006A01 ADD [BP+SI+01],CH
1052:C017 8B46EC MOV AX,[BP-14]
1052:C01A 05E2FF ADD AX,FFE2
1052:C01D 50 PUSH AX
1052:C01E FF76EA PUSH [BP-16]
1052:C021 9ACF19143B CALL 3B14:19CF
1052:C026 83C40E ADD SP,+0E
1052:C029 EB2D JMP C058
1052:C02B 68 DB 68
1052:C02C B004 MOV AL,04
1052:C02E FF366822 PUSH [2268]
1052:C032 FF366622 PUSH [2266]
1052:C036 6A DB 6A
1052:C037 006A07 ADD [BP+SI+07],CH
1052:C03A 8B46EC MOV AX,[BP-14]
1052:C03D 05E2FF ADD AX,FFE2
1052:C040 50 PUSH AX
破解这套GAME只需掌握一些技巧 可揽INT 16 AH=00 即可顺利找到判断点的地方 如上图所
示的程式码 本人不想解释上面的程式作用 若不懂指令运作方式 可参考坊间的组合语言书
籍即可。
</XMP></BODY></HTML>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -