📄 00000003.htm
字号:
mov ds:[ebx+04h],ax ; <BR> nop <BR> xor ebx,ebx ; <BR> mov bx,ss:[bp-02h] ; <BR> shl ebx,02h ; <BR> mov ax,ds:[ebx] ;IRETD 後到V86中断表所指的位址继续执行 <BR> mov ss:[bp+00h],ax ;(查 0000:0000 的中断表) <BR> mov ax,ds:[ebx+02h] ; <BR> mov ss:[bp+04h],ax ; <BR> mov eax,ss:[bp+08h] <BR> or eax,00032000h ;等级=3 VM=1 <BR> and eax,0fffffeffh ;关闭'T'旗标 <BR> mov ss:[bp+08h],eax <BR> pop ebx <BR> pop eax <BR> pop bp <BR> add sp,02h <BR> iretd <BR> <BR>-------------------------------------------------------------------------- <BR>┌——————┐ <BR>│拦 I/O 能力│ <BR>└——————┘ <BR> <BR> TSS 表格内除了可定义产生工作切换後 ,SS.ESP.DS.ES....各暂存器替换值 ,也 <BR>可以开一块记忆体做 IOMAP ,这块记忆体每个 Bit 代表一个 PORT ,一般习惯是开4K <BR>大小 (65536埠),当某位元设定为 '1' 後 ,只要不是最高等级的人去读写此埠 ,都会 <BR>发生 GP Err #0D ,当然在最低等级的 V86 程式也不例外 ,发生此错误後 ,就形同拦 <BR>到 I/O 动作了 ,紧接著透过最高等级的处理程式去判断发生错误的原因 ,例如判断 <BR>程式码是否为 『EC IN AL,DX』、『EE OUT DX,AL』 ,或是其它程式码 ,就可以分 <BR>辨发生的原因是读或写产生的 ,拦到 I/O 後 ,你是否会写骗 I/O 的程式 ? <BR> <BR> 以 S-ICE 的拦 I/O 能力为例 ,它先使用 IO-MAP 的方式去拦 I/O ,然後再判别 <BR>"EE.E4.EC.E6...." 等等程式码。 <BR> <BR>注:IOMAP 表是也是 TSS 表格的一部份。 <BR>-------------------------------------------------------------------------- <BR>┌———————┐ <BR>│相容性的处理一│ 系统暂存器的相容处理法 <BR>└———————┘ <BR> <BR> 或许您曾经在挂入 QEMM386、EMM386 之後 ,在 V86 下执行 MOV EAX,CR0 的指 <BR>令 ,但是前面笔者提到读写系统暂存器必需在最高等级才可执行 ,为什麽 User 仍可 <BR>在最低等级下执行本命令呢 ? 底下是欺骗方式。 <BR> <BR> <BR> (User) V86 下执行 MOV EAX,CR0 <BR> ↓ <BR> 发生 General Protection 0D <BR> CPU 自动切入保护模式 ,并执行 INT_0D 的处理程式 <BR> (堆叠里多储存了错误代码 DWORD) <BR> ↓ <BR> (EMM) 检查发生错误的原因 <BR> 读取 EAX,CR0 (因此时已是最高等级 ,本行可以正确执行) <BR> ↓ <BR> (EMM) 修改堆叠内的 EIP 值 ,指向下一行指令 <BR> ↓ <BR> (EMM) 修改使用者等级 3 / 设定 VM 旗标等於 1 <BR> ↓ <BR> (EMM) ESP 值扣掉错误代码 4byte <BR> ↓ <BR> (EMM) IRETD 切回 V86 <BR> ↓ <BR> (User) 使用者取得 EAX 的数值 <BR> <BR> 由於程式有一大半在保护模式下执行 ,所以使用者根本感觉不到 ,只知道自己真 <BR>的读到系统暂存器。这便是 EMM 系的欺骗手段。 <BR> <BR> 本来标准的程式是不会在 V86 下读写系统暂存器 ,可是确实也有不正常的程式 <BR>是这样搞的 ,例如倚天中文会执行 MOV EAX,CR3 ,或是一些保护程式会写入除错暂存 <BR>器 (DRx)。所以为了相容性 ,这些最好做进去。 <BR> <BR>注:判别发生的原因也可以利用判断 I/O 的那种方法 ,但写起来很麻烦。 <BR>-------------------------------------------------------------------------- <BR>┌———————┐ <BR>│相容性的处理二│ HIMEM.SYS <BR>└———————┘ <BR> HIMEM.SYS 是一个可以控制 1MB 以外记忆体的程式 ,不过之前笔者有提过 ,要 <BR>读写超过 1MB 以外的记忆体必需进入保护模式才行(据说有後门可用) ,那麽载入自 <BR>己的保护模式程式後 ,再遇到呼叫 HIMEM.SYS 去搬移 1MB 以外的记忆体 ,电脑竟然 <BR>会发生 GP Err #0D ,原来这是因为 HIMEM.SYS 在执行搬移记忆体的命令後会去呼叫 <BR>BIOS 的 AH=87h INT_15h 去搬记忆体 ,换句话说就是因为这个 BIOS 中断会进入保 <BR>护模式去搬记忆体 ,所以才会造成当机 ,因此你的保护模式介面程式必需去模拟这个 <BR>BIOS 函式 ,就可以与 HIMEM.SYS 相容了。 <BR> <BR>注:BIOS AH=87h INT_15h 会重设 GDT.IDT 表 ,然後进入保护模式去搬记忆体 ,然後 <BR> 就当在 LIDT 或 LGDT 的命令上。 <BR> <BR> 另外如果你的程式摆在 1MB 以上的记忆体位址去执行 ,还会有另一个问题产生 , <BR> 不过如果你已经学会上面的这些功能 ,再尝试去写个程式去试试 ,你自然会知道 <BR> 它会发生什麽问题 ,解决的办法也很简单 ,你一定会解决。 <BR>-------------------------------------------------------------------------- <BR> 切入 V86 後 ,还有很多问题要处理 ,不过上面提到的两个问题如果你都能处理 <BR>的话 ,基本上就不会有其它大问题 ,等你会进入保护模式後 ,再来学习 VCPI、DPMI <BR>就很简单了。 <BR> <BR> 如果各位会切入保护模式的话 ,接下来应该是学习 VCPI 的切入方式 ,虽然有很 <BR>多书籍有介绍 ,但是要真正了解并不容易。建议各位去买套大宇出品的激斗战士、战 <BR>国策 ,它的外加保护就是切入保护模式的最佳范例 ,包含透过 VCPI、自己切286.386 <BR>保护模式 ,虽然这是不道德的行为 ,但是却是一个最佳范本。花个五百块学新知绝对 <BR>划算。 <BR> <BR> 有关保护模式的部份笔者暂时介绍到此 ,下一集笔者将为您介绍虚拟记忆体 ,如 <BR>果情况允许 ,还会顺便介绍更难懂的分页机能。教各位如何写出类似 S-ICE 的 BPR <BR>功能 ,锁定某一块记忆体的读写状态。 <BR> <BR> <BR>┌———————————————————————————————————┐ <BR>│ Soft Bugger 软体蛀虫 90:90/2 软体新技术的实行者 │ <BR>│ BBS:02-5955461 24HR ID:Werong Ho -- 软蛀 -- │ <BR>└———————————————————————————————————┘ <BR> <BR><CENTER><H1>BBS水木清华站∶精华区</H1></CENTER></BODY></HTML>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -