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

📄 dp.asm

📁 windows下汇编语言 学习汇编语言好助手
💻 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 + -