Прочитать Bios под NT/XP/Vista/7

Тема в разделе "WASM.WIN32", создана пользователем Jin X, 8 дек 2009.

  1. Jin X

    Jin X Active Member

    Публикаций:
    0
    Регистрация:
    15 янв 2009
    Сообщения:
    369
    Адрес:
    Кольца Сатурна
    Хочу прочитать весь Bios (E0000-FFFFF или хотя бы F0000-FFFFF) из-под _любой_ Windows (с 9X/ME всё вроде проще) под _любыми_ правами (в т.ч. юзера). Есть хорошая функция (см. аттач, DumpRomBiosNt), но под юзером она не пашет! Создавать временный Exe-шник и пускать его под эмуляцией ДОСа - это, конечно, вариант, но ИМХО, слишком уж извращённый. Так, как же прочитать Bios из-под NT-шек?

    Это необходимо для привязки проги к железу. Тут есть 2 варианта:
    1. Читать только строки с версиями, серийными номерами, датами и т.д. (документация SMBIOS мне поможет).
    2. Читать весь биос, но тогда возникает вопрос: если биос может менять кое-какие данные в самом себе (например, хранить настройки и т.п.), то мы рискуем получать время от времени разные биосы. Собственно, возможно ли такое? Какие адреса 100% неизменяемые? Откуда их лучше читать?
     
  2. Jin X

    Jin X Active Member

    Публикаций:
    0
    Регистрация:
    15 янв 2009
    Сообщения:
    369
    Адрес:
    Кольца Сатурна
    Аттач (Delphi):
    Код (Text):
    1. ////////////////////////////////////////////////////////////////////////////////
    2. //
    3. //  DumpRomBiosNt (rdmPhysical)
    4. //
    5. //    On WinNT the BIOS is accessable through section '\Device\PhysicalMemory'.
    6. //    This object can only be opened by members of local 'Adminstrators' group.
    7. //    ZwOpenSection and RtlNtStatusToDosError are documented in newer MSDN/DDK.
    8. //
    9.  
    10. type
    11.   NTSTATUS = Integer;
    12.  
    13.   PUnicodeString = ^TUnicodeString;
    14.   TUnicodeString = packed record
    15.     Length: Word;
    16.     MaximumLength: Word;
    17.     Buffer: PWideChar;
    18.   end;
    19.  
    20.   PObjectAttributes = ^TObjectAttributes;
    21.   TObjectAttributes = record
    22.     Length: ULONG;
    23.     RootDirectory: THandle;
    24.     ObjectName: PUnicodeString;
    25.     Attributes: ULONG;
    26.     SecurityDescriptor: PSecurityDescriptor;
    27.     SecurityQualityOfService: PSecurityQualityOfService;
    28.   end;
    29.  
    30.   TFNZwOpenSection = function(out Section: THandle; Access: ACCESS_MASK;
    31.     Attributes: PObjectAttributes): NTSTATUS;
    32.   stdcall;
    33.   TFNRtlNtStatusToDosError = function(Status: NTSTATUS): DWORD;
    34.   stdcall;
    35.  
    36. const
    37.   PhysMemDevName = '\Device\PhysicalMemory';
    38.   PhysMemName: TUnicodeString = (Length: Length(PhysMemDevName) * SizeOf(WideChar);
    39.     MaximumLength: Length(PhysMemDevName) * SizeOf(WideChar) + SizeOf(WideChar);
    40.     Buffer: PhysMemDevName;
    41.     );
    42.   PhysMemMask: ACCESS_MASK = SECTION_MAP_READ;
    43.   PhysMemAttr: TObjectAttributes = (Length: SizeOf(TObjectAttributes);
    44.     RootDirectory: 0;
    45.     ObjectName: @PhysMemName;
    46.     Attributes: $00000040;  // OBJ_CASE_INSENSITIVE
    47.     SecurityDescriptor: nil;
    48.     SecurityQualityOfService: nil;
    49.     );
    50.  
    51. var
    52.   ZwOpenSection: TFNZwOpenSection;
    53.   RtlNtStatusToDosError: TFNRtlNtStatusToDosError;
    54.  
    55. function DumpRomBiosNt(RomBase: Pointer; RomSize: Cardinal; var Dump): Boolean;
    56. var
    57.   HMod: HMODULE;
    58.   Stat: NTSTATUS;
    59.   Sect: THandle;
    60.   View: Pointer;
    61. begin
    62.   Result := False;
    63.   HMod   := GetModuleHandle('ntdll.dll');
    64.   if HMod = 0 then
    65.     SetLastError(ERROR_CALL_NOT_IMPLEMENTED)
    66.   else
    67.   begin
    68.     if not Assigned(ZwOpenSection) then
    69.       ZwOpenSection := GetProcAddress(HMod, 'ZwOpenSection');
    70.     if not Assigned(RtlNtStatusToDosError) then
    71.       RtlNtStatusToDosError := GetProcAddress(HMod, 'RtlNtStatusToDosError');
    72.     if not Assigned(ZwOpenSection) or not Assigned(RtlNtStatusToDosError) then
    73.       SetLastError(ERROR_CALL_NOT_IMPLEMENTED)
    74.     else
    75.     begin
    76.       Stat := ZwOpenSection(Sect, PhysMemMask, @PhysMemAttr);
    77.       if Stat >= 0 then
    78.         try
    79.           View := MapViewOfFile(Sect, PhysMemMask, 0, Cardinal(RomBase), RomSize);
    80.           if View <> nil then
    81.             try
    82.               Move(View^, Dump, RomSize);
    83.               Result := True;
    84.             finally
    85.               UnmapViewOfFile(View);
    86.             end;
    87.         finally
    88.           CloseHandle(Sect);
    89.         end
    90.       else
    91.         SetLastError(RtlNtStatusToDosError(Stat));
    92.     end;
    93.   end;
    94. end;
     
  3. T800

    T800 Member

    Публикаций:
    0
    Регистрация:
    7 дек 2006
    Сообщения:
    293
    Адрес:
    Moscow
    http://wasm.ru/forum/viewtopic.php?pid=277858#p277858
    не знаю на сколько правда (не проверял)

    1) Чтение строковых данных из SMBIOS можно глянуть во всяких прожках-информатерах по железу компа.
    Да и там можно подцепить только даты,версии,модели , а операться на наличие и уникальность серийников вообще не стоит (могут меняться после прошивки).
    2) Там полно данных, которые могут меняться.
     
  4. Jin X

    Jin X Active Member

    Публикаций:
    0
    Регистрация:
    15 янв 2009
    Сообщения:
    369
    Адрес:
    Кольца Сатурна
    Ну это то же самое по сути (ссылка). Только под юзером ZwOpenSection не работает :dntknw:
    Вот через WMI читать отдельные характеристики - это можно.
    А по SMBIOS у меня спецификация есть ;)
     
  5. Jin X

    Jin X Active Member

    Публикаций:
    0
    Регистрация:
    15 янв 2009
    Сообщения:
    369
    Адрес:
    Кольца Сатурна
    Видимо, оптимальный вариант - это WMI, ZwOpenSection(\Device\PhysicalMemory), на край делать Exe-шник и запускать его, а уж совсем на край - читать реестр. А под 9X/ME читать напрямую.
    Кстати, а какой-нибудь 16-битный dll можно сделать, чтоб из-под XP его подключить можно было (и читать из него BIOS)?

    Ну а что-то есть, что меняться не может.
     
  6. n0name

    n0name New Member

    Публикаций:
    0
    Регистрация:
    5 июн 2004
    Сообщения:
    4.336
    Адрес:
    Russia
    это нереально.
     
  7. Jin X

    Jin X Active Member

    Публикаций:
    0
    Регистрация:
    15 янв 2009
    Сообщения:
    369
    Адрес:
    Кольца Сатурна
    Это, собственно, вопрос был :)
     
  8. valterg

    valterg Active Member

    Публикаций:
    0
    Регистрация:
    19 авг 2004
    Сообщения:
    2.105
    Настройки БИОС хранит не в самом себе : сам БИОС, если его не перешивают - неизменен.
    Другое дело, что и в ДОС и Винде сидит "копия" из флешки в память, и менятся ли она - я не знаю.
     
  9. Jin X

    Jin X Active Member

    Публикаций:
    0
    Регистрация:
    15 янв 2009
    Сообщения:
    369
    Адрес:
    Кольца Сатурна
    А может, кто-то другой знает?
    Прикол в том, что SMBIOS содержит информацию о процессоре, которая явно записывается самим биосом...
    Где ж взять исходный неизменяемый биос?
     
  10. valterg

    valterg Active Member

    Публикаций:
    0
    Регистрация:
    19 авг 2004
    Сообщения:
    2.105
    А кто вам сказал, что она пишется в флешку ? Есть так называемая "расширенная память БИОС". Туда все и пишется. Возможно сейчас еще куда-то - на шине PCI тьма памяти.
     
  11. Jin X

    Jin X Active Member

    Публикаций:
    0
    Регистрация:
    15 янв 2009
    Сообщения:
    369
    Адрес:
    Кольца Сатурна
    Да это понятно, что пишется не в БИОС, но когда я читаю F0000-FFFFF, получаю именно расширенку.
    А откуда читать оригинал, так сказать?
    p.s. Слышал про FFFF0000-FFFFFFFF. Что там?
     
  12. valterg

    valterg Active Member

    Публикаций:
    0
    Регистрация:
    19 авг 2004
    Сообщения:
    2.105
    Сейчас через WinHex прочитал физическую память F0000-FFFFF. Там BIOS и он естественно попал туда из флешки. Память FFFF0000-FFFFFFFF виртуальная. Значит ее содержимое определяет ОС и БИОС тут не при чем, хотя где-то читал что там копия БИОС.
    Теперь про оригинал. Что ты под этим подразумеваешь? Дело в том, что в старых компах БИОС просто отображался в память и все. В новых БИОС упакован и распаковывается в память, т.ч. оригинал - это неопределенно. А так как БИОС в памяти, то никто не мешает писать туда и самому БИОС-у и ОС. Советую посетить rom.by - там БИОС-ом давно уже занимаются.