如何在windows程序中读取bios内容

2016-02-19 16:40 43 1 收藏

下面是个超简单的如何在windows程序中读取bios内容教程,图老师小编精心挑选推荐,大家行行好,多给几个赞吧,小编吐血跪求~

【 tulaoshi.com - 编程语言 】

  今天和夜月兄讨论了一下在windows nt/2000/xp下如何读取bios信息,现在把结果向大家汇报一下。

  大家都知道,windows接管了对物理内存的直接存取,而bios信息存在物理内存的f000:0000处,关键就是如何读取物理内存。

  查阅了msdn的文章后,发现以下有几个函数和物理内存访问有关:

  

NTSTATUS ZwOpenSection(OUT PHANDLE SectionHandle, IN ACCESS_MASK DesiredAccess,IN POBJECT_ATTRIBUTES ObjectAttributes);NTSTATUS ZwMapViewOfSection(IN HANDLE SectionHandle,              IN HANDLE ProcessHandle,              IN OUT PVOID *BaseAddress,              IN ULONG ZeroBits,              IN ULONG CommitSize,              IN OUT PLARGE_INTEGER SectionOffset OPTIONAL,              IN OUT PSIZE_T ViewSize,              IN SECTION_INHERIT InheritDisposition,              IN ULONG AllocationType,              IN ULONG Protect              );NTSTATUS ZwUnmapViewOfSection(IN HANDLE ProcessHandle,IN PVOID BaseAddress);

  用到的结构定义如下

  

typedef struct _UNICODE_STRING { USHORT Length;//长度 USHORT MaximumLength;//最大长度 PWSTR Buffer;//缓存指针,访问物理内存时,此处指向UNICODE字符串"devicephysicalmemory"} UNICODE_STRING,*PUNICODE_STRING;typedef struct _OBJECT_ATTRIBUTES {  ULONG Length;//长度 18h  HANDLE RootDirectory;// 00000000  PUNICODE_STRING ObjectName;//指向对象名的指针  ULONG Attributes;//对象属性00000040h  PVOID SecurityDescriptor;    // Points to type SECURITY_DESCRIPTOR,0  PVOID SecurityQualityOfService; // Points to type SECURITY_QUALITY_OF_SERVICE,0} OBJECT_ATTRIBUTES;typedef OBJECT_ATTRIBUTES *POBJECT_ATTRIBUTES;

(本文来源于图老师网站,更多请访问https://www.tulaoshi.com/bianchengyuyan/)

  函数说明

  第一个函数ZwOpenSection用来打开section,第一个参数是指向HANDLE变量的指针,第二个是访问参数,第三个是指向OBJECT_ATTRIBUTES的指针

  第二个函数ZwMapViewOfSection用来建立物理内存和当前进程的一段物理内存的联系,参数很多,一会在例程里再详细解释

  第三个函数ZwUnmapViewOfSection用来断开物理内存和当前进程中的映射断开联系,第一个参数是进程句柄,必须掉用第二个函数时一样,第二

(本文来源于图老师网站,更多请访问https://www.tulaoshi.com/bianchengyuyan/)

  个是当前进程中映射的基址,由ZwMapViewOfSection返回

  这三个函数都在ntdll.dll中,msdn里的帮助说这几个函数用在驱动编制上。

  例程如下

  

//结构定义typedef struct _UNICODE_STRING { USHORT Length;//长度 USHORT MaximumLength;//最大长度 PWSTR Buffer;//缓存指针} UNICODE_STRING,*PUNICODE_STRING;typedef struct _OBJECT_ATTRIBUTES {  ULONG Length;//长度 18h  HANDLE RootDirectory;// 00000000  PUNICODE_STRING ObjectName;//指向对象名的指针  ULONG Attributes;//对象属性00000040h  PVOID SecurityDescriptor;    // Points to type SECURITY_DESCRIPTOR,0  PVOID SecurityQualityOfService; // Points to type SECURITY_QUALITY_OF_SERVICE,0} OBJECT_ATTRIBUTES;typedef OBJECT_ATTRIBUTES *POBJECT_ATTRIBUTES;//函数指针变量类型生命typedef DWORD (__stdcall *ZWOS)(PHANDLE,ACCESS_MASK,POBJECT_ATTRIBUTES);typedef DWORD (__stdcall *ZWMV)(HANDLE,HANDLE,PVOID,ULONG,ULONG,PLARGE_INTEGER,PSIZE_T,DWORD,ULONG,ULONG);typedef DWORD (__stdcall *ZWUMV)(HANDLE,PVOID);//以上在程序开始定义全局变量处定义//以下在程序的主函数里//变量声明    UNICODE_STRING struniph;  OBJECT_ATTRIBUTES obj_ar;  ZWOS ZWopenS;  ZWMV ZWmapV;  ZWUMV ZWunmapV;  HANDLE hSection;  DWORD ba;  LARGE_INTEGER so;  SIZE_T ssize;  so.LowPart=0x000f0000;//物理内存的基址,就是f000:0000  so.HighPart=0x00000000;  ssize=0xffff;  wchar_t strPH[30]=L"devicephysicalmemory";//变量初始化    ba=0;//联系后的基址将在这里返回    struniph.Buffer=strPH;  struniph.Length=0x2c;//注意大小是按字节算  struniph.MaximumLength =0x2e;//也是字节    obj_ar.Attributes =64;//属性  obj_ar.Length =24;//OBJECT_ATTRIBUTES类型的长度  obj_ar.ObjectName=&struniph;//指向对象的指针  obj_ar.RootDirectory=0;  obj_ar.SecurityDescriptor=0;    obj_ar.SecurityQualityOfService =0;//读入ntdll.dll,得到函数地址    hinstLib = LoadLibrary("ntdll.dll");  ZWopenS=(ZWOS)GetProcAddress(hinstLib,"ZwOpenSection");    ZWmapV=(ZWMV)GetProcAddress(hinstLib,"ZwMapViewOfSection");  ZWunmapV=(ZWUMV)GetProcAddress(hinstLib,"ZwUnmapViewOfSection");//调用函数,对物理内存进行映射    ZWopenS(&hSection,4,&obj_ar);  ZWmapV(       (HANDLE)hSection, //打开Section时得到的句柄       (HANDLE)0xffffffff, //将要映射进程的句柄,       &ba, //映射的基址       0, //没怎么看明白,设为0就好了       0xffff, //分配的大小       &so, //物理内存的地址       &ssize, //指向读取内存块大小的指针       1, //子进程的可继承性设定       0, //分配类型       2 //保护类型       );    //执行后会在当前进程的空间开辟一段64k的空间,并把f000:0000到f000:ffff处的内容映射到这里    //映射的基址由ba返回,如果映射不在有用,应该用ZwUnmapViewOfSection断开映射

  BTW:

  思路主要是来之上次跟踪的联想的安装验证程序,真的要感谢联想的技术人员了:-)。

本文示例代码或素材下载

来源:https://www.tulaoshi.com/n/20160219/1612738.html

延伸阅读
标签: Web开发
jQuery是一个快速的,简洁的javaScript库,使用户能更方便地处理HTML documents、events、实现动画效果,并且方便地为网站或系统提供AJAX交互。 在Domino中应用jQuery框架能够大量简化js代码,并使得js的程序更加简洁和直观,下面是一个简单的例子,在表单中简单运用jQuery来读取视图内容。 1.在表单中加入以下代码并内置HTML: html 代码: ...
标签: 电脑入门
1、在系统下同时按住键盘上 Windows徽标 键和 X 键,在系统工具快捷入口打开控制面板。参考下图所示 2、在控制面板中选择网络和Internet。参考下图所示 3、点击网络和共享中心。参考下图所示 4、在网络和共享中心中选择更改高级共享设置。参考下图所示 5、在不同的网络位置中有不同的配置文件。如在办公室等场所的工作网络一般...
标签: ASP
  /* 豆腐制作 都是精品 http://www.asp888.net 豆腐技术站 如转载 请保留完整版权信息 */ 在做网络追捕的时候,经常遇到这样的问题,是否需要将IP 地址重新输入一次的问题,所以在这里我考虑如何使用剪贴板的问题 幸好在IE的HTML扩展DOM中有这样的功能,我公享出来,大家一同分享。 <HTML <HEAD <SCRIPT LANGUAGE="JScript...
标签: SQLServer
  任何基于锁的并发系统的一个不可避免的特点是在某些条件下系统可能阻塞。当一个连接占有一个锁而另一个连接试图改变锁的状态时,第二个连接要么等待第一个连接释放锁,要么因此而被阻塞。 为了获得最好的可扩展性,性能和并发能力,在设计应用程序和查询语句时,应该注意尽量缩短事务的长度, 并且减少占有锁的时间。大多数并发问题往...
标签: 电脑入门
如果想关闭开始屏幕中打开的应用,可以将鼠标移动至屏幕顶部,当鼠标箭头变成小手时,点住并向下拖拽至屏幕底部后松手,便可以关闭当前浏览的应用。 操作步骤: 方法一 1、将鼠标移动至屏幕顶部,鼠标箭头变成小手; 2、点住并往下拖拽小手,至屏幕底部后松手; 3、拖拽至底部后松手,即可关闭程序,回到开始界面; 方法二 1、在系...

经验教程

171

收藏

45
微博分享 QQ分享 QQ空间 手机页面 收藏网站 回到头部