📄 rw.asm
字号:
;**************************************************************
;文件:rw.asm *
;功能:在WIN 95/98中访问物理内存 *
;在WIN 95/98里打开DOS窗口,用ALT-ENTER热键切换到全屏幕, *
;在命令行方式下运行此程序。 *
;也可在SOFT-ICE FOR WIN 95/98的全屏方式下按F8单步跟踪看结果。 *
;**************************************************************
.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
.code
Start:
push offset MyProc ;切换到Ring0并调用MyProc
call ToRing0Code ;
call ExitProcess,0 ;退出进程
ToRing0Code proc Ring0Proc:DWORD ;生成调用门,进入Ring0处理程序Ring0Proc
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 处理程序,写指定的物理内存
push AddressToWrite
int 20H ;VxDCall _MapPhysToLinear
dd 0001006cH ;
add esp,4 ;调整堆栈指针
cli
push ds
push es
mov bx,30H ;设定数据段
mov ds,bx ;
mov es,bx ;
cld
mov ecx,DataLeng/4 ;传送数据
mov esi,offset Data ;
mov edi,eax ;
rep movsd ;
pop es
pop ds
sti
RETF ;远程返回
END Start
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -