利用驱动程序读取BIOS文档格式.docx

上传人:b****1 文档编号:15010785 上传时间:2022-10-26 格式:DOCX 页数:9 大小:19.62KB
下载 相关 举报
利用驱动程序读取BIOS文档格式.docx_第1页
第1页 / 共9页
利用驱动程序读取BIOS文档格式.docx_第2页
第2页 / 共9页
利用驱动程序读取BIOS文档格式.docx_第3页
第3页 / 共9页
利用驱动程序读取BIOS文档格式.docx_第4页
第4页 / 共9页
利用驱动程序读取BIOS文档格式.docx_第5页
第5页 / 共9页
点击查看更多>>
下载资源
资源描述

利用驱动程序读取BIOS文档格式.docx

《利用驱动程序读取BIOS文档格式.docx》由会员分享,可在线阅读,更多相关《利用驱动程序读取BIOS文档格式.docx(9页珍藏版)》请在冰豆网上搜索。

利用驱动程序读取BIOS文档格式.docx

INMEMORY_CACHING_TYPECacheType);

在Masm32v8中声明的有4个形参

MmMapIoSpace 

protostdcall:

DWORD,:

DWORD

为什么参数个数会有不同呢?

原因是MmMapIoSpace第一个参数传递的是一个结构而非结构的指针,而该结构实际的大小是2个双字,结果在masm32中表现为总共4个dword参数。

调用非常简单,invokeMmMapIoSpace,物理地址低32位,0,长度,MmNonCached

若成功该函数返回影射后的线性地址,否则返回NULL。

这样就可以间接达到读取物理地址中内容的目的。

bios开始地址在实模式下是F000:

0,也就是0f0000h,长度是64k,也就是10000h

这样我们就可以用一句invokeMmMapIoSpace,0f0000h,0,64*1024,MmNonCached;

把BIOS的物理地址映射为线性地址,返回值在eax中。

然后把eax指向的线性地址中的内容复制到系统的缓冲区中,让驱动程序传给ring3下的应用程序。

bios_test.bat是驱动源码。

bios_test.asm是调用驱动的ring3级程序,它把驱动传回的bios内容写入文件bios_tst.bin,是16进制的,可以用16进制编辑器来查看。

实际使用时,可以传递一个随机的密钥给驱动程序,驱动程序负责把bios内容加密后返回,这样可以一定程度上增加解密的难度。

程序中已经预留了接口,实现起来很简单,有兴趣者可以自己实现。

以下是程序源代码:

已在xp和vista下调试通过。

;

gotomake

文件名bios_test.bat作者:

盛玉增2009年10月20日用masm32v8和kmdkit1.8在winxp及vista下调试成功。

.386

.modelflat,stdcall

optioncasemap:

none

include\masm32\include\w2k\ntstatus.inc

include\masm32\include\w2k\ntddk.inc

include\masm32\include\w2k\ntoskrnl.inc

includelib\masm32\lib\w2k\ntoskrnl.lib

include\masm32\Macros\Strings.mac

IOCTL_GET_INFOequCTL_CODE(FILE_DEVICE_UNKNOWN,800h,METHOD_BUFFERED,FILE_READ_ACCESS+FILE_WRITE_ACCESS)

.const

CCOUNTED_UNICODE_STRING 

"

\\Device\\bios_test"

g_usDeviceName,4

\\?

?

\\bios_test"

g_usSymbolicLinkName,4

.data

buff1 

db128*512dup(0f6h);

key_1 

db32dup(0);

.code

DispatchCreateClose 

DispatchCreateCloseprocpDeviceObject:

PDEVICE_OBJECT,pIrp:

PIRP

CreateFilewascalled,togetdriverhandle

CloseHandlewascalled,toclosedriverhandle

Inbothcasesweareinuserprocesscontexthere

moveax,pIrp

assumeeax:

ptr_IRP

mov[eax].IoStatus.Status,STATUS_SUCCESS

and[eax].IoStatus.Information,0

nothing

fastcallIofCompleteRequest,pIrp,IO_NO_INCREMENT

moveax,STATUS_SUCCESS

ret

DispatchCreateCloseendp

DispatchControl 

DispatchControlprocusesesiedipDeviceObject:

localstatus:

NTSTATUS

localdwBytesReturned:

DWORD 

实际返回的字节数

anddwBytesReturned,0

movesi,pIrp

assumeesi:

IoGetCurrentIrpStackLocationesi

movedi,eax

assumeedi:

ptrIO_STACK_LOCATION

.if[edi].Parameters.DeviceIoControl.IoControlCode==IOCTL_GET_INFO

.if[edi].Parameters.DeviceIoControl.OutputBufferLength>

=30

moveax,[esi].AssociatedIrp.SystemBuffer

pushad

pusheax

movesi,eax

movecx,30

movedi,offsetkey_1

cld

repmovsb 

保存传过来的数据到key_1,以备做密钥,加密数据后返回。

invokeMmMapIoSpace,0f0000h,0,64*1024,MmNonCached;

物理地址映射为线性地址,返回值在eax

cmpeax,0 

;

eax==0,失败

jnz 

next_1

jmpnext_2

next_1:

movesi,eax

popedi

movecx,10000h

repmovsb

popad

movdwBytesReturned,128*512

movstatus,STATUS_SUCCESS

jmpnext_3

next_2:

popeax

popad

movstatus,STATUS_INVALID_DEVICE_REQUEST

next_3:

.else

movstatus,STATUS_BUFFER_TOO_SMALL

.endif

movstatus,STATUS_INVALID_DEVICE_REQUEST

pushstatus

pop[esi].IoStatus.Status

pushdwBytesReturned

pop[esi].IoStatus.Information

fastcallIofCompleteRequest,esi,IO_NO_INCREMENT

moveax,status

DispatchControlendp

DriverUnload 

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 自然科学 > 数学

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1