Серийный номер BIOS (материнская плата)

Тема в разделе "WASM.HARDWARE", создана пользователем facelift, 18 ноя 2008.

  1. facelift

    facelift New Member

    Публикаций:
    0
    Регистрация:
    18 ноя 2008
    Сообщения:
    25
    Никто не подскажеть как можно узнать серийный номер материнской платы?
     
  2. Flasher

    Flasher Member

    Публикаций:
    0
    Регистрация:
    31 янв 2004
    Сообщения:
    640
    Инфо о bios'е моно узнать так:

    Код (Text):
    1.      local oa:OBJECT_ATTRIBUTES
    2.      local hDevice:HANDLE
    3.  
    4.        CCOUNTED_UNICODE_STRING "\\Device\\PhysicalMemory",g_usFileName,4
    5.        xor eax,eax
    6.        lea ecx,oa
    7.        mov dword ptr [ecx],000000018h
    8.        and dword ptr [ecx+000000004h],eax
    9.        mov dword ptr [ecx+00000000Ch],00000240h
    10.        and dword ptr [ecx+000000010h],eax
    11.        lea ebx,g_usFileName
    12.        mov dword ptr [ecx+000000008h],ebx
    13.        and dword ptr [ecx+000000014h],eax
    14.        invoke ZwOpenSection,addr hDevice,4,addr oa
    15.         .if eax == 0
    16.            invoke MapViewOfFile,hDevice,0,0,0F0000h,10000h
    17.             .if eax != 0
    18.                mov esi,eax
    19.                add esi,0EC71h
    20.                
    21. ; в esi будут необходимые данные, но они не всегда по вышенаписанном адресу находятся
    22.  
    23.                invoke UnmapViewOfFile,esi
    24.             .endif
    25.            invoke ZwClose,hDevice
    26.         .endif
    Этот код кажись отсюда где-т брал..
     
  3. Partner

    Partner Павел

    Публикаций:
    0
    Регистрация:
    28 фев 2008
    Сообщения:
    917
    Адрес:
    Los Angeles
    Не будет работать на XP SP2. На Висте тем более.
     
  4. CrystalIC

    CrystalIC New Member

    Публикаций:
    0
    Регистрация:
    26 июл 2008
    Сообщения:
    500
    XPSP2 - работало и работать будет.
     
  5. Partner

    Partner Павел

    Публикаций:
    0
    Регистрация:
    28 фев 2008
    Сообщения:
    917
    Адрес:
    Los Angeles
    Может ошибся с сервис паком, но в последних версиях эту дыру прикрыли.
    По теме - WMI
     
  6. Pavia

    Pavia Well-Known Member

    Публикаций:
    0
    Регистрация:
    17 июн 2003
    Сообщения:
    2.409
    Адрес:
    Fryazino
    facelift
    Для того чтобы узнать серийный номер BIOS (материнская плата) нужно получить доступ к физической памяти.
    Это можно сделать через \\Device\\PhysicalMemory ,но в последних версиях виндоусов эту дырку прикрыли. Так что придеться писать драйвер.
    Насколько знаю WMI не выдает такую информацию.
    Теперь по поводу того где лежит этот код. Это зависит от биоса. Вот мой код для двух биосов(у других биосов не встречается). Еще видел на китайском сайте вариант.

    Код (Text):
    1. WriteLn('=BIOS INFO=');
    2. ps:=Ptr($F000,$E060);
    3. if Pos('Award',ps^)<>0 then IsAward:=True
    4.  else IsAward:=False;
    5. if IsAward then
    6.  begin
    7.  WriteLn(ps^);
    8.  pS:=Ptr($F000,$EC70);
    9.  WriteLn('BIOS ID: ',pS^);
    10.  p:=Ptr($F000,$ECE0);
    11.  WriteLn('BIOS Number: ',p);
    12.  ps:=Ptr($F000,$ECE9);
    13.  end;
    14.  
    15. ps:=Ptr($F000,$F400);
    16. if Pos('AMIBIOS',ps^)<>0 then IsAMI:=True
    17.  else IsAMI:=False;
    18. if IsAMI then
    19.  begin
    20.  WriteLn(ps^);
    21.  pS:=Ptr($F000,$F478);
    22.  WriteLn('BIOS ID: ',pS^);
    23.  end;
    24. if (IsAMI=False) and (IsAward=False) then
    25.  WriteLn('Not Award Bios, and Not AMI Bios');
     
  7. Partner

    Partner Павел

    Публикаций:
    0
    Регистрация:
    28 фев 2008
    Сообщения:
    917
    Адрес:
    Los Angeles
    у меня WMI выдает следующее на select * from Win32_BIOS

    BiosCharacteristics = {7, 9, 10, 11, 12, 15, 16, 19, 21, 26, 27, 28, 29, 32, 33, 36, 40, 41};
    BIOSVersion = {"DELL - 7", "Phoenix ROM BIOS PLUS Version 1.10 A05"};
    Caption = "Phoenix ROM BIOS PLUS Version 1.10 A05";
    CurrentLanguage = "en|US|iso8859-1";
    Description = "Phoenix ROM BIOS PLUS Version 1.10 A05";
    InstallableLanguages = 1;
    ListOfLanguages = {"en|US|iso8859-1"};
    Manufacturer = "Dell Inc. ";
    Name = "Phoenix ROM BIOS PLUS Version 1.10 A05";
    PrimaryBIOS = TRUE;
    ReleaseDate = "20060331000000.000000+000";
    SerialNumber = "3J3Q5B1";
    SMBIOSBIOSVersion = "A05";
    SMBIOSMajorVersion = 2;
    SMBIOSMinorVersion = 3;
    SMBIOSPresent = TRUE;
    SoftwareElementID = "Phoenix ROM BIOS PLUS Version 1.10 A05";
    SoftwareElementState = 3;
    Status = "OK";
    TargetOperatingSystem = 0;
    Version = "DELL - 7";
     
  8. Partner

    Partner Павел

    Публикаций:
    0
    Регистрация:
    28 фев 2008
    Сообщения:
    917
    Адрес:
    Los Angeles
    На 64-bit будет работать ?
     
  9. CrystalIC

    CrystalIC New Member

    Публикаций:
    0
    Регистрация:
    26 июл 2008
    Сообщения:
    500
    Вроде в ESCD(>= 0x40) CMOS есть, нужно проверить.
     
  10. CrystalIC

    CrystalIC New Member

    Публикаций:
    0
    Регистрация:
    26 июл 2008
    Сообщения:
    500
    Я попробовал так:
    Код (Text):
    1. CmosReadSerialNumber proc uses edi SerialNumber:PVOID   ;x6
    2.     mov edi,SerialNumber
    3.     cld
    4.     mov edx,41h
    5.     mov ecx,6
    6. lp_:
    7.     mov eax,edx
    8.     out 70h,al
    9.     inc edx
    10.     pushfd
    11.     popfd
    12.     jmp short $ + 2
    13.     in al,71h
    14.     stosb
    15.     loop lp_
    16.     ret
    17. CmosReadSerialNumber endp
    Возвращает 20 C7 00 0F 00 80.
     
  11. facelift

    facelift New Member

    Публикаций:
    0
    Регистрация:
    18 ноя 2008
    Сообщения:
    25
    Не могу обратится к памяти почему-то... Вылазит BSOD.

    Код (Text):
    1.     PCWSTR physicalMemoryCString = L"\\Device\\PhysicalMemory";
    2.     OBJECT_ATTRIBUTES objectAttribute = { '\0' };
    3.     UNICODE_STRING physicalMemoryString;
    4.     HANDLE memoryHandle = 0;
    5.     PVOID baseAddr = 0;
    6.     LARGE_INTEGER sectionOffset = { '\0' };
    7.     SIZE_T viewSize = PAGE_SIZE;
    8.     NTSTATUS currentStatus = STATUS_SUCCESS;
    9.     int i = 0;
    10.     int hz = 1000;
    11.     char *bios = 0;
    12.  
    13.     DbgPrint("Started\n");
    14.     DbgPrint("Build time: ");
    15.     DbgPrint(__TIME__);
    16.     DbgPrint("\n");
    17.  
    18.     RtlInitUnicodeString(&physicalMemoryString, physicalMemoryCString);
    19.    
    20.     InitializeObjectAttributes(&objectAttribute, &physicalMemoryString, OBJ_CASE_INSENSITIVE | OBJ_KERNEL_HANDLE, 0, 0);
    21.    
    22.     currentStatus = ZwOpenSection(&memoryHandle, READ_CONTROL/* | WRITE_DAC*/, &objectAttribute);
    23.     if(currentStatus == STATUS_SUCCESS)
    24.     {
    25.         DbgPrint("ZwOpenSection loaded successfully...\n");
    26.     }
    27.     else
    28.     {
    29.         DbgPrint("ZwOpenSection FAILED...\n");
    30.         return currentStatus;
    31.     }
    32.  
    33.  
    34.     currentStatus = ZwMapViewOfSection(memoryHandle,
    35.                        NtCurrentProcess(),
    36.                        &baseAddr,
    37.                        0,
    38.                        PAGE_SIZE,
    39.                        &sectionOffset,
    40.                        &viewSize,
    41.                        ViewShare,
    42.                        0,
    43.                        PAGE_READONLY);
    44.  
    45.     if(currentStatus == STATUS_SUCCESS)
    46.     {
    47.         DbgPrint("ZwMapViewOfSection() SUCCESS\n");
    48.         DbgPrint("Physical memory starts at: %p\n", baseAddr);
    49.  
    50.     }
    51.     else
    52.     {
    53.         DbgPrint("ZwMapViewOfSection() FAILED. Reason: ");
    54.         switch(currentStatus)
    55.         {
    56.             case STATUS_SECTION_PROTECTION:
    57.                 DbgPrint("STATUS_SECTION_PROTECTION\n");
    58.                 break;
    59.             case STATUS_INVALID_PAGE_PROTECTION :
    60.                 DbgPrint("STATUS_INVALID_PAGE_PROTECTION \n");
    61.                 break;
    62.             case STATUS_CONFLICTING_ADDRESSES :
    63.                 DbgPrint("STATUS_CONFLICTING_ADDRESSES \n");
    64.                 break;
    65.             case STATUS_SUCCESS:
    66.                 DbgPrint("STATUS_SUCCESS \n");
    67.                 break;
    68.             case STATUS_INVALID_VIEW_SIZE:
    69.                 DbgPrint("STATUS_INVALID_VIEW_SIZE\n");
    70.                 break;
    71.             case STATUS_INVALID_PARAMETER_5:
    72.                 DbgPrint("STATUS_INVALID_PARAMETER_5\n");
    73.                 break;
    74.             default:
    75.                 DbgPrint("unknown status - %x(%u)\n", currentStatus, currentStatus);
    76.                 break;
    77.         }
    78.         return currentStatus;
    79.     }
    80.  
    81.  
    82.     for(i = 0x0000; i < 0xffff; ++i)
    83.     {
    84.         DbgPrint("%x: %d\n", i, ((char *)baseAddr + i/*0xEC71*/)[0]);
    85.     }
    86.  
    87.     if(ZwUnmapViewOfSection(NtCurrentProcess(), baseAddr) == STATUS_SUCCESS)
    88.     {
    89.         DbgPrint("Unmapped successfully\n");
    90.     }
    91.  
    92.     if(ZwClose(memoryHandle) == STATUS_SUCCESS)
    93.     {
    94.         DbgPrint("Physical memory handle closed\n");
    95.     }
    Вот в этом цикле первые 0xfff адресов я могу посмотреть, после этих вдресов BSOD/
    Код (Text):
    1. for(i = 0x0000; i < 0xffff; ++i)
    2. {
    3.     DbgPrint("%x: %d\n", i, ((char *)baseAddr + i/*0xEC71*/)[0]);
    4. }
    baseAddr + 0xEC71 - все верно? это биос? и почему я не могу обратится по этому адресу?
    в дебаге baseAddr = 0x00040000;
     
  12. facelift

    facelift New Member

    Публикаций:
    0
    Регистрация:
    18 ноя 2008
    Сообщения:
    25
    Делаю как тут написано. В результате - BSOD/

    http://www.delphisources.ru/pages/faq/base/get_bios_serial.html
    Код (Text):
    1. DbgPrint("Bios: %d\n", ((char *)0xFEC71)[0]);
     
  13. T800

    T800 Member

    Публикаций:
    0
    Регистрация:
    7 дек 2006
    Сообщения:
    293
    Адрес:
    Moscow
    У меня WMI возвращает (SMBIOS: Type2)
    Manufacturer = ASUSTeK Computer INC.
    Product Name = M2N-SLI DELUXE
    Version = 1.XX
    Serial Number = 123456789000

    И как после такого можно юзать этот SN в качестве hardware идентификатора ?

    Так же можно получить (SMBIOS: Type1)
    UUID = 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11
    Но точно знаю что на "первичной" версии прошивки было так:
    UUID = 60 be 86 99 9c 7a da 11 a9 6b 00 17 31 ad 54 c8
     
  14. Pavia

    Pavia Well-Known Member

    Публикаций:
    0
    Регистрация:
    17 июн 2003
    Сообщения:
    2.409
    Адрес:
    Fryazino
    Ну так ты отоброзил ровно 4КБ
    SIZE_T viewSize = PAGE_SIZE; поставь 1МБ или задай sectionOffset

    Возможно это код для режима приложений windows98. XP его блакирует. Прежде чем обратиться к этому адрессу его надо отобразить что ты и пытаешься сделать в #11 посте.
     
  15. facelift

    facelift New Member

    Публикаций:
    0
    Регистрация:
    18 ноя 2008
    Сообщения:
    25
    Код (Text):
    1.     PCWSTR physicalMemoryCString = L"\\Device\\PhysicalMemory";
    2.     OBJECT_ATTRIBUTES objectAttribute = { '\0' };
    3.     UNICODE_STRING physicalMemoryString;
    4.     NTSTATUS currentStatus = STATUS_SUCCESS;
    5.  
    6.     HANDLE memoryHandle = 0;
    7.     unsigned long ssize = 0xffff;
    8.     PHYSICAL_ADDRESS viewBaseAddress;
    9.     unsigned long dwPAddress = 0;
    10.     unsigned long baseAddres = 0x000F0000;
    11.  
    12.     DbgPrint("Started\n");
    13.     DbgPrint("Build time: ");
    14.     DbgPrint(__TIME__);
    15.     DbgPrint("\n");
    16.  
    17.     RtlInitUnicodeString(&physicalMemoryString, physicalMemoryCString);
    18.    
    19.     InitializeObjectAttributes(&objectAttribute, &physicalMemoryString, OBJ_CASE_INSENSITIVE, 0, 0);
    20.    
    21.     currentStatus = ZwOpenSection(&memoryHandle, SECTION_MAP_READ/* | WRITE_DAC*/, &objectAttribute);
    22.     if(currentStatus == STATUS_SUCCESS)
    23.     {
    24.         DbgPrint("ZwOpenSection loaded successfully...\n");
    25.     }
    26.     else
    27.     {
    28.         DbgPrint("ZwOpenSection FAILED...\n");
    29.         return currentStatus;
    30.     }
    31.  
    32.     viewBaseAddress.QuadPart = (ULONGLONG)baseAddres;
    33.  
    34.     currentStatus = ZwMapViewOfSection(memoryHandle,
    35.                        (HANDLE)-1,
    36.                        (PVOID)&dwPAddress,
    37.                        0,
    38.                        ssize,
    39.                        &viewBaseAddress,
    40.                        &ssize,
    41.                        ViewShare,
    42.                        0,
    43.                        PAGE_READONLY);
    44.  
    45.     if(currentStatus == STATUS_SUCCESS)
    46.     {
    47.         DbgPrint("ZwMapViewOfSection() SUCCESS\n");
    48.         DbgPrint("Physical memory starts at: %p\n", dwPAddress);
    49.  
    50.     }
    Все же правильно? Тут я хочу получить доступ к 0x000f0000. Почему не получается?
    Выводит:
    Код (Text):
    1. Physical memory starts at: 0x00040000
    Ну или какой-то другой адрес.
     
  16. facelift

    facelift New Member

    Публикаций:
    0
    Регистрация:
    18 ноя 2008
    Сообщения:
    25
    Код (Text):
    1. // bios_1.cpp : Defines the entry point for the console application.
    2. //
    3.  
    4. #include "stdafx.h"
    5. #include <windows.h>
    6. #include <iostream>
    7.  
    8.  
    9. //
    10. // Valid values for the Attributes field
    11. //
    12.  
    13. #define OBJ_INHERIT             0x00000002L
    14. #define OBJ_PERMANENT           0x00000010L
    15. #define OBJ_EXCLUSIVE           0x00000020L
    16. #define OBJ_CASE_INSENSITIVE    0x00000040L
    17. #define OBJ_OPENIF              0x00000080L
    18. #define OBJ_OPENLINK            0x00000100L
    19. #define OBJ_KERNEL_HANDLE       0x00000200L
    20. #define OBJ_FORCE_ACCESS_CHECK  0x00000400L
    21. #define OBJ_VALID_ATTRIBUTES    0x000007F2L
    22.  
    23.  
    24. #define STATUS_SUCCESS                          ((NTSTATUS)0x00000000L) // ntsubauth
    25.  
    26.  
    27. typedef struct _UNICODE_STRING {
    28.     USHORT Length;
    29.     USHORT MaximumLength;
    30. #ifdef MIDL_PASS
    31.     [size_is(MaximumLength / 2), length_is((Length) / 2) ] USHORT * Buffer;
    32. #else // MIDL_PASS
    33.     PWSTR  Buffer;
    34. #endif // MIDL_PASS
    35. } UNICODE_STRING;
    36. typedef UNICODE_STRING *PUNICODE_STRING;
    37. typedef const UNICODE_STRING *PCUNICODE_STRING;
    38. #define UNICODE_NULL ((WCHAR)0) // winnt
    39.  
    40.  
    41.  
    42. typedef struct _OBJECT_ATTRIBUTES {
    43.     ULONG Length;
    44.     HANDLE RootDirectory;
    45.     PUNICODE_STRING ObjectName;
    46.     ULONG Attributes;
    47.     PVOID SecurityDescriptor;        // Points to type SECURITY_DESCRIPTOR
    48.     PVOID SecurityQualityOfService;  // Points to type SECURITY_QUALITY_OF_SERVICE
    49. } OBJECT_ATTRIBUTES;
    50. typedef OBJECT_ATTRIBUTES *POBJECT_ATTRIBUTES;
    51. typedef CONST OBJECT_ATTRIBUTES *PCOBJECT_ATTRIBUTES;
    52.  
    53.  
    54.  
    55. #define InitializeObjectAttributes( p, n, a, r, s ) { \
    56.     (p)->Length = sizeof( OBJECT_ATTRIBUTES );          \
    57.     (p)->RootDirectory = r;                             \
    58.     (p)->Attributes = a;                                \
    59.     (p)->ObjectName = n;                                \
    60.     (p)->SecurityDescriptor = s;                        \
    61.     (p)->SecurityQualityOfService = NULL;               \
    62.     }
    63.  
    64. int _tmain(int argc, _TCHAR* argv[])
    65. {
    66.     HMODULE ntdll = LoadLibrary(L"ntdll.dll");
    67.     if(ntdll == 0)
    68.     {
    69.         std::cerr << "Unable to load ntdll.dll" << std::endl;
    70.         return -1;
    71.     }
    72.  
    73.     PCWSTR physicalMemoryCString = L"\\Device\\PhysicalMemory";
    74.     OBJECT_ATTRIBUTES objectAttribute = { '\0' };
    75.     UNICODE_STRING physicalMemoryString;
    76.     NTSTATUS currentStatus = STATUS_SUCCESS;
    77.     HANDLE memoryHandle = 0;
    78.  
    79.     typedef void (__stdcall *RtlInitUnicodeString_t)(IN OUT PUNICODE_STRING  DestinationString,IN PCWSTR  SourceString);
    80.  
    81.     RtlInitUnicodeString_t RtlInitUnicodeString =
    82.                 reinterpret_cast<RtlInitUnicodeString_t>(GetProcAddress(ntdll, "RtlInitUnicodeString"));
    83.  
    84.     if(RtlInitUnicodeString == 0)
    85.     {
    86.         std::cerr << "Unable to load RtlInitUnicodeString" << std::endl;
    87.         return -1;
    88.     }
    89.  
    90.     typedef NTSTATUS (__stdcall *ZwOpenSection_t)(OUT PHANDLE SectionHandle,
    91.                                                         IN ACCESS_MASK DesiredAccess,
    92.                                                         IN POBJECT_ATTRIBUTES ObjectAttributes);
    93.  
    94.     ZwOpenSection_t ZwOpenSection =
    95.                 reinterpret_cast<ZwOpenSection_t>(GetProcAddress(ntdll, "ZwOpenSection"));
    96.  
    97.  
    98.     RtlInitUnicodeString(&physicalMemoryString, physicalMemoryCString);
    99.     InitializeObjectAttributes(&objectAttribute, &physicalMemoryString, OBJ_CASE_INSENSITIVE | OBJ_KERNEL_HANDLE, 0, 0);
    100.     currentStatus = ZwOpenSection(&memoryHandle, SECTION_MAP_READ, &objectAttribute);
    101.  
    102.     if(currentStatus != STATUS_SUCCESS)
    103.     {
    104.         std::cerr << "ERROR: ZwOpenSection() failed" << std::endl;
    105.         return -1;
    106.     }
    107.  
    108.     void *dmiStartPtr = MapViewOfFile(memoryHandle, FILE_MAP_READ, 0, 0xf0000 ,0xffff);
    109.  
    110.     if(dmiStartPtr == 0)
    111.     {
    112.         std::cerr << "ERROR: MapViewOfFile() failed" << std::endl;
    113.         return -1;
    114.     }
    115.  
    116.     std::cout << "MapViewOfFile returned: " << dmiStartPtr << std::endl;
    117.  
    118.     std::cout << ((char *)(0xFEC71));
    119.  
    120.    
    121.     return 0;
    122. }
    Людт, это должно работать, но у меня не работает. У вас работает?
     
  17. facelift

    facelift New Member

    Публикаций:
    0
    Регистрация:
    18 ноя 2008
    Сообщения:
    25
    Вывод на консоль:
    Код (Text):
    1. MapViewOfFile returned: 00350000
    2. Press any key to continue . . .
    Чтож этож за ептить такой??? Как мне открыть достуа к 0x000f0000?
     
  18. Pavia

    Pavia Well-Known Member

    Публикаций:
    0
    Регистрация:
    17 июн 2003
    Сообщения:
    2.409
    Адрес:
    Fryazino
    facelift
    Сейчас код посмотреть не могу.
    dwPAddress- это виртуальный адресс , по которому отображен физический адресс.
    Так что там и недолжно быть 0x000f0000
     
  19. facelift

    facelift New Member

    Публикаций:
    0
    Регистрация:
    18 ноя 2008
    Сообщения:
    25
    Pavia
    Огромное спасибо. Все сработало в обоих програмках - и в драйвере и в екзешнике.
    Не подскажите где можно прочитать про виртуальную память? Я купил-то себе Руссиновича "Внутренне устройство Сервера, 2000, 2003" и книжку по ассемблеру Юрова "Assembler". Я найду там эту инфу? И что еще посоветуете почитать?
     
  20. ohne

    ohne New Member

    Публикаций:
    0
    Регистрация:
    28 фев 2009
    Сообщения:
    431
    facelift
    как обычно
    intel manuals

    ps
    главы 3,4,5,9 первого тома для системных программистов