Windows количество одновременных подключений по rdp. Исправляем недостатки RDP с помощью RDP Wrapper Library

Сервер терминалов Windows 7 / Vista / XP (sp1/sp2/sp3) - реальное решение. Терминальный сервер для подключения к удаленному рабочему столу Windows 7 / Vista / XP (sp1/sp2/sp3) одновременно нескольких пользователей.

Сервер терминалов можно использовть для запуска одного приложения с удалённых компьютеров или к вашему терминальному серверу на Windows 7 / XP / Vista/ можно подключить одновременно разные старые компьютеры типа 486 и Pentium 1, они будут работать как будто на них установлена операционная система Windows Vista /7 / XP с Office XP-2003-2007, 1С и кучей разных офисных программ.

По умолчанию Windows 7/Vista/XP не поддерживает работу одновременно нескольких пользователей. Для того чтобы позволить нескольким пользователям работать одновременно по RDP , надо заменить файл C:\Windows\System32\termsrv.dll и внести изменения в реестр - чтобы убрать ограничение наложенное на Windows XP / 7/Vista .

Перед тем как вносить изменения в Windows 7 / Vista / XP , убедитесь, что ваши действия не противоречат законодательству Вашей страны и лицензионному соглашению, так что использовать метод или нет решать Вам.

Как из Windows XP / 7 / Vista сделать терминальный сервер?

1. Создайте несколько пользователей с правами администратора или обычного пользователя, обязательно установите пароль.

Убедитесь что включена опция - Быстрое переключение между пользователями (Панель управления -> Учетные записи пользователей -> Изменение входа пользователей в систему)

2. Разрешите удалённое подключение - выберите «Мой компьютер», щелкнув правой кнопкой мыши и откройте его «Свойства». В появившемся окне зайдите во вкладку «Удаленные сеансы». Пункт «Разрешить удаленный доступ к этому компьютеру» подтвердите галочкой. Выбрать удалённых пользователей (иначе Remote Desktop будет работать только для администраторов) и нажмите «Ок»

3. Убедитесь, что возможность подключения к удалённому рабочему столу работает для одного пользователя.

Делаем терминальный сервер Windows XP / 7 / Vista

4. Скачать универсальный патч для создания терминального сервера :
-
Windows XP sp2 sp3;
- Windows Vista sp1 sp2;
- Windows 7, 32bit(x86)/64bit(x64).

5. Выполните файл UniversalTermsrvPatch-*.exe который соответствует разрядности Вашей системы и нажмите Patch для замены файл а C:\Windows\System32\termsrv.dll

6. Выполните файл *.reg который соответствует Вашей операционной системе для внесения изменений в реестр

7. Перегрузите операционную систему

8. Пуск -> Выполнить -> gpedit.msc

Для Windows 7

Конфигурация компьютера -> Административные шаблоны -> Компоненты Windows -> Службы удалённых рабочих столов -> Узел сеансов удалённых рабочих столов -> Подключения ->

Для Windows XP

Конфигурация компьютера -> Административные шаблоны -> Компоненты Windows -> Сервер терминалов-> Ограничить количество подключений

Устанавливаем "Включено" и меняем значение количества разрешённых терминалов.

9. Перезагрузите компьютер

Если вы все выполнили правильно, то терминальный сервер Windows 7 / Vista / XP (sp1/sp2/sp3) готов. Теперь у вас должен работать удаленный рабочий стол одновременно для нескольких пользователей.

Дополнительные настрйки терминального сервера Windows XP

1. Как показывает практика, пользователи терминального сервера просто отключаюются, а программы работают дальше. Можно задать время отключения неактивного сеанса

Пуск -> Выполнить -> gpedit.msc
Конфигурация компьютера -> Административные шаблоны -> Компоненты Windows -> Сервер терминалов -> Сеансы -> Задать ограничение по времени для отключеных сеансов

Включить и указать время

Так же там есть другие ограничения, можете выбирать как Вам нравиться

2. Запуск одной программы для всех удалённых пользователей терминального сервера, без рабочего стола

Пуск -> Выполнить -> gpedit.msc
Конфигурация компьютера -> Административные шаблоны -> Компоненты Windows -> Сервер терминалов ->Запускать программу при подключении

Включить
\Bkc.RemoteClient.exe

Указать рабочую папку
C:\Program Files\Банкомзв"язок\Віддалений клієнт спостереження

3. Запуск одной программы для выбраных пользователей терминального сервера, без рабочего стола (внимание, действует даже если зайти локально, так что я даже не знаю как это отменить потом, разве что удалить пользователя, а потом создать нового или с помощью загрузочного диска liveCD , (программой ERD-commander) с выбором загрузки реестра нужной нам операционной системы.

Пуск -> Выполнить ->regedit

Создать строковой параметр Shell и в поле "Значение" указать полный путь к файлу программы

4. Запуск одной программы самостоятельно пользователем терминального сервера, без рабочего стола

Для начала выполнить п.2 для всех пользователей , перегрузиться и потом вернуть значение как было (Не задан)

В настройках клиента Windows (Подключение к удаленному рабочему столу) с которого подключаемся, в Параметрах во вкладке Программы ставим галочку "При подключении запускать следующую программу"

Указать полный путь к программе и имя файла

Указать рабочую папку
C:\Program Files\Банкомзв"язок\Віддалений клієнт спостереження

5. Запуск программы при входе в систему на рабочий стол

Добавить ярлык в папку Автозагрузка
C:\Documents and Settings\имя_пользователя\Главное меню\Программы\Автозагрузка\

В ОС Windows 8 / 8.1, как и предыдущих версиях клиентских ОС Microsoft, поддерживается только одно одновременное входящее RDP-подключение . Это означает что к компьютеру Windows 8 через удаленный рабочий стол может одновременно подключиться только один пользователь (одна сессия), локальная или удаленная. В большинстве случаев этого достаточно, но иногда хотелось бы иметь возможность одновременной работы сразу нескольких пользователей в собственных сессиях. Хорошим примером может быть компьютер в роли Media Center, когда в консольной сессии воспроизводится видео, и одновременно необходимо удаленно поработать с системой без прерывания видео на TV.

Совет. Удаленный RDP доступ не работает в домашних (Home) редакциях Windows, требуется редакции Pro или Enterprise.

При попытке открыть вторую RDP-сессию к компьютеру с Windows 8, появляется сообщение о том, что уж в системе уже залогинен другой пользователь и его сессия может быть завершена.

Совет . Предварительно в свойствах компьютере на вкладке Удаленный доступ (Remote) нужно и добавить учетные записи нужных пользователей в локальную группу Remote Desktop Users. Локальным администраторам удаленный RDP доступ разрешен по умолчанию. После включения RDP доступа в свойствах системы, Windows Firewall автоматически включает правила, разрешающий входящий трафик на порт 3389. Иногда наличие этого правила следует проверить вручную.

Так, например, в серверной версии Windows поддерживаются два одновременных административных подключения с индивидуальными сессиями (в случае организации на базе Windows Server терминального сервера RDS , это число может быть еще большим).

Тем не менее, на просторах интернета можно найти специальный патч, позволяющий обойти это ограничение. Благодаря этому патчу несколько пользователей смогут одновременно подключиться по RDP к компьютеру с Windows 8 / Windows 8.1.

Важно . Использование данного патча, по сути, является нарушением лицензионного соглашения и условий использования продуктов Microsoft. Поэтому все описанные ниже операции вы выполняете на свой риск.

Итак, патч предполагает собой замену оригинального системного файла %SystemRoot%\System32\termsrv.dll (библиотека, используемая службой Remote Desktop Services).

  • Windows 8 – termsrv.dll-win8.zip
  • Windows 8.1 — termsrv.dll-win8.1.zip

Перед заменой системной библиотеки создадим резервную копию файла termsrv.dll командой:

Copy c:\Windows\System32\termsrv.dll termsrv.dll_old

Теперь, если что-то пойдет не так, всегда можно вернуться к начальной конфигурации, заменив текущий файл оригинальным termsrv.dll_old.

Скачайте архив с библиотекой для своей версии Windows.

В Windows 8 предварительно нужно изменить значение следующих ключей в ветке реестра HKLM\System\CurrentControlSet\Control\Terminal Server\ :

  • fDenyTSConnections (DWORD) —0 (ключ позволяет на компьютере)
  • fSingleSessionPerUser (DWORD) — 0

Эту же операцию можно выполнить из командной строки:

REG ADD "HKLM\SYSTEM\CurrentControlSet\Control\Terminal Server" /v fDenyTSConnections /t REG_DWORD /d 0 /f REG ADD "HKLM\SYSTEM\CurrentControlSet\Control\Terminal Server" /v fSingleSessionPerUser /t REG_DWORD /d 0 /f

Затем переходим в каталог C:\Windows\System32 , находим файл termsrv.dll и открываем его свойства.

По-умолчанию, владельцем этого файла является TrustedInstaller и даже у администратора нет прав на его замену.

Перейдем на вкладку Security и нажмем кнопку Edit . В списке доступа найдите группу локальных администраторов и предоставьте ей полные права на файл (Full Control ) и сохраните изменения.

Следующий шаг перед заменой файла библиотеки, открыть консоль управления службами (services.msc ) и остановить службу Remote Desktop Services .

Скопируем файл termsrv.dll из скачанного архива для своей версии Windows в каталог %SystemRoot%\System32\ (с заменой).

Примечание . Архив для Windows 8.1 содержит два файла 32_termsrv.dll и 64_termsrv.dll , для 32-х и 64-х битной версии Windows 8.1 соответственно. Распакуйте архив и переименуйте файл для своей версии системы в termsrv.dll

После замены файла запустите службу Remote Desktop Services и попытайтесь создать две RDP сессии с пропатченной машиной под разными учетными записями. Если вы все сделали правильно, должны открыться две независимые сессии удаленного рабочего стола.

Совет . Возможно потребуется перезагрузка компьютера.

Важно ! Использование пропатченной версии termsrv.dll имеет ряд недостатков. Главный из которых – при установке очередного обновления Windows 8.1 / 8 этот файл может быть заменен. Соответственно, придется самостоятельно с помощью HEX редактора патчить новый файл, либо искать в интернете готовый модифицированный файл для вашего билда Windows.

В качестве решения, устойчивого к замене файла termsrv.dll при установке обновлений Windows, следует использовать открытое Open Source решение RDP Wrapper Library (доступен на GitHub), которое не правит файл termsrv.dll, и является прослойкой между службой Terminal Services и SCM. Подробнее об использовании RDP Wrapper Library можно почитать .

Windows XP Professional и Windows XP Media Center Edition (MCE) имеют сервис подключения удалённого рабочего стола (RDP) , который позволяет удалённо подключить компьютер,получить доступ и управление с другого компьютера или хоста. Тем не менее, машины на операционной системе Windows XP позволяют одновременное подключение к удаленному рабочему столу только одного пользователя который был подключен к нему, без нескольких сеансов подключения удаленного рабочего стола или соединения поддержки.

Всякий раз, когда удаленный пользователь подключается через клиент к удаленному рабочему столу (RDC) для подключения к хосту Windows XP , локальный пользователь отключается с блокировкой консоли, или без его разрешения. Удаленный рабочий стол , в отличие от терминального сервера услуги в Windows Server 2003 и Server 2008, предназначен для одноразового использования пользователем, независимо от того, это локальный или удаленный пользователь.

Вот хак для разблокировки одного ограничения который позволяет несколько одновременных Remote Desktop Connection сессий в Windows XP Professional и Media Center Edition, используя либо пропатченный termserv.dll или старый пропатченный termserv.dll сборки версии 5.1.2600.2055, так, что неограниченное число пользователей могут одновременно подключиться к компьютеру с помощью удаленного рабочего стола .

  1. Скачать копию пропатченного, который снимет ограничения удаленного подключения к рабочему столу отключенную для вашей версии Windows XP:

Windows XP SP3: termsrv.dll (версия 5.1.2600.5512)

Для получения информации termsrv.dll патч обычно имеет следующие биты HEX кодов,которые перезаписываются в следующие значения:

00022A17: 74 75
00022A69: 7F 90
00022A6A: 16 90

  1. Перезагрузите компьютер и загрузите информацию в безопасном режиме, нажав F8 во время начальной загрузки и выберите безопасный режим . Этот шаг необходим только если вы в данный момент используете Windows Terminal Services или службы удаленного рабочего стола , защита файловой системы должна быть пропущена, иначе появиться следующее сообщение об ошибке, чтобы восстановить исходный termsrv.dll.

3.Перейдите в % WINDIR% System32 и сделайте резервную копию (или переименуйте) termsrv.dll .

4.Переименуйте или удалите termserv.dll в папке % WINDIR% System32 Dllcache .

5.Скопируйте загруженный termsrv.dll в % WINDIR% System32 , % WINDIR% ServicePackFiles i386 (если есть) и % WINDIR% System32 Dllcache .

6.Затем скачайте и запустите, чтобы объединить значения реестра в registery, или вы можете запустить редактор реестра вручную и добавить следующие параметры реестра:



«EnableConcurrentSessions» = DWORD: 00000001


«AllowMultipleTSSessions» = DWORD: 00000001

7.Нажмите на кнопку Пуск -> Выполнить и введите команду gpedit.msc , нажмите Enter , чтобы открыть редактор групповой политики.

8.Перейдите в Computer Configuration -> Административные шаблоны -> Компоненты Windows -> Службы терминалов .

9.Включить ограничить число подключений и установить число подключений в 3 (или более). Настройка позволяет более одного использования компьютера одновременно.

10.Обеспечить включение Remote Desktop на вкладке Удаленные Свойства системы, выбрав переключатель Разрешить пользователям удаленно подключаться к этому компьютеру .

11.Включите быстрое переключение пользователей в Панели управления -> Учетные записи пользователей -> Изменение входа пользователей в систему или выключение .

12.Перезагрузите компьютер в обычном режиме.

Замечу, если вы не можете заменить или переписать файл termserv.dll - доступ запрещен или ошибка файла, выключите «Termine услуги» в разделе «Услуги» Панель управления «Администрирование». Кроме того, каждое подключенное физическое соединение должно иметь свой собственный пользовательский аккаунт в целевом компьютере, и должны проходить проверку подлинности с соответствующим собственным именем пользователя и паролем учетных данных.

Для удаления и возврата к оригинальному termsrv.dll, просто удалите исправленную версию, а также переименуйте резервную копию обратно в «termsrv.dll». Если службы терминалов включены и работают,Вам нужно сделать это в безопасном режиме,.

Если компьютер с Windows XP подключен к домену, в локальную сеть, Windows будет установливать значение RegKey «AllowMultipleTSSessions» в «0» каждый раз, когда компьютер не будет перезапущен. Для того, чтобы было несколько или неограниченное количество сеансов удаленного подключения к рабочему столу допускается в среде домена AD, значение данных для «AllowMultipleTSSessions» которое должно быть установлен в «1» при каждом старте системы. Чтобы изменить значение, просто перезапускайте ts_multiple_sessions.bat каждый раз при запуске компьютера. Кроме того, положите ts_multiple_sessions.bat в C: Documents и Settings All Users Главное меню Программы Автозагрузка папки так, что он будет автоматически запускаться на первого пользователя с правами администратора. Другое решение состоит в установке дополнительного сервиса или определение ключа в ветке реестра HKEY_LOCAL_MACHINE SOFTWARE Microsoft Windows CurrentVersion Run , через которую работает автоматически пакетный файл при загрузке, и это полезно, если компьютер не будет регистрироваться никем, но все ещё ​​требуется работнику, чтобы позволить неограниченные подключения к удаленному рабочему столу для работы.

Другое дело, если пользователь закрывает удаленное соединения вместо завершения сеанса, когда он или она пытается снова войти в систему,появиться сообщение об ошибке кодом 4226 связанное с TCP / IP событием. Чтобы решить эту проблему, загрузите и установите Windows XP TCP / IP, ограничивая подключение и Event ID 4226 патч, и установите связь, по крайней мере 50.

Данная сборка построена на оригинальном образе Microsoft Windows XP Professional SP3 русская версия, со всеми обновлениями!Диск мультизагрузочный. СКАЧАТЬ БЕСПЛАТНО -


Как и в прошлых клиентских версиях операционных систем Майкрософт, пользователи Pro и Enterprise Windows 10 редакций могут удаленно подключаться к своим компьютерам через службу удаленных рабочих столов (RDP). Однако есть ограничение на количество одновременных RDP сессии - возможна одновременная работа только одного удаленного пользователя. При попытке открыть вторую RDP сессию, сеанс первого пользователя предлагается завершить.

По сути, ограничение на количество одновременных rdp подключений является не техническим, а скорее лицензионным, запрещающее создавать на базе рабочей станции RDP сервер для работы нескольких пользователей.

Совет . В домашних редакциях Windows 10 входящие подключения к удаленному рабочему столу совсем запрещены, что, впрочем, можно победить с помощью RDP Wrapper Library .

Мы рассмотрим два способа отключить ограничение на количество одновременных RDP подключений к Windows 10:

    RDP Wrapper Library

    Альтернативой модификации файла termsrv.dll является использования проекта RDP Wrapper Library . Эта программа работает в качестве прослойки между менеджером управления службами (SCM- Service Control Manager) и службой терминалов (Terminal Services) и позволяет включить не только поддержку нескольких одновременных RDP сессии, но и активировать поддержку RDP Host на домашних редакциях Windows 10. RDP Wrapper не вносит никаких изменений в файл termsrv.dll, просто подгружая termsrv с изменёнными параметрами.

    Таким образом, это решение будет работать даже при обновлении версии файла termsrv.dll, что позволяет не опасаться обновлений Windows.

    Скачать RDP Wrapper можно с репозитория GitHub: https://github.com/binarymaster/rdpwrap/releases (последняя доступная версия RDP Wrapper Library v1.6)

    Совет . Кстати говоря, доступны исходники RDP Wrapper Library, что позволяет при желании самому собрать исполняемые файлы.

    Архив RDPWrap-v1.6.zip содержит несколько файлов:

    • RDPWinst.exe —программа установки/удаления RDP Wrapper Library
    • RDPConf.exe — утилита настройки RDP Wrapper
    • RDPCheck.exe — Local RDP Checker — утилита проверки RDP
    • install.bat, uninstall.bat, update.bat — пакетные файлы для установки, удаления и обновления RDP Wrapper

    Чтобы установить утилиту, запускам файл install.bat с правами администратора.

    После окончания установки запускаем RDPConfig.exe . И удостоверяемся, что в секции Diagnostics все элементы окрашены в зеленый цвет.

    Пытаемся открыть вторую RDP сессию. Все получилось! Теперь наша Windows 10 позволяет одновременно подключаться по RDP сразу двум удаленным пользователям.

    Чтобы запатчить новые версии (если не менялась значимо логика работы соответствующего участка кода), необходимо сделать следующее:

    0. Инструкция годится для более или менее образованных, а главное, сообразительных специалистов, умеющих думать. Те, кто привык все “копировать” по Copy/Paste, думается, не справятся и будут разводить “стоны” и “причитания” о том, что “многа букОв”, “сложно” или “нИАсилил” в силу больше страхов и стереотипов мышления, нежели сложности проблемы. Это их удел. Рожденный ползать, как известно, летать не может. Не дай себе засохнуть, Анон! Выпей Иаду или делай ДЕЛО и начни себя уважать!

    1. Скачать любую – платную или бесплатную версию Hiew
    Годятся даже очень древние версии 90х гг, но если требуется патчить х64, то нужны 8.х (начиная с середины 2000х:)) Лучше, конечно, взять свежую. Автор 25 лет развивает продукт и мало есть иных столь совершенных творений мастерства программиста.

    2. Взять termsrv.dll некой поддерживаемой версии – оригинальную и запатченную версии. Если нет запатченной – разумно предположить, что надо ее запатчить имеющимся патчером не тупите! Начинайте думать! Все нужные файлы положить в отдельную папку или папки. Не надо ничего пытаться править на единственной копии в system32. Все равно НИЧЕГО НЕ ПОЛУЧИТСЯ (запись заблокирована в system32) и так делают только бараны.

    3. Сравнить патченную и НЕпатченную версии одного и того же dll любым компарером бинарных файлов. В комплект винды входит консольная утилита FC. Команда “FC /b termsrv.org termsrv.crk > differences.txt” ведет к профиту. Список различий, а он там маленький, строк на 20, направится в файл differences.txt
    Открываем файл текстовым редактором и, либо оставляем открытым, либо переписываем на бумажку с какого и по какое смещение менялись байты. Сразу вникаем и понимаем, что все смещения и значения байтов, как и ниже в Hiew, указаны в шестнадцатиричной системе, но “пугать” это никого не должно, ибо даже переводить в десятичную ничего не потребуется! (Если вдруг понадобится, для общего развития – виндовый калькулятор в помощь.)

    В списке видим (выявляем) 3 условных блока, где адреса идут подряд. Первый блок – 2 байта в самом начале exe, по смещениям 140-с-чемто-h (dll имеет тот же формат, что и exe, разница лишь в том, что в нем только процедуры и функции для внешнего вызова – т.н. экспорты, поэтому и непосредственно исполнить его, переименовав в ехе не удастся). Это данные, поск смещения попадают на заголовок ехе файла. По этим смещениям хранится контрольная сумма кода-данных (без заголовка), которую Винда проверяет перед запуском, убеждаясь, что файл не был поврежден и что нибудь не грохнется, соотв, при попытке его исполнить. Вернемся к ним позже.
    Далее следует блок изменений приблизительно 10 байт. Это, как раз, то, что мы будем изучать. После него есть еще один блок изменений – 6 самых последних байт ехе-шника. Суть сводится к тому, что вместо “нулей” автор вбил свое зычное имя “deepxw” в пустующее место в конце. Низкий ему поклон за патч и идею, но нам повторять его “изыски” при переносе патча особого резона нет, посему, это могут сделать сами желающие, кому нечем заняться долгими зимними вечерами в рамках исследования “Вбивание обычных букОв в пустующие места ехе файлов с использованием Hiew”. Впрочем, можно это воспринимать как дань уважения к автору (просто “там” никто не читает).

    3. Открыть оригинальный dll в одном окне Hiew, запатченный – в другом (запуcтить 2 копии Hiew! Вообще куда удобнее юзать Far – двЭ щтуки, как файл менеджер и основу для запуска “этих ваших” Hiew). В обоих нажать F4 (Mode) и выбрать Decode (F3). Увидим дизассмеблированный кусок файла из самого начала. Смотреть там нечего, ибо Hiew “пытается” дизассемблировать заголовок EXE файла, а это данные, а не код. Нечего туда пялиться, х-ту он вам показывает, что совершенно нормально, ибо тут надо ДУМАТЬ, а не “копировать”! Еще раз собираемся и начинаем думать не нужно пытаться тупо и буквально выполнять инструкцию…

    4. В обоих Hiew (по очереди, блин, думаем…) нажимаем F5 (Goto) и видим, что в верху появилось поле ввода. Туда вбиваем адрес первого различия (из ВТОРОГО БЛОКА!), найденного в файле различий. НАПРИМЕР, в Win7SP1x86Rus это адреса в районе 19100h, а в VistaSP2Eng (x86 или x64 – хз), как я видел в блоге автора – адреса в районе 65200h. Попадаем на место первого исправленного байта.

    Данные в этом окне Hiew имеют вид:
    – В первом столбце – hex смещение – от начала файла, либо в памяти процесса – зависит от режима Hiew, выбираемого по Alt-F1 (Global-Local). По умолчанию показывает Local = как в памяти, если Hiew удается разобраться с форматом кода-данных. В нашем случае это проблемы не представляет ибо формат ехе-файла позволяет ему легко “во всем разобраться”. Поэтому не нужно пугаться увидев там 06F2F8D51 вместо введенного 19153. Адресация по памяти важна для понимания адресации процесса, как она будет выглядеть при исполнении, соотв для анализа кода, если таковой потребуется.
    – Во втором столбце идет шестнадцатиричное представление кода-данных с разбором какой код и какие данные к какой инструкции относятся. Поэтому то каждая строка разной длины. Показано так исключительно для вашего удобства. “На самом деле” (С) в самом файле все они “слеплены” вместе-подряд, что Вы можете лицезреть в режиме “простого” просмотра hex данных (F4->Hex), где “тупо” слева показаны hex байты через пробелы, а справа – “кракозябры” из таблицы ASCII, которые этим байтам соответствуют – как в “любом” “старом-добром” hex редакторе типа WinHex, скрины которого Вы видели на “любом” “кулхацкерском” веб сайте. Мы все время работаетм с одними и теми же байтами, как собственно и сам компьютер делает. Вопрос исключительно в их представлении и интерпретации. Когда Вы копируете исполняемый файла с диска на диск – это ВСЕ ДАННЫЕ и НИКАКОГО КОДА, ибо никто и ничего не исполняет. Но стоит указать Винде, что это исполняемый файл, запустить его, как винда разбирает его на код и данные и запускает только код из заранее предопределенного стандартом и заголовком места, после чего сам код, исполняемый процессором, разбирается далее по своей структуре и сам снова делится на код и данные и так далее.
    В режиме F4->Decode нам, вместо “кракозябр”, показывает байты и “истинный смысл”.
    – В третьем (правом) и самом большом столбце (точнее паре столбцов) нам показывает дизассемблированный участок кода – текстовое, т.н. “мнемоническое” представление этого самого кода (язык ассемблера), предназначенное для сколько нибудь упрощенного и понятного восприятия для “человека разумного”, с его чудесным аналоговым ассоциативным мышлением, крайне тяжко воспринимающего абстрактные “голые” кодовые последовательности.

    5. Выполнив переход на нужное смещение в предыдущем пункте, мы видим, что курсор (серенький такой:)), показывает на начало 6-байтовой команды (в х64 может быть больше байт) правее которой “дизассемблирована” инструкция ТИПА cmp eax,
    если взять на одну строку выше и несколько ниже, то выйдет конструкция ТИПА:
    mov eax,
    cmp eax,
    jz .06F30B25E
    push edi
    push 020
    call .06F2E1440
    pop ecx
    Чтобы понять эту конструкцию совсем не требуется быть “знатоком ассемблера”, хотя рекомендуется иметь хотябы базовые знания по теме “программирование на любом зяыке”. А вот знание Английского языка никак не помешает!

    Первая инструкция (которая никак не патчится, она “выше первого различия”) называется mov – какая, простите, первая ассоциация приходит на ум из английского языка? – правильно – move – т.е. переместить. Аргументы инструкции идут во втором “подстолбце”. eax и edi – это т.н. 32-битные регистры – одиночные ячейки памяти в самом проце, предназначенные для хранения данных в период их обработки. Почти все регистры однотипны, туда теоретически можно записать что угодно, лишь бы влезло, но часть из них традиционно используется для хранения данных определенных типов (чтобы не путаться), например, EAX, EBX, ECX, EDX используются непосредственно для “данных пользователя”, причем ECX традиционно идет как счетчик (циклов например), а ESI, EDI – как указатели некой текущей позиции в памяти, адресов, с которыми предстоит работать. А часть регистров аппаратно зависима и их “лучше не трогать” – например регистр IP автоматически содержит адрес текущей инструкции, которую выполняет процессор, и если попытаться записать туда какие-то свои данные – переменную своей проги, то проц тупо уйдет на инструкцию с этим адресом и все грохнется. ESP – указывает на стек – этакую “бутылку”, в которую кто первый залез, тот последним вылезет (Fist In Last Out), предназначенную для временного хранения данных, которые не помещаются в регистры, но нет смысла их загонять обратно в память, поск они будут использованы вскоре. Для работы с данными, обычно, некий байт – 8бит, слово – 16бит, длинное слово – 32бит или двойное длинное слово 64бит (для 64-бит процессоров) помещаются из памяти в регистр. Для работы с короткими данными можно обращаться к частям регистра (например eax состоит из ax – нижние 16бит и ah и al – части самого ax), но это за пределами нашей проблемы. Потом с данными в регистре производятся некие мат преобразования, после чего результат помещается обратно в память – в туже самую или иную ячейку или любую другую, выделенную автором (или компилятором его) проги для соотв целей.

    В квадратных скобках указываются адреса. Если надо взять ДАННЫЕ из ячейки памяти по какому-то адресу, а не сам адрес, то просто пишут адрес в квадратных скобках. Конструкция ТИПА означает, что данные надо взять из ячейки памяти, имеющей адрес, значение которого получается сложением значения в регистре ESI + 324h. В Ассемблере принято писать более понятно , но автору Hiew было удобнее показывать так, возможно, для наглядности. При вводе команд Hiew отлично принимает стандартные конструкции типа , что показано ниже.

    Итого понимаем, что данная инструкция берет данные (4байта=32бит) по адресу и кладет их в регистр EAX. Следующая инструкция ((которая уже патчится) – CMP. Первое, что приходит на ум светлоликому, прилежно учившему английский в школе – это compare. Речь идет о сравнении. В остальном все тоже самое, что и в предыдущей инструкции. Адрес только соседний. Инструкция
    cmp eax,
    сравнивает содержимое регистра eax и ячейки памяти по адресу . В регистр eax предыдущая инструкция загнала число из соседней ячейки . Теперь его сравнивают с числом из ячейки . Что сложного то, простите??? Барана научить можно! Это уж точно проще, чем “многокилометровые” объекты из какой нибудь говножабы, тянущие за собой тысячи свойств, в которых утонуть можно…
    А как же результат? Сравнить сравнили, ну и что толку, спросит внимательный читатель… Как узнать-то, где собака порылась? А результат хранится в специальном регистре флагов Flags. В этом зарезервированном регистре каждый бит означает некий флажок. В частности есть флажок нуля – Zero. Если в результате выполнения инструкции сравнения выяснится, что числа равны, флажок будет взведен (1), если нет – то сброшен (0) (или наоброт, лень отлачиком смотреть – тут это не важно). Аналогично есть другой флажок на предмет больше-меньше – Sign. Флажки меняются в резуьтате выполнения инструкций их меняющих, и останутся в своем положении, пока не будут изменены в результате выполнения иной инструкции, затрагивающей их состояние. Поэтому после cmp мы можем выполнять любые иные инструкции, зависящие от состояния флажка пока не выполним ту, которая его меняет. Состояние флажков считывается инструкциям условного перехода и некоторыми иными а резуьтатом становится некое действие или бездействие этих инструкций.

    Следующей инструкцией идет
    jz .06F30B25E
    Инструкции, которые начинаются на J [почти] все означают Jump – прыжок, т.е. переход в другое место. Данная инструкция относится к инструкциям условного перехода и расшифровывается как Jump if Zero – т.е. переход по адресу, если стоит флажок Нуля. Если флажок НЕ стоит – то “ничего и не будет”. В качестве аргумента дается адрес перехода (они бывают разные, относительные или абсолютные, “далеко” или “близко” в памяти. Тут адрес указан в адресном пространстве программы, как он настроен по заголовку exe, вникать смысла нет, это лишь все усложнит. Если предыдущая инструкция выявила равенство аргументов, то переход произойдет, если нет, то не произойдет и процессор перейдет к следующей инструкции.

    Следующие 2 инструкции
    push edi
    push 020
    Вспоминаем, что по английски push означает пихать, толкать. Тут это означает загнать числа в стек для временного хранения. Часто так сохраняют переменные перед входом в процедуры, поск внутри процедуры регистры могут использоваться для иных целей, а с помощью стека можно как сохранить значения регистров, так и передать аргументы процедуре, которая их вытащит оттуда после входа в нее, а перед выходом запихает туда результаты если таковые имеются и требуются. Удобство в том, что не нужно заботиться о выделении адресного пространства для хранения временных данных существенного объема. Если нужно передать массив – достаточно просто передать его адрес в памяти. Все элементы массива передавать никакого резона нет, это лишь бесполезно сожрет память и процессорное время, как это делается при быдлокодинге. (Когда требуется сохранение оригинальной копии массива по логике работы – это другая ситуация и сам программист осознанно инициирует копирование массива с целью репликации.)
    При работе со стеком проц сам обо всем позаботится – область для хранения стека выделяется операционкой при аппаратной поддержке проца.
    Первая инструкция сохранит значение регистра EDI – указателя на некую область памяти, а вторая запихнет туда заранее предопределенную константу 20h. Наверное, некий аргумент процедуры, но нам это не важно ибо нет нужды делать анализ, который сделал автор патча – мы ведь переносим готовый патч на другую версию проги и это, обычно, ПРОСТО!

    Следующая инструкция
    call .06F2E1440
    По английски call означает звать, вызывать.
    Речь о вызове процедуры. В коде вызова процедур нет имен – есть адреса, где расположен их код. Для удобства дизассемблеры (в т.ч. Hiew) могут вытаскивать имена процедур и функций из таблиц импортов и экспортов ехе файлов (поск там предполагается взаимодействие разных программ и “библиотек” уже после компиляции и процедурам даются имена, по которым их можно вызвать из другой программы, но внутренние процедуры не поименованы после компиляции). В исходниках имена, конечно, были, но после компиляции они ни к чему… Только место бы занимали. Процессору нет нужды знать чьи то имена, он числа считает… Иногда декомпиляторам/дизассемблерам удается вытащить имена процедур из отладочной информации (если очередной быдлокодер забыл ее отрубить и раздул размер бинарника бесполезной инфой) и это помощь в анализе кода, но нам в нашем случае даже это пофиг. Нам нет нужды понимать зачем нужна эта процедура и что она делает… Напоминаю, у нас есть готовый патч и если удастся его перенести “без приключений” то вникать и не потребуется.

    Последняя приведенная инструкция
    pop ecx
    Pop – действие обратное push – т.е. вытащить последнее загнанное в стек значение. В данном случае в регистр ecx. Наверное эта инструкция нужна чтобы извлечь результат выполнения процедуры, но нам это тоже пофиг, в т.ч. и потому, что эта инструкция, как и 2 push-а выше, и call, после патча не меняются и приведены для некоторого общего представления и как ориентир-граница патча. После патча все эти инструкции останутся на своем месте, как и все после них.

    6. Теперь берем запатченный termsrv.dll в другом окне Hiew, по тому же адресу смотрим какие там инструкции.
    mov eax,
    mov eax, 000000100
    nop
    mov ,eax
    push edi
    push 020
    call .06F2E1440
    pop ecx
    Отличия видим только во второй, третьей и четвертой инструкциях.
    Вторая mov eax, 000000100
    просто вписать константу 100h (=256) в регистр eax
    Третья nop
    самая “смешная” = NoOperation – ничего не делает вообще и вовеки веков. Зачем же она нужна? А нужна она чтобы выровнять синхронизацию по коду-данным. Дело в том, что размеры оригинального и запатченного кода должны полностью совпадать по числу байт и границе команд (вместе с их аргументами). Если что либо сдвинется хотяб на один байт, процессор попадет “не туда”, будет воспринимать некий аргумент инструкции, как команду, а следубщие за ним байты – как аргументы этой команды, даже если там иной код команды. Все съедет сразу же и фатально. 99% что прога вылетит с фатальной ошибкой. Команда nop имеет код 90h и занимает один байт. Если есть избыточный код, не нужный или даже вредный для целей патча, его можно заменить вместе с аргументами на столько nop-ов подряд, сколько байт он занимает. Среди хакеров это называется занопать или занопить. Фактически, это единственный способ удалить лишний код из исполняемого кода, ибо это не текст и любое “вырезание из середины” “с целью укорачивания” немедленно приведет к тому, что сместятся, съедут все адреса и ничего работать не будет вообще. А “самое страшное” случается тогда, когда новый код, которым нужно заменить старый, никак не лезет на “старое” место… Вот тут начинается головная боль у хакера – как его ужать, чтобы влез…
    Четвертая mov ,eax
    поместить число из регистра eax в ячейку памяти
    В принципе третью и четвертую или третью и вторую инструкции можно поменять местами – это ничего не изменит. Но убрать nop никак нельзя ибо новые команды по длине кода на 1 байт меньше чем старые и такое расхождение, если его не парировать nop-ом немедленно приведет к слету синхронизации.

    Сравнение “с тем что было” сразу ставит все на свои места!
    Было – взять число из ячейки , сравнить его с числом из ячейки . Если равны, то “куда то” прыгнуть, если нет то идти дальше и выполнить процедуру. В контексте задачи напоминает это сравнение числа допустимых подключений с пределом допустимых (т.е. 1 для рабочей станции или 2 для сервера). Предел хранится в какой-то константе, адрес которой указан в инструкции сравнения.
    Что стало – взять число из ячейки , забить на “это дело” и тут же перезаписать значение регистра EAX константой 100h (=256 – т.е., видимо, новый предел 256 подключений), после чего поместить это число в ячейку
    Никто ничего не сравнивает, процедура, которая вызывается ниже, всегда будет выполнена. Кроме того, в ячейку , где, очевидно, хранился лимит подключений “насильно” записывается новый лимит =256 на случай, если где-то в другом месте программы имеются иные проверки этого лимита. ВОТ И ВСЕ! Сложно придумать что-то более примитивное!

    Если бы нам пришлось искать это место самостоятельно, то пришлось бы трассировать отладчиком процедуры этого dll, как это очевидно делал автор патча или дизассемблировать все чем-то вроде IDA и внимательно изучать код, содержащий сотни тысяч инструкций. Но у нас все готовое! Это как в анекдоте про механика, который один раз стукнул молотком и машина завелась, но тонкость в том, что он знал куда стукнуть и это стоит немалого труда. (Только не надо тут про деньги – засуньте себе их жопу! Особенно в предверии великого праздника! Для любителей “заработка в интернете” – есть специализированные сайты.)

    Почему же патч не срабатывает на всех последующих версиях – потому, что меняются адреса и слегка меняется код (его аргументы) при компиляции. Это приводит к смещению нужного кода внутри ехе на другие смещения, а если искать по сигнатуре (строгой последовательности байтов), может не находит поск агрументы поменялись. Многие адреса ведь тоже являются аргументами инструкций и меняют бинарный код до неузанваемости при том, что суть его все та же… Сделайте это вручную! У Вас же голова на плечах, а не “строгая последовательность извилин”…

    7. Теперь в ОРИГИНАЛЕ той версии termsrv.dll, которую патчит патчер, нужно найти некую уникальную, в контексте программы, последовательность байт ОКОЛО того места которое нужно запатчить, чтобы поискать ее в новой версии termsrv.dll, той которую Вы хотите запатчить, но патчер ее не патчит…
    Смотреть нужно на дизассемблер, а искать БАЙТЫ ему соответствующие, причем если выбрать что-то слишком “простое”, то такая комбинация будет встречаться при поиске много раз и будет трудно найти нужное место, оно будет “тонуть” среди кучи других похожих. А нам крайне важна “точность попадания”, ибо если запатчить “не там”, то работать не будет, а то и винда повиснет…
    Выбирать для строки поиска инструкции, содержащие длинные фиксированные адреса нельзя. При компиляции других версий они, скорее всего, съедут и Вы ничего не найдете по ним в новой версии.
    Вся процедурка-то, где происходит проверка, маленькая, всего пару десятков команд. Для ассемблера это “ничто”. Hiew покажет вам условные границы процедуры как “полосы” _^_^_^_^_^_. Обратите внимание, что в начале процедуры идет обращение к адресу “импортной” процедуры Windows API – CDefPolicy::Query и Hiew это задетектил (поэтому имя функции и выудил и написал). Это должно стать для Вас хорошим ориентироом, на пути к нужному месту. Кроме того, это “какбЭ намекает”, что может быть есть иной путь решения проблемы, например нахождение некого “секретного” Policy, отвечающего за поведение Terminal Server. Желающие могут потрассировать код отладчиком и поискать как инициализируется переменная или константа с количеством подключений. Но для строки поиска “код от CDefPolicy” не годится, ибо адрес процедуры в импорте, скорее всего съедет в новой версии. Я бы попытался искать по байтам из начала процедуры после CDefPolicy. Там идет:
    57 push edi
    6A10 push 010
    8BF1 mov esi,ecx
    33DB xor ebx,ebx
    выходит 57 6A 10 8B F1 33 DB
    В конце можно добавить еще E8 код инструкции call, идушей следом, но НЕ ее аргумент (следующие байты), ибо это адрес и он поменяется при компиляции новых версий.
    Такая последовательность дает мне при поиске в Hiew (F7-Search)
    Всего 3 совпаденияю Причем вызов CDefPolicy виден в контексте всего в одном случае – в первом же. Если у Вас так же – место найдено, записываем его адрес из первого столбца (предварительно нажав Alt-F1 – Global!) “на бумажку” и пробуем патчить.
    Если код поменялся настолько, что ничего не находит, ищем другие уникальные последовательности, в т.ч. почерпнутые в соседних процедурах и пробуем искать их. Задача – найти нужный код, где “все совпадает по смыслу”, а не последовательность, об этом думаем и смотрим на контекст, пытаясь выискать CDefPolicy::Query в новой версии. Можно искать текст CDefPolicy::Query в новом.dll, Вы найдете строку (неск раз), но не место, где на ее адрес ссылаются. Такой метод иногда помогает найти нужное используя F6 (Reference) в Hiew и мне удалось так найти нужное место в dll от Win7SP1x86Rus ради эксперимента, но не факт что везде удастся, уж тем более с другими прогами).

    8. Теперь надо взять termsrv.dll той версии, которую Вам нужно запатчить. Запускаем третью копию Hiew, открываем в ней новый dll” (дабы легко переключаться между всем трему и сравнивать визуально). Находим нужное место, как описано чуть выше или переходим по адресу, который писали “на бумажку” (бумажка вообще – друг программиста в этом бренном мире, где дохнут жесткие диски, выбивает пробки и виснут ОС).
    Анализируем код ниже CDefPolicy::Query и легко находим нужное место, ПОХОЖЕЕ на:
    cmp eax,
    jz .06F30B25E
    ПОНИМАЕМ, что адрес , но если он поменялся, например на это и есть нужный нам адрес и им и оперируем в дальнейшей правке.

    9. Если убедились, что точно нашли то, что надо, наводите курсор на инструкцию cmp и смело жмите F3-Edit. “Серенький” курсор поменяется на “обычный” (для текстового режима дисплея) – подстрочный. Он должен указывать на ту же инструкцию cmp.
    Жмите на Tab (или F2) и появится диалог ввода ассемблерных инструкций.
    Туда вводите инструкцию
    mov eax, 100
    Потом Enter. На основном экране будет видно что байты “от инструкции” поменялись и часть из них стала “золотой” (желтой). При этом инструкции НИЖЕ “съехали” и в правом столбце напротив них показывает “белиберду” – совсем не то, что там было ранее.
    Диалог ввода команд поверх основного окна продолжает “висеть” и ждать ввода новых инструкций, показывая при этом некую следующую, неверно интерпретированную, из-за съезда адресации, инструкцию.
    На инструкцию эту не обращаем ни малейшего внимания и вбиваем следующую.
    Вбейте nop и нажмите Enter
    В основном окне желтым засветится следующая строка с кодом 90.
    Синхронизация восстановится и следующей командой опять окажется jz. Ее и предложит поменять диалог ввода инструкций.
    Вбивайте туда
    mov ,eax
    Если вместо 320 в команде cmp был иной адрес, значит вбивайте ЕГО!
    Жмите Enter. после этого желтым засветится код в 3 строке, справа от которого должна быть инструкция mov ,eax (или не 320, а то число, которое вбивали).
    Проверяем что НЕ съехала синхронизация кода-данных. Следующей инструкцией должна быть push edi (или иная если код сильно поменялся и у Вас там была иная инструкция до патча – она и должна остаться на своем месте и правильно интерпретироваться, что говорит о том, что дальше нее все ОК).

    Когда все вбили жмите ОДИН РАЗ Esc. Диалог ввода инструкций пропадет, но его можно вызвать еще раз в любой момент (в режиме редактирования) нажав Tab. Все измененные байты будут иметь желтый цвет. Дотошно проверьте, что все выглядит корректно, нигде не накосячили. Проверять за вас тут никто ничего не будет, никаких “защит от дураков” любого ранга и звания НЕТ. Регалии никто учитывать не станет. Что сделали – то и получили. Накосячили – зависнет и работать не будет.
    Если все ОК жмите F9 (Update). Изменения запишутся в файл на диске и измененные байты сменят цвет на обычный (Cyan).

    10. Теперь нужно поправить контрольную сумму ехе. Делать это до безумия скучно, поскю Hiew сделает эту работу за Вас и делать Вам почти ничего не придется. Жмем F8 (Header). Появляется “серое невзрачное” окно с “расшифровкой” параметров заголовка ехе файла.
    Жмем F3 (Edit). Поверх “невзрачного” окна появляется “цветное” фиолетовое. В нем перечислены все параметры заголовка с указанием их адресов и значений. Со скучным лицом листаем ближе к концу и находим там параметр Checksum. Справа указано его значение (собственно контрольная сумма) в шестнадцатиричном и десятичном выражении, оставшаяся “в наследство” от оригинального НЕпатченного файла. Снова жмем F3 и, о чудо, строка окрашивается в желтый цвет и контрольная сумма меняет свое значение. Можем поверить Hiew, а можем найти на форумах или в книгах и посчитать вручную. Если “все устраивает” жмем F9 (Update). Мелькают окна, все пропадает… Это конец, думает непосвященный читатель. Но когда пыль осядет, контрольная сумма оказывается корректной. Недоверчивые могут снова зайти в упомянутый диалог и сравнить Checksum с бережно сохраненным до экзекуции в бакапе на бумажке. Можно выходить из Hiew по Esc и переходить к этапу тестирования своего поделия.

    11. Получив запатченный файл можно пробовать подменить termsrv.dll в целевой ОС.
    В силу защитных механизмов Винды от изменения системных файлов, равно как запрета на запись запущенных программ (sharing violation) потребуется остановка службы Terminal services (см. в комментариях других пользователей выше) и замена копий dll во “всяких WinSxS” итп, дабы самовольная Винда даже и думать забыла о попытках восстановления непатченного варианта.

    Если все работает, значит Вы стали кулхацкером или сделали первый ОСОЗНАННЫЙ шаг на этом пути. Никто не мешает Вам ковырять и познавать дальше, делая мир лучше и добрее. В нете есть много инструкций и целых тематических форумов для тех кто хочет думать своей головой, а не только потреблять ширпотребную порнуху от Матрицы.

    Не побрезгуйте опубликовать список измененных байт (получить его можно с помощью все того же “стокового” “FC /b File1 File2″) для других, менее искушенных пользователей, здесь и/или на других ресурсах, сделайте добро ближнему, как завещал Господь и прославьте свое имя в анналах хакерской истории.

    По списку изменений можно изготовить.CRK файл (для патчеров, понимающих этот древний формат), либо изготовить patch.exe с помощью какого либо патч-мейкера, коих, за годы эволюции, написали десятки и сотни. Только выбирайте тогда “с поддержкой Windows Vista/7″ ибо старые, хоть и хорошие-годные, но ничего не знают об Escalate privileges, и Винда тупо не позволит им что либо патчить в Windows/System или Program Files. В инструкциях следует упомянуть о требовании остановки службы терминалов, либо использовании патчей на файлах в отдельных папках с последующей подменой в system32 силами самих пользователей. В любом случае, список изменений публикуйте, не жлобьтесь на “лавры”, поск кому-то возможно, придется трахаться вручную и инфа позволит найти альтернативное решение. Авторский патчер все это делает автоматически, включая работу с WinSxS – смотрел код, но найти такой патчмейкер, чтобы все это учитывал, думается будет не просто.