首页
社区
课程
招聘
关于杨季问的实时模式转化为保护模式的
发表于: 2010-7-18 19:30 3732

关于杨季问的实时模式转化为保护模式的

2010-7-18 19:30
3732
参照8086,杨季问的实时模式转化为保护模式的代码
执行到LGDT FWORD PTR vgdtr(书上是qword,但编译通过不了,fword就行了),会自动退出..这是什么问题..不懂..问下大大们?
jump macro selector,offsetv
     db 0eah
     dw offsetv
     dw selector
endm

echoch macro ascii
     mov ah,2
     mov dl,ascii
     int 21h
endm

descriptor struc
limitl dw 0
basel  dw 0
basem  db 0
attributes dw 0
baseh  db 0
descriptor ends

pdesc struc
limit dw 0
base dd 0
pdesc ends

atdw = 92h
atce =98h
.386P
dseg segment use16
gdt label byte
dummy descriptor <>
code descriptor <0ffffh,,,atce,>
code_sel = code -gdt
datas descriptor <0ffffh,0h,11h,atdw,0>
datas_sel = datas-gdt
datad descriptor <0ffffh,,,atdw,>
datad_sel = datad-gdt
getlen =$-gdt
vgdtr pdesc <getlen-1,0>

bufferlen = 256
buffer db bufferlen dup(0)
dseg ends

cseg segment use16
     assume cs:cseg,ds:dseg
start:
     mov ax,dseg
     mov ds,ax
   
     mov bx,16
     mul bx
     add ax,offset gdt
     adc dx,0
     mov word ptr vgdtr.base,ax
     mov word ptr vgdtr.base+2,dx
     
     mov ax,cs
     mul bx
     mov code.basel,ax
     mov code.basem,dl
     mov code.baseh,dh

     mov ax,ds
     mul bx
     add ax,offset buffer
     adc dx,0
     mov datad.basel,ax
     mov datad.basem,dl
     mov datad.baseh,dh
     
     LGDT FWORD PTR vgdtr

     cli
     call enablea20
     
     mov eax,cr0
     or eax,1
     mov cr0,eax
     jump <code_sel>,<offset virtual>
virtual:
     mov ax,datas_sel
     mov ds,ax
     mov ax,datad_sel
     mov es,ax
     cld
     xor si,si
     xor di,di
     mov cx,bufferlen/4
     repz movsd

     mov eax,cr0
     and eax,0fffffffeh
     mov cr0,eax
     jump <seg real>,<offset real>
real:
     call disablea20
     sti

     mov ax,dseg
     mov ds,ax
     mov si,offset buffer
     cld
     mov bp,bufferlen/16
nextline:
     mov cx,16
nextch:
     lodsb
     push ax
     shr al,4
     call toascii
     echoch al
     pop ax
     call toascii
     echoch al
     echoch ' '
     echoch 0dh
     echoch 0ah
     dec bp
     jnz nextline
  
     mov ax,4c00h
     int 21h
toascii proc
     and al,0fh
     add al,90h
     daa
     add al,40h
     daa
     ret
toascii endp
enablea20 proc
     push ax
     in al,92h
     or al,2
     out 92h,al
     pop ax
     ret
enablea20 endp

disablea20 proc
     push ax
     in al,92h
     and al,0fdh
     out 92h,al
     pop ax
     ret
disablea20 endp
cseg ends
end start
执行到

[培训]《安卓高级研修班(网课)》月薪三万计划,掌握调试、分析还原ollvm、vmp的方法,定制art虚拟机自动化脱壳的方法

收藏
免费 0
支持
分享
最新回复 (6)
雪    币: 246
活跃值: (25)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
2
FWORD-6字节,  QWORD-8字节, TBYTE-10字节

GDTR是48位的寄存器,所以用FWORD

  另外,MASM5.0---LGDT必须使用QWORD,这是MASM5.0的BUG,也是书中出现QWORD的原因;MASM6.11,MASM6.15---LGDT必须使用FWORD。
  再者,在 IDA 中, 给出的都是错误结果, 全部用 qword 来解释。例如: lgdt fword ptr [esp + gdt], 在 IDA 中被反编译成 lgdt qword ptr [esp + gdt] 或 gdt = qword lgdt [esp + gdt]
2010-7-18 19:42
0
雪    币: 306
活跃值: (85)
能力值: ( LV6,RANK:80 )
在线值:
发帖
回帖
粉丝
3
貌似你没理解我问.我语言表不清..不好意思...
.额..我问的是..那个为什么执行到那句..就自动退出了...
什么问题
2010-7-18 19:47
0
雪    币: 246
活跃值: (25)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
4
  p:欧,是我的搞错了,真不知道这眼干什么去了,楞看不到。lgdt是系统服务的特权指令, 只能在 ring0层运行, 可能是你在ring3运行的问题。
2010-7-18 20:10
0
雪    币: 306
活跃值: (85)
能力值: ( LV6,RANK:80 )
在线值:
发帖
回帖
粉丝
5
- -.懂了...谢谢了...
那必须安装纯dos系统吗?才能模拟这些代码?还是直接...在pl上改就行了?
2010-7-18 21:32
0
雪    币: 246
活跃值: (25)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
6
关键是获取ring0权限,dos是一种方法,驱动程序也有ring0权限,如果是为了学习书中de代码,还是DOS好。下面网址有一个在freeDOS调试这段代码讨论,可参考。顺便请教一下,“pl”指什么?漂亮?。。。,望赐教。
http://www.oldlinux.org/oldlinux/viewthread.php?tid=11640
2010-7-18 22:45
0
雪    币: 306
活跃值: (85)
能力值: ( LV6,RANK:80 )
在线值:
发帖
回帖
粉丝
7
DPL...是段的权限标志...- -.
谢谢.我要freedos试试..
2010-7-19 12:03
0
游客
登录 | 注册 方可回帖
返回
//