📄 00000002.htm
字号:
xor eax,eax ; <BR> xor ebx,ebx ;修改V86下的SS:SP ,帮它摆入 <BR> mov ax,ss:[bp+10h] ;INT_X 後的下一行位址 ,供V86 <BR> shl eax,04h ;下的程式IRET返回INT_X的下一行用 <BR> mov bx,ss:[bp+0ch] ; <BR> add ebx,eax ; <BR> mov ax,ss:[bp+00h] ; <BR> mov ds:[ebx],ax ; <BR> mov ax,ss:[bp+04h] ; <BR> mov ds:[ebx+02h],ax ; <BR> mov ax,ss:[bp+08h] ; <BR> 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>│相容性的处理│ <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> <BR> 再举例来说 ,笔者所写的 DEBUGOS ,在这个系统下您可以执行 MOV EAX,CR0 ,就 <BR>是因为笔者有加以处理 ,可是笔者检查保护模式错误原因里并没有处理 MOV EBX,CR0 <BR> ,於是在这系统下 ,您就没办法执行本命令了 ,您可以试试看。 <BR> <BR> 本来标准的程式是不会在 V86 下读写系统暂存器 ,可是确实也有不正常的程式 <BR>是这样搞的 ,例如倚天中文会 MOV EAX,CR3 ,或是一些保护程式会写入除错暂存器 <BR>(DRx)。所以为了相容性 ,这些最好做进去。 <BR> <BR>-------------------------------------------------------------------------- <BR>┌——————┐ <BR>│拦 I/O 能力│ <BR>└——————┘ <BR> <BR> 在进入保护模式後 ,您可以在 IOMAP 里设定某些位元 ,用以管理 I/O 埠 ,每个 <BR>Bit 表示一个埠 ,4K=32768埠 ,当您设定此位元後 ,等级低的人读写此埠就会发生 <BR>General Protection Error 0D ,然後你就可以加以处理啦 ,不过 I/O MAP 只能设定 <BR>为读写时发生异常 ,无法单独设定为仅读取才发生或仅写入才发生 ,因此拦 I/O 的 <BR>人要自己去辨认原因。这点也是很麻烦的。 <BR> <BR>-------------------------------------------------------------------------- <BR> 切入 V86 後 ,还有很多问题要处理 ,包含上面提到的部份 ,和 HIMEM.SYS 相容 <BR>啦 ,这些问题有待您自己去寻找解决办法。 <BR> <BR> 有关保护模式的部份笔者只能介绍到此 ,再下去更深的理论我不会解释 ,也掰不 <BR>出来 ,不过您如果会切入 V86 ,自然也能够写在保护模式下执行的程式才对。如有问 <BR>题再来信。 <BR> <BR> DEBUGOS 这个小软体已经摆於 KPEMU300.ZIP 内了 ,这是一套模拟 KeyPro 的小 <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 + -