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

已死五百年

已死五百年

2016-02-19 16:40

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

  今天和夜月兄讨论了一下在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;

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

  函数说明

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

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

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

  个是当前进程中映射的基址,由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"\device\physicalmemory";//变量初始化    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:

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

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

本文示例代码或素材下载

展开更多 50%)
分享

猜你喜欢

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

编程语言 网络编程
如何在windows程序中读取bios内容

如何在bios设置中关闭软驱?

电脑网络
如何在bios设置中关闭软驱?

s8lol主宰符文怎么配

英雄联盟 网络游戏
s8lol主宰符文怎么配

在Applet中读取文件内容

编程语言 网络编程
在Applet中读取文件内容

如何读取XML文件内容

Web开发
如何读取XML文件内容

lol偷钱流符文搭配推荐

英雄联盟 网络游戏
lol偷钱流符文搭配推荐

Windows 7中如何卸载程序?

电脑网络
Windows 7中如何卸载程序?

html中select语句读取mysql表中内容

PHP
html中select语句读取mysql表中内容

lolAD刺客新符文搭配推荐

英雄联盟
lolAD刺客新符文搭配推荐

如何在应用程序忙碌时探测用户的按健

如何在应用程序忙碌时探测用户的按健

php分页类

php分页类
下拉加载更多内容 ↓