⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 00000003.htm

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

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -