📄 dp.asm
字号:
;******************************************
;文件:dp.asm *
;功能:用禁止分页的方法访问物理内存 *
;******************************************
.386p
.model flat,stdcall
include win32.inc
extrn ExitProcess:PROC
CALL32 MACRO selector ,offsetv
DB 09AH
DD offsetv
DW selector
ENDM
AddressToWrite equ 0B8000H ;要写的地址
.data
Data dw 10*80 dup (0e41H) ;要写的数据
DataLeng = $-Data
Temp0 db 4096 dup (?) ;存放0页的内容
.code
Start:
push offset MyProc ;切换到Ring0并调用MyProc
call ToRing0Code ;
call ExitProcess,0 ;退出进程
ToRing0Code proc Ring0Proc:DWORD
LOCAL Temp,Temp1
call GetLdtAddress ;取出LDT的地址,返回结果在eax中
mov ecx,[eax] ;保存LDT第一个描述符
mov [Temp],ecx ;
mov ecx,[eax+4] ;
mov [Temp1],ecx ;
mov edx,Ring0Proc ;把调用门的内容写入LDT
mov [eax],dx ;偏移量的低16位
mov word ptr [eax+2],28h ;段选择子
mov word ptr [eax+4],0ec00h ;属性
shr edx,16 ;偏移量的高16位
mov [eax+6],dx ;
push eax
CALL32 7,0 ;调用 Ring0 子程序
pop ebx
mov edx,[Temp] ;恢复LDT第一个描述符
mov [ebx],edx ;
mov edx,[Temp1] ;
mov [ebx+4],edx ;
ret
ToRing0Code endp
GetLdtAddress proc ;取LDT的地址
push ebx ;先要取GDT的地址
sgdt [esp-2] ;
pop ebx ;
sldt ax ;取LDT内容
and eax,0fff8H ;屏蔽掉低3位、eax的高16位清0
add ebx,eax ;算出LDT描述符的位置
mov eax,[ebx+2] ;从描述符中取出LDT的地址
mov dl,[ebx+7] ;
shl edx,24 ;
and eax,0ffffffh ;
or eax,edx ;
ret
GetLdtAddress endp
MyProc: ;Ring0 处理程序,写指定的物理内存
cli
push ds
push es
mov bx,30H ;设定数据段
mov ds,bx ;
mov es,bx ;
cld
mov ecx,4096/4 ;保存0页的内容
mov edi,offset Temp0
mov esi,0
rep movsd
mov ecx,To0Length/4+1 ;送代码到0页
mov esi,offset To0Code
mov edi,0
rep movsd
mov ecx,DataLeng/4+1 ;送数据到0页
mov esi,offset Data
rep movsd
mov eax,0 ;跳转到地址0处执行
jmp eax ;
SendOK:
mov ecx,4096/4 ;恢复0页内容
mov esi,offset Temp0
mov edi,0
rep movsd
pop es
pop ds
sti
RETF ;远程返回
To0Code: ;这些代码将送往地址0处执行
mov eax,cr0 ;禁止分页
and eax,07FFFFFFFH
mov cr0,eax
jmp short DisP
DisP:
mov ecx,DataLeng/4 ;送数据到指定的物理地址
mov esi,(To0Length/4+1)*4
mov edi,AddressToWrite
rep movsd
or eax,080000000H ;Enable分页机制
mov cr0,eax
jmp short EP
EP: mov eax,offset SendOK ;跳回SendOK处执行
jmp eax
To0Length=$-To0Code
end Start
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -