在线等待,如何得到主板BIOS的序列号,谢谢! 在线等待,如何得到主板BIOS的序列号,谢谢! 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 随便搜索的,贴出来 ,不知道行不行,没有看~ --------------------------------------------下面这篇是以前收集的,觉得应该有帮助。Windows 2000 下通过访问物理地址取主机唯一信息Author: sinisterEmail: [email protected]Homepage:http://www.whitecell.org 在9x下取得主版序列号非常简单,但此方法在NT/2K下行不通。还好NT/2K下 提供了 \Device\PhysicalMemory 设备,通过它可以得到物理地址。在9x下 通过访问地址 FEC71H 可以得到主板序列号。NT/2K下虽不保证是主板序列号, 但经过多台机器反复测试,此地址的值是不变且唯一的。下面是我 DRIVE 中 取主机唯一信息的代码,错误之处还望各位指正。 代码:BOOLEAN MainBoardBiosSerialNo(){HANDLE physmem;UNICODE_STRING physmemString;OBJECT_ATTRIBUTES attributes;WCHAR physmemName[] = L"\\Device\\PhysicalMemory";NTSTATUS ntStatus;DWORD RAdd = 0xFEC71;DWORD LAdd = 100;DWORD OAdd;DWORD i;RtlInitUnicodeString( &physmemString, physmemName );InitializeObjectAttributes( &attributes, &physmemString,OBJ_CASE_INSENSITIVE,NULL, NULL);ntStatus = ZwOpenSection( &physmem, SECTION_MAP_READ, &attributes);if( !NT_SUCCESS( ntStatus )){ DbgPrint("ZwOpenSection() is error\n");return FALSE;}DbgPrint("ZwOpenSection() is OK\n");if (!MapView(physmem,&RAdd,&LAdd,&OAdd)){ DbgPrint("MapView() is error\n");return FALSE;}DbgPrint("MapView() is OK\n");for ( i = 0; i < LAdd; i ++){DbgPrint("%x",*(PUCHAR)(OAdd + i));}ntStatus = ZwUnmapViewOfSection( (HANDLE) -1, (PVOID) OAdd );if( !NT_SUCCESS(ntStatus)){DbgPrint("Unable to unmap view");return FALSE;} return TRUE;}BOOLEAN MapView( HANDLE HPMemory,DWORD *dwAddress,DWORD *dwLength,DWORD *dwVAddress ){NTSTATUS Status;PHYSICAL_ADDRESS ViewBaseAddress;*dwVAddress = 0;ViewBaseAddress.QuadPart = (ULONGLONG) (*dwAddress);Status = ZwMapViewOfSection ( HPMemory,(HANDLE) -1,(PVOID)dwVAddress,0,*dwLength,&ViewBaseAddress,dwLength,ViewShare,0,PAGE_READONLY);if( !NT_SUCCESS( Status )){return FALSE;}return TRUE;} 再贴一个http://www.5iv.net/data/web5008/20050227/20050227__3011239.html 我没有验证的~ 使用WINIO库.HANDLE hPhyMem;PBYTE lpInfo = MapPhysToLin((PBYTE)0xf0000,65536,&hPhyMem);CString string;string.Format ( "Bois序列号:%s" , lpInfo+0xec71);MessageBox ( string ) ; 系统的SN被写在DMI表的Type 1中,当然DMI表中还有很多信息。去找一个DMI的规范,先搞清楚DMI再说。PS,在windows的cmd中,用debug就可以查看DMI表。操作如下:-s F000:0 FFFF "_SM_"F000:71C0 (这是我的电脑上的值,每台机器应该有所不同)-d f000:71c0........... (此处省略n个字节)(说明:上面表从开始处偏移0x18处的一个字是DMI表的偏移量,0x1A处的一个字是DMI表的段地址)(本人电脑上是10 00 0E 00,那么DMI Offset:0010,DMI Segment:E000,记住段地址的构成方法噢)-d e000:0010(看看吧!这就是整个系统的信息啊!这里的系统不是指OS,而是硬件系统。DMI表很大,多d几次吧!)(具体这些数据都是什么意思,这里就不讲了,还挺复杂的,下个DMI规范看看就明白了)注,如果是有人用的电脑是ATI芯片组的话,运气就不这么好了,因为DMI表被放在了只在保护模式中才能访问的地址空间了,debug无能为力了。要想写程序得到DMI表的话,就要想办法如何访问内存地址,用winio是个简单的方法,其实winio也是用的\\Device\\PhysicalMemory,只是做了封装而已。 读出bios后怎么读主板BIOS的序列号呢? 通过string.Format ( "Bois序列号:%s" , lpInfo+0xec71);方式得到的结果是“怦?YJQ? ?傝?Y囿u”,而不是网上其他文章里的格式i815-ITE87X2-6A69RPQRS-00非常好,好像是乱码 是ibm bios的问题,amd的结果正确 我上面介绍的方法是通用的,这是计算机界的标准,不论是ibm、还是hp、还是nec等等,所有公司都必须遵循这个标准。之所以:------------------------通过string.Format ( "Bois序列号:%s" , lpInfo+0xec71);方式得到的结果是“怦?YJQ? ?傝?Y囿u”,而不是网上其他文章里的格式i815-ITE87X2-6A69RPQRS-00非常好,好像是乱码------------------------是ibm bios的问题,amd的结果正确------------------------就是因为那些bios都是按照DMI规范来填DMI表的,但具体的数值有所不同罢了! ibm机器在0x6f8d 而dell的机器又不同 http://www.phoenix.com/NR/rdonlyres/51EEA1E6-20C1-4FA2-A3D8-AD8E45335C47/0/specssmbios.pdf 谢谢,我已经看过了,但对如何编程读取还是不明白,而且我用debug显示的信息也好像不太对我的地址显示00 c0 f7 1f 我用-d 1ff7:c000显示都是0 我对你所说“要想写程序得到DMI表的话,就要想办法如何访问内存地址,用winio是个简单的方法,其实winio也是用的\\Device\\PhysicalMemory,只是做了封装而已。”不太明白,用winio HANDLE hPhyMem;PBYTE lpInfo = MapPhysToLin((PBYTE)0xf0000,65536,&hPhyMem);CString string;string.Format ( "Bois序列号:%s" , lpInfo+0xec71);但是ibm的偏移不是0xed71 呵呵!忘记说明了:显示的地址的后两个字节为0? 00的形式时,才能构成段地址,方法是000?左移12位构成段地址?000。而当不是这种形式时,debug就无能为力了。比如00 c0 f7 1f,这时的地址是32位的1ff7c000。用winio应该可以读的到。 win32中读取DMI的通用方法如下:1.在内存地址[0x000f0000,0x000fffff]的范围内搜索"_SM_"的地址,例如得到结果为0x000f71c0。2.取地址0x000f71c0+0x18处的一个双字,例如0x1ff7c000。3.这个地址0x1ff7c000,就是DMI表的起始地址。然后根据DMI规范对DMI表进行分析,得到你所想要的信息。 VC6.0,WIN7/VISTA下,如何使程序自己"以ADMINISTRATOR身份运行"? 求MFC按钮操作TXT文件的程序 谁用VC2008反过汇编,来研究点小问题 tab 没法响应WM_SIZE 请教wininet编程的机理! 关于获取图标 一个基本文件操作问题?讲一下具体操作有分? 按ESC键时,会产生什么消息,谁将recieve这个消息。 edit box及List box使用问题 VC做一个Agent取得SQL Server2000的信息,请大家给方案!谢谢 MFC 与 WTL能混用吗? 请问如何写代码添加 、删除一个LISTBOX中出现的滚动条啊?
--------------------------------------------
下面这篇是以前收集的,觉得应该有帮助。Windows 2000 下通过访问物理地址取主机唯一信息
Author: sinister
Email: [email protected]
Homepage:http://www.whitecell.org
在9x下取得主版序列号非常简单,但此方法在NT/2K下行不通。还好NT/2K下
提供了 \Device\PhysicalMemory 设备,通过它可以得到物理地址。在9x下
通过访问地址 FEC71H 可以得到主板序列号。NT/2K下虽不保证是主板序列号,
但经过多台机器反复测试,此地址的值是不变且唯一的。下面是我 DRIVE 中
取主机唯一信息的代码,错误之处还望各位指正。 代码:BOOLEAN MainBoardBiosSerialNo()
{HANDLE physmem;
UNICODE_STRING physmemString;
OBJECT_ATTRIBUTES attributes;
WCHAR physmemName[] = L"\\Device\\PhysicalMemory";NTSTATUS ntStatus;
DWORD RAdd = 0xFEC71;
DWORD LAdd = 100;
DWORD OAdd;
DWORD i;
RtlInitUnicodeString( &physmemString, physmemName );InitializeObjectAttributes( &attributes,
&physmemString,
OBJ_CASE_INSENSITIVE,
NULL,
NULL
);
ntStatus = ZwOpenSection( &physmem,
SECTION_MAP_READ,
&attributes
);if( !NT_SUCCESS( ntStatus ))
{
DbgPrint("ZwOpenSection() is error\n");
return FALSE;
}DbgPrint("ZwOpenSection() is OK\n");if (!MapView(physmem,&RAdd,&LAdd,&OAdd))
{
DbgPrint("MapView() is error\n");
return FALSE;
}DbgPrint("MapView() is OK\n");for ( i = 0; i < LAdd; i ++)
{
DbgPrint("%x",*(PUCHAR)(OAdd + i));}ntStatus = ZwUnmapViewOfSection( (HANDLE) -1, (PVOID) OAdd );if( !NT_SUCCESS(ntStatus))
{
DbgPrint("Unable to unmap view");
return FALSE;
}
return TRUE;
}
BOOLEAN MapView( HANDLE HPMemory,DWORD *dwAddress,DWORD *dwLength,DWORD *dwVAddress )
{
NTSTATUS Status;
PHYSICAL_ADDRESS ViewBaseAddress;*dwVAddress = 0;
ViewBaseAddress.QuadPart = (ULONGLONG) (*dwAddress);Status = ZwMapViewOfSection ( HPMemory,
(HANDLE) -1,
(PVOID)dwVAddress,
0,
*dwLength,
&ViewBaseAddress,
dwLength,
ViewShare,
0,
PAGE_READONLY
);if( !NT_SUCCESS( Status ))
{
return FALSE;
}return TRUE;
}
HANDLE hPhyMem;
PBYTE lpInfo = MapPhysToLin((PBYTE)0xf0000,65536,&hPhyMem);
CString string;
string.Format ( "Bois序列号:%s" , lpInfo+0xec71);
MessageBox ( string ) ;
-s F000:0 FFFF "_SM_"
F000:71C0 (这是我的电脑上的值,每台机器应该有所不同)
-d f000:71c0
........... (此处省略n个字节)
(说明:上面表从开始处偏移0x18处的一个字是DMI表的偏移量,0x1A处的一个字是DMI表的段地址)
(本人电脑上是10 00 0E 00,那么DMI Offset:0010,DMI Segment:E000,记住段地址的构成方法噢)
-d e000:0010
(看看吧!这就是整个系统的信息啊!这里的系统不是指OS,而是硬件系统。DMI表很大,多d几次吧!)
(具体这些数据都是什么意思,这里就不讲了,还挺复杂的,下个DMI规范看看就明白了)注,如果是有人用的电脑是ATI芯片组的话,运气就不这么好了,因为DMI表被放在了只在保护模式中才能访问的地址空间了,debug无能为力了。
要想写程序得到DMI表的话,就要想办法如何访问内存地址,用winio是个简单的方法,其实winio也是用的\\Device\\PhysicalMemory,只是做了封装而已。
方式得到的结果是“怦?YJQ? ?傝?Y囿u”,而不是网上其他文章里的格式i815-ITE87X2-6A69RPQRS-00
非常好,好像是乱码
------------------------
通过string.Format ( "Bois序列号:%s" , lpInfo+0xec71);
方式得到的结果是“怦?YJQ? ?傝?Y囿u”,而不是网上其他文章里的格式i815-ITE87X2-6A69RPQRS-00
非常好,好像是乱码
------------------------
是ibm bios的问题,amd的结果正确
------------------------
就是因为那些bios都是按照DMI规范来填DMI表的,但具体的数值有所不同罢了!
PBYTE lpInfo = MapPhysToLin((PBYTE)0xf0000,65536,&hPhyMem);
CString string;
string.Format ( "Bois序列号:%s" , lpInfo+0xec71);但是ibm的偏移不是0xed71
显示的地址的后两个字节为0? 00的形式时,才能构成段地址,方法是000?左移12位构成段地址?000。而当不是这种形式时,debug就无能为力了。比如00 c0 f7 1f,这时的地址是32位的1ff7c000。用winio应该可以读的到。
1.在内存地址[0x000f0000,0x000fffff]的范围内搜索"_SM_"的地址,例如得到结果为0x000f71c0。
2.取地址0x000f71c0+0x18处的一个双字,例如0x1ff7c000。
3.这个地址0x1ff7c000,就是DMI表的起始地址。然后根据DMI规范对DMI表进行分析,得到你所想要的信息。