利用驱动程序读取BIOS.docx
《利用驱动程序读取BIOS.docx》由会员分享,可在线阅读,更多相关《利用驱动程序读取BIOS.docx(9页珍藏版)》请在冰豆网上搜索。
利用驱动程序读取BIOS
利用驱动程序读取BIOS
用BIOS的内容作为硬标记进行加密,应用程序可以通过检测bios的特定内容,如主板日期、厂家信息等。
如果符合要求,就让程序正常运行;如不符合要求,就判断为盗版,禁止运行。
这样可以
起到一定的加密锁的作用。
如何得到bios的内容呢?
我们已经通过驱动程序进入ring0,在ring0中是无所不能的,有一个简单的函数,可以帮助我们达到目的。
它就是MmMapIoSpace函数,在DDK文档中看到该函数的说明如下
:
PVOIDMmMapIoSpace(
INPHYSICAL_ADDRESSPhysicalAddress,
INULONGNumberOfBytes,
INMEMORY_CACHING_TYPECacheType);
在Masm32v8中声明的有4个形参
MmMapIoSpace protostdcall:
DWORD,:
DWORD,:
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
CCOUNTED_UNICODE_STRING "\\?
?
\\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
assumeeax:
nothing
fastcallIofCompleteRequest,pIrp,IO_NO_INCREMENT
moveax,STATUS_SUCCESS
ret
DispatchCreateCloseendp
;:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
; DispatchControl
;:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
DispatchControlprocusesesiedipDeviceObject:
PDEVICE_OBJECT,pIrp:
PIRP
localstatus:
NTSTATUS
localdwBytesReturned:
DWORD ;实际返回的字节数
anddwBytesReturned,0
movesi,pIrp
assumeesi:
ptr_IRP
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
.else
movstatus,STATUS_INVALID_DEVICE_REQUEST
.endif
assumeedi:
nothing
pushstatus
pop[esi].IoStatus.Status
pushdwBytesReturned
pop[esi].IoStatus.Information
assumeesi:
nothing
fastcallIofCompleteRequest,esi,IO_NO_INCREMENT
moveax,status
ret
DispatchControlendp
;:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
; DriverUnload