开启辅助访问 切换到宽版

精易论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

用微信号发送消息登录论坛

新人指南 邀请好友注册 - 我关注人的新帖 教你赚取精币 - 每日签到


求职/招聘- 论坛接单- 开发者大厅

论坛版规 总版规 - 建议/投诉 - 应聘版主 - 精华帖总集 积分说明 - 禁言标准 - 有奖举报

查看: 4679|回复: 5
收起左侧

[易源码分享] 【汇编】利用驱动程序读取BIOS

[复制链接]
结帖率:100% (2/2)
发表于 2010-1-1 21:51:10 | 显示全部楼层 |阅读模式   山西省吕梁市
用BIOS的内容作为硬标记进行加密,应用程序可以通过检测bios的特定内容,如主板日期、厂家信息等。如果符合要求,就让程序正常运行;如不符合要求,就判断为盗版,禁止运行。这样可以

起到一定的加密锁的作用。
     如何得到bios的内容呢?我们已经通过驱动程序进入ring0,在ring0中是无所不能的,有一个简单的函数,可以帮助我们达到目的。它就是MmMapIoSpace函数,在DDK文档中看到该函数的说明如下

:
PVOID MmMapIoSpace(
IN PHYSICAL_ADDRESS PhysicalAddress,
IN ULONG NumberOfBytes,
IN MEMORY_CACHING_TYPE CacheType );
在Masm32v8中声明的有4个形参
MmMapIoSpace    proto stdcall :DWORD, :DWORD, :DWORD, :DWORD
为什么参数个数会有不同呢?
原因是MmMapIoSpace第一个参数传递的是一个结构而非结构的指针,而该结构实际的大小是 2 个双字,结果在masm32中表现为总共4个 dword 参数。
调用非常简单,invoke MmMapIoSpace,物理地址低32位,0,长度,MmNonCached
若成功该函数返回影射后的线性地址,否则返回NULL。这样就可以间接达到读取物理地址中内容的目的。

bios开始地址在实模式下是F000:0,也就是0f0000h,长度是64k,也就是10000h
这样我们就可以用一句 invoke MmMapIoSpace,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下调试通过。



  1. ;goto make
  2. ;文件名bios_test.bat   2009年10月20日用masm32v8和kmdkit1.8在winxp及vista下调试成功。
  3. .386
  4. .model flat, stdcall
  5. option casemap:none
  6. include \masm32\include\w2k\ntstatus.inc
  7. include \masm32\include\w2k\ntddk.inc
  8. include \masm32\include\w2k\ntoskrnl.inc
  9. includelib \masm32\lib\w2k\ntoskrnl.lib
  10. include \masm32\Macros\Strings.mac

  11. IOCTL_GET_INFO equ CTL_CODE(FILE_DEVICE_UNKNOWN, 800h, METHOD_BUFFERED, FILE_READ_ACCESS + FILE_WRITE_ACCESS)


  12. .const
  13. CCOUNTED_UNICODE_STRING    "\\Device\\bios_test", g_usDeviceName, 4
  14. CCOUNTED_UNICODE_STRING    "\\??\\bios_test", g_usSymbolicLinkName, 4


  15. .data
  16. buff1  db 128*512 dup (0f6h) ;
  17. key_1  db 32 dup (0) ;


  18. .code

  19. ;:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
  20. ;                                   DispatchCreateClose                                             
  21. ;:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::

  22. DispatchCreateClose proc pDeviceObject:PDEVICE_OBJECT, pIrp:PIRP

  23.     ; CreateFile was called, to get driver handle
  24.     ; CloseHandle was called, to close driver handle
  25.     ; In both cases we are in user process context here

  26.     mov eax, pIrp
  27.     assume eax:ptr _IRP
  28.     mov [eax].IoStatus.Status, STATUS_SUCCESS
  29.     and [eax].IoStatus.Information, 0
  30.     assume eax:nothing

  31.     fastcall IofCompleteRequest, pIrp, IO_NO_INCREMENT

  32.     mov eax, STATUS_SUCCESS
  33.     ret

  34. DispatchCreateClose endp

  35. ;:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
  36. ;                                     DispatchControl                                               
  37. ;:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::

  38. DispatchControl proc uses esi edi pDeviceObject:PDEVICE_OBJECT, pIrp:PIRP

  39. local status:NTSTATUS
  40. local dwBytesReturned:DWORD    ;实际返回的字节数

  41.     and dwBytesReturned, 0

  42.     mov esi, pIrp
  43.     assume esi:ptr _IRP

  44.     IoGetCurrentIrpStackLocation esi
  45.     mov edi, eax
  46.     assume edi:ptr IO_STACK_LOCATION

  47.     .if [edi].Parameters.DeviceIoControl.IoControlCode == IOCTL_GET_INFO
  48.         .if [edi].Parameters.DeviceIoControl.OutputBufferLength >= 30

  49.             mov eax, [esi].AssociatedIrp.SystemBuffer
  50.                      
  51.                        pushad
  52.                        push eax
  53.                        mov esi,eax
  54.                        mov ecx,30
  55.                        mov edi,offset key_1
  56.                        cld
  57.                        rep movsb  ;保存传过来的数据到key_1,以备做密钥,加密数据后返回。
  58.                        

  59.                       invoke MmMapIoSpace,0f0000h,0,64*1024,MmNonCached ;物理地址映射为线性地址,返回值在eax
  60.                       cmp eax,0   ;eax==0,失败
  61.                       jnz   next_1
  62.                       jmp next_2
  63.             next_1:     
  64.                         mov esi,eax
  65.                         pop edi
  66.                         mov ecx,10000h
  67.                         rep movsb
  68.                         popad

  69.             mov dwBytesReturned, 128*512
  70.             mov status, STATUS_SUCCESS
  71.             jmp next_3
  72.             next_2:pop eax
  73.                    popad
  74.                    mov status, STATUS_INVALID_DEVICE_REQUEST
  75.             next_3:
  76.         .else
  77.             mov status, STATUS_BUFFER_TOO_SMALL
  78.         .endif
  79.     .else
  80.         mov status, STATUS_INVALID_DEVICE_REQUEST
  81.     .endif

  82.     assume edi:nothing

  83.     push status
  84.     pop [esi].IoStatus.Status

  85.     push dwBytesReturned
  86.     pop [esi].IoStatus.Information

  87.     assume esi:nothing

  88.     fastcall IofCompleteRequest, esi, IO_NO_INCREMENT

  89.     mov eax, status
  90.     ret

  91. DispatchControl endp

  92. ;:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
  93. ;                                       DriverUnload                                                
  94. ;:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::

  95. DriverUnload proc pDriverObject:PDRIVER_OBJECT

  96.     ; ControlService,,SERVICE_CONTROL_STOP was called
  97.     ; We are in System process (pid = 8) context here

  98.     invoke IoDeleteSymbolicLink, addr g_usSymbolicLinkName

  99.     mov eax, pDriverObject
  100.     invoke IoDeleteDevice, (DRIVER_OBJECT PTR [eax]).DeviceObject

  101.     ret

  102. DriverUnload endp

  103. ;:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
  104. ;                              D I S C A R D A B L E   C O D E                                      
  105. ;:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::

  106. .code INIT

  107. ;:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
  108. ;                                       DriverEntry                                                
  109. ;:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::

  110. DriverEntry proc pDriverObject:PDRIVER_OBJECT, pusRegistryPath:PUNICODE_STRING

  111.     ; StartService was called
  112.     ; We are in System process (pid = 8) context here

  113. local status:NTSTATUS
  114. local pDeviceObject:PDEVICE_OBJECT

  115.     mov status, STATUS_DEVICE_CONFIGURATION_ERROR

  116.     invoke IoCreateDevice, pDriverObject, 0, addr g_usDeviceName, FILE_DEVICE_UNKNOWN, 0, FALSE, addr pDeviceObject
  117.     .if eax == STATUS_SUCCESS
  118.         invoke IoCreateSymbolicLink, addr g_usSymbolicLinkName, addr g_usDeviceName
  119.         .if eax == STATUS_SUCCESS
  120.             mov eax, pDriverObject
  121.             assume eax:ptr DRIVER_OBJECT
  122.             mov [eax].MajorFunction[IRP_MJ_CREATE*(sizeof PVOID)],            offset DispatchCreateClose
  123.             mov [eax].MajorFunction[IRP_MJ_CLOSE*(sizeof PVOID)],            offset DispatchCreateClose
  124.             mov [eax].MajorFunction[IRP_MJ_DEVICE_CONTROL*(sizeof PVOID)],    offset DispatchControl
  125.             mov [eax].DriverUnload,offset DriverUnload
  126.             assume eax:nothing
  127.             mov status, STATUS_SUCCESS
  128.         .else
  129.             invoke IoDeleteDevice, pDeviceObject
  130.         .endif
  131.     .endif

  132.     mov eax, status
  133.     ret

  134. DriverEntry endp

  135. ;:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
  136. ;                                                                                                   
  137. ;:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::

  138. end DriverEntry

  139. :make

  140. set drv=bios_test

  141. \masm32\bin\ml /nologo /c /coff %drv%.bat
  142. \masm32\bin\link /nologo /driver /base:0x10000 /align:32 /out:%drv%.sys /subsystem:native /ignore:4078 %drv%.obj

  143. del %drv%.obj

  144. pause

复制代码



  1. ;文件名bios_test.asm   2009年10月20日用masm32v8和kmdkit1.8在WinXP及vista下调试成功

  2. ;在winxp下用驱动程序读取bios
  3. .386
  4. .model flat, stdcall
  5. option casemap:none

  6. ;:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
  7. ;                                  I N C L U D E   F I L E S                                       
  8. ;:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::

  9. include \masm32\include\windows.inc

  10. include \masm32\include\kernel32.inc
  11. include \masm32\include\user32.inc
  12. include \masm32\include\advapi32.inc

  13. includelib \masm32\lib\kernel32.lib
  14. includelib \masm32\lib\user32.lib
  15. includelib \masm32\lib\advapi32.lib

  16. include \masm32\include\winioctl.inc

  17. include \masm32\Macros\Strings.mac

  18. IOCTL_GET_INFO equ CTL_CODE(FILE_DEVICE_UNKNOWN, 800h, METHOD_BUFFERED, FILE_READ_ACCESS + FILE_WRITE_ACCESS)
  19. ; Macro definition for defining IOCTL and FSCTL function control codes.  Note
  20. ; that function codes 0-2047 are reserved for Microsoft Corporation, and
  21. ; 2048-4095 are reserved for customers.
  22. ;CTL_CODE MACRO DeviceType:=<0>, Function:=<0>, Method:=<0>, Access:=<0>
  23. ;    EXITM %(((DeviceType) SHL 16) OR ((Access) SHL 14) OR ((Function) SHL 2) OR (Method))
  24. ;ENDM


  25. .const
  26. .data
  27. sysname db "bios_test.sys",0     ;驱动程序名
  28. device db "bios_test",0
  29. driver db "bios_test Driver",0
  30. abyInBuffer db 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,111,128,128,180,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16;传输试验数据用
  31. abyOutBuffer db 128*512 dup(0)   ;用于存放驱动传回的64kbios数据
  32. name_buffer db 'bios_tst.bin',0  ;读取的bios数据保存到bios_tst.bin
  33. ok_1 db "读取成功,请查看bios_tst.bin",0
  34. dwBytesReturned dd 0
  35. .data?
  36. hFile HANDLE ?        ;文件句柄
  37. SizeReadWrite DWORD ? ;文件中实际写入的字节数
  38. .code

  39. ;:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
  40. ;                                       start                                                      
  41. ;:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::

  42. start proc uses esi edi

  43. local hSCManager:HANDLE
  44. local hService:HANDLE
  45. local acModulePath[MAX_PATH]:CHAR
  46. local _ss:SERVICE_STATUS
  47. local hDevice:HANDLE

  48. local acVersion[16]:CHAR

  49.     ; Open a handle to the SC Manager database
  50.     invoke OpenSCManager, NULL, NULL, SC_MANAGER_ALL_ACCESS
  51.     .if eax != NULL
  52.         mov hSCManager, eax

  53.         ;invoke GetCurrentDirectory, sizeof g_acBuffer, addr g_acBuffer
  54.         push eax
  55.         invoke GetFullPathName, addr sysname, sizeof acModulePath, addr acModulePath, esp
  56.         pop eax

  57.         ; Install service
  58.         invoke CreateService, hSCManager, addr device, addr driver, \
  59.             SERVICE_START + SERVICE_STOP + DELETE, SERVICE_KERNEL_DRIVER, SERVICE_DEMAND_START, \
  60.             SERVICE_ERROR_IGNORE, addr acModulePath, NULL, NULL, NULL, NULL, NULL

  61.         .if eax != NULL
  62.             mov hService, eax

  63.             ; Driver's DriverEntry procedure will be called
  64.             invoke StartService, hService, 0, NULL
  65.             .if eax != 0

  66.                 ; Driver will receive I/O request packet (IRP) of type IRP_MJ_CREATE
  67.                 invoke CreateFile, $CTA0("\\\\.\\bios_test"), GENERIC_READ + GENERIC_WRITE, \
  68.                                 0, NULL, OPEN_EXISTING, 0, NULL

  69.                 .if eax != INVALID_HANDLE_VALUE
  70.                     mov hDevice, eax

  71. ;:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::

  72.                     ; Driver will receive IRP of type IRP_MJ_DEVICE_CONTROL
  73.                     invoke DeviceIoControl, hDevice, IOCTL_GET_INFO, addr abyInBuffer, sizeof abyInBuffer, addr abyOutBuffer, sizeof abyOutBuffer, addr dwBytesReturned, NULL

  74.                     .if ( eax != 0 ) && ( dwBytesReturned != 0 )

  75.                      
  76.                         invoke MessageBox, NULL, addr ok_1, $CTA0("bios_test"), MB_OK + MB_ICONINFORMATION

  77.                        invoke CreateFile,ADDR name_buffer,\
  78.              GENERIC_READ or GENERIC_WRITE ,\
  79.              FILE_SHARE_READ or FILE_SHARE_WRITE,\
  80.              NULL,CREATE_ALWAYS,FILE_ATTRIBUTE_ARCHIVE,\
  81.              NULL
  82.     mov hFile,eax
  83.     invoke WriteFile,hFile,ADDR abyOutBuffer,128*512,\
  84.              ADDR SizeReadWrite,NULL
  85.     invoke CloseHandle,hFile

  86.                     tt_3:   
  87.                     .else
  88.                         invoke MessageBox, NULL, $CTA0("发送控制失败."), NULL, MB_OK + MB_ICONSTOP
  89.                     .endif

  90. ;:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::

  91.                     
  92.                     invoke CloseHandle, hDevice  ; Driver will received IRP of type IRP_MJ_CLOSE
  93.                 .else
  94.                     invoke MessageBox, NULL, $CTA0("Device is not present."), NULL, MB_ICONSTOP
  95.                 .endif
  96.                
  97.                 invoke ControlService, hService, SERVICE_CONTROL_STOP, addr _ss
  98.                                         ; DriverUnload proc in our driver will be called
  99.             .else
  100.                 invoke MessageBox, NULL, $CTA0("Can't start driver."), NULL, MB_OK + MB_ICONSTOP
  101.             .endif

  102.             invoke DeleteService, hService
  103.             invoke CloseServiceHandle, hService
  104.         .else
  105.             invoke MessageBox, NULL, $CTA0("Can't register driver."), NULL, MB_OK + MB_ICONSTOP
  106.         .endif
  107.         invoke CloseServiceHandle, hSCManager
  108.     .else
  109.         invoke MessageBox, NULL, $CTA0("Can't connect to Service Control Manager."), NULL, MB_OK + MB_ICONSTOP
  110.     .endif

  111.     invoke ExitProcess, 0

  112. start endp

  113. end start

复制代码



这里读取的bios是经过启动过程初始化后的内容,并不是主板上的bios闪存芯片内的内容,芯片内一般是压缩的,启动过程中自己解压。

通过查看得到的bios_tst.bin,发现有的机器用本程序读出的bios里面有本机的硬盘和光驱型号,这说明bios在启动的过程中,被写入了当前机器的一些信息。机器配置变了,这部分内容也会相应变化,使用bios加密时尽量不要用可变的部分,防止用户换个光驱后被判为盗版软件。



本文是电子管(qq5611409)专为aogo汇编论坛(网址http://www.aogosoft.com/bbs/)所写,转载请保留作者信息和出处。

评分

参与人数 1精币 +2 收起 理由
【微凉清风】 + 2 感谢您的支持,精易有你更精彩!

查看全部评分


结帖率:100% (2/2)
 楼主| 发表于 2010-1-1 22:26:34 | 显示全部楼层   山西省吕梁市
回复 支持 反对

使用道具 举报

结帖率:67% (20/30)
发表于 2012-3-5 21:36:57 | 显示全部楼层   河南省濮阳市
{:3_236:}什么?
回复 支持 反对

使用道具 举报

发表于 2013-9-22 23:07:17 | 显示全部楼层   山东省烟台市
65+5+9
回复 支持 反对

使用道具 举报

结帖率:100% (1/1)
发表于 2021-7-18 22:49:35 | 显示全部楼层   山西省长治市
文件没了。。。
回复 支持 反对

使用道具 举报

头像被屏蔽
发表于 2022-7-7 22:12:20 | 显示全部楼层   辽宁省大连市
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则 致发广告者

发布主题 收藏帖子 返回列表

sitemap| 易语言源码| 易语言教程| 易语言论坛| 诚聘英才| 易语言模块| 手机版| 广告投放| 精易论坛
拒绝任何人以任何形式在本论坛发表与中华人民共和国法律相抵触的言论,本站内容均为会员发表,并不代表精易立场!
论坛帖子内容仅用于技术交流学习和研究的目的,严禁用于非法目的,否则造成一切后果自负!如帖子内容侵害到你的权益,请联系我们!
防范网络诈骗,远离网络犯罪 违法和不良信息举报电话0663-3422125,QQ: 800073686,邮箱:800073686@b.qq.com
Powered by Discuz! X3.4 揭阳市揭东区精易科技有限公司 ( 粤ICP备12094385号-1) 粤公网安备 44522102000125 增值电信业务经营许可证 粤B2-20192173

快速回复 返回顶部 返回列表