Поддерживает ли Windows 7 основной протокол SMB?

Я начал разработку сервера SMB для старой машины на базе Z80. Эта машина работает с очень простой операционной системой MS-DOS (без многозадачности, без концепции пользователей, только с файловой системой FAT, без юникода, только с именами файлов 8.3) и имеет ограниченную память, поэтому моя первая идея - реализовать только основной протокол SMB, Я буду использовать TCP-транспорт.

На данный момент у меня есть очень короткий код тестирования, который просто отвечает команде SMB_COM_NEGOTIATE, указывая, что основным протоколом ( "PC NETWORK PROGRAM 1.0" ) является желаемый диалект. Чтобы проверить его, я пытаюсь подключиться к машине с Windows 7, открыв окно проводника и набрав "\\<server IP>" в адресной строке. Я проверил с Wireshark, что сервер принимает команду согласования и отправляет (по-видимому) правильный ответ.

Проблема:, как только клиент Windows получит ответ, он показывает общее сообщение об ошибке "Не удается получить доступ" (с кодом ошибки 0x80004005), а затем ничего не происходит (никаких дополнительных SMB сообщения отправляются). Я ожидал получить SMB_COM_TREE_CONNECT или аналогичную команду.

Я думал, что, возможно, Windows 7 не поддерживает основной протокол (он очень старый, и в нем нет какой-либо функции безопасности), но почему, почему он перечисляет имя основного диалекта в запросе на переговоры? Может, я упустил какой-то шаг? Должен ли сервер отправлять дополнительный пакет после ответа на переговоры?

Клиентская ОС - это 64-разрядные версии Windows 7 Ultimate, и здесь дампы Wireshark как запроса, так и ответа в случае, если кто-то может обнаружить что-то неправильное в этом процессе:

Запрос:

SMB dialect negotiate request

Ответ:

SMB dialect negotiate response

UPDATE: Если я выбираю диалект NT LM 0.12 вместо основного диалекта, я получаю от клиента команду SESSION_SETUP_AND_REQUESTX. По-видимому, похоже, что основной протокол не поддерживается Windows 7. В любом случае, любая дополнительная информация будет оценена.

Ответ 1

Я считаю, что Windows 7 поддерживает Core Protocol. Он понижает до SMB 1.0 при подключении к старым серверам по здесь.

Основываясь на проблемах, которые Windows 7 имеет при подключении к серверам Samba, я считаю, что проблема с указанием основного протокола связана с параметрами рабочей станции/клиента LANMAN на компьютере под управлением Windows 7.

Рекомендуемые изменения:

  • включение хешей LM и NTLM в качестве части политики безопасности: Network security: LAN Manager authentication level Send LM & NTLM responses
  • изменение значения 【HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Lsa \【LmCompatibilityLevel 】 ключа реестра на 0 по здесь
  • Добавление следующих параметров в LanmanWorkStation и NetLogon в реестр   HKLM\System\CCS\Services\LanmanWorkstation\Parameters DWORD DomainCompatibilityMode = 1 DWORD DNSNameResolutionRequired = 0

    HKLM\System\CCS\Services\Netlogon\Parameters DWORD RequireSignOnSeal = 0 DWORD RequireStrongKey = 0

    Возможные изменения этих параметров как с помощью реестра, так и с помощью политики безопасности перечислены здесь

Эти изменения должны гарантировать, что LanmanWorkstation не использует безопасность сеанса NTLMv2.

Ответ 2

Эта информация в основном такая же, как @Appleman1234 предоставляется (спасибо!), немного проще применять.

  • Экспортируйте текущие настройки reg, чтобы вы могли восстановить то, что у вас было, если необходимо. Поместите следующий код в файл .bat, и он будет экспортировать в ваш диск C: 3 ключа reg, которые мы готовим для изменения.
reg export HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Lsa HKEY_LOCAL_MACHINE.SYSTEM.CurrentControlSet.Control.Lsa.reg
reg export HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\services\LanmanWorkstation\Parameters HKEY_LOCAL_MACHINE.SYSTEM.CurrentControlSet.services.LanmanWorkstation.Parameters.reg
reg export HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\services\Netlogon\Parameters HKEY_LOCAL_MACHINE.SYSTEM.CurrentControlSet.services.Netlogon.Parameters.reg
  1. Отмените необходимые настройки реестра. Ниже приведено почти то, что предложил @Appleman1234, за исключением того, что он также позволяет использовать простые текстовые пароли и отключает подписи безопасности. Поместите следующий код в файл .reg и импортируйте его в свой реестр.
Windows Registry Editor Version 5.00

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Lsa]
"lmcompatibilitylevel"=dword:00000000

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\services\LanmanWorkstation\Parameters]
"EnablePlainTextPassword"=dword:00000001
"EnableSecuritySignature"=dword:00000000
"RequireSecuritySignature"=dword:00000000
"DomainCompatibilityMode"=dword:00000001
"DNSNameResolutionRequired"=dword:00000000

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\services\Netlogon\Parameters]
"RequireSignOrSeal"=dword:00000000
"RequireStrongKey"=dword:00000000
"RequireSignOnSeal"=dword:00000000