Меню Рубрики

Rdp server windows 7 одновременное подключение нескольких пользователей

Запускаем RDP на Windows 7 и 10 для нескольких пользователей

RDP — это такой протокол удаленного доступа к одному компьютеру (серверу терминалов), который позволяет нескольким пользователям работать одновременно. Прикиньте, у каждого будет свой рабочий стол в режиме реального времени.

Но есть загвоздка. Работает такая штука только на редакциях Windows 7/10 версий Pro и выше. То есть релизы, обозначенные как Home, курят в сторонке.

Но и это еще не все. Многопользовательский режим на законных основаниях вообще недоступен в ОС, рассчитанных для клиентских машин (не серверных).

Более того, если во время работы локального пользователя на компьютере, например, с Win 10 Pro будет осуществлено подключение терминального, то система попросит «выкинуть» первого из сессии, выдав сообщение.

В систему вошел другой пользователь. Если вы продолжите, он будет отключен. Вы все равно хотите войти в систему?

То есть по факту работать может только один человек: локальный (он же консольный), либо терминальный. Двое одновременно не уживаются никак. Отсюда вопрос.

Почему RDP на Windows 7/10 не работает для нескольких пользователей

Это решение компании Microsoft, которое основывается на приобретении платных лицензий на каждого подключающегося в таком режиме пользователя. А продаются такие лицензии только для серверных операционных систем.

Но для домашних пользователей выход есть и он хорошо показал себя на практике. Главное понять, что в дальнейшем делать с моральным стыдом и угрызениями совести, поскольку такая схема идет вразрез с интересами вышеназванной корпорации.

Знакомьтесь с решением, которые поможет-таки организовать сервер терминалов на Windows 7 и 10 в многопользовательском режиме. Это RDP Wrapper Library . Оно прекрасно подойдет для небольшого офиса, где количество рабочих мест около десятка.

Данное ПО очень простое в настройке, что всегда хорошо воспринимается техническими специалистами на местах. Есть информация на форумах, что даже Home версии Windows поддерживаются, но я лично не проверял.

Давайте переходить к делу и распаковывать скачанный архив. В нем мы видим следующее.

Источник

Несколько RDP сессий в Windows 7

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

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

Для того, что бы позволить нескольким пользователям работать с одним компьютером одновременно, необходимо снять лицензионное ограничение. Для этого команда DeepXW создала универсальный патч. Патч вносит изменения в файл termsrv.dll, который расположен в %SystemRoot%\System32\.

Патч поддерживает: Windows XP SP2 SP3; Vista SP1 SP2; Windows 7 [32bit(x86)/64bit(x64)], Windows Server 2008 SP1/SP2

Скачайте и распакуйте архив, затем запустите соответствующий файл с правами администратора (кликните правой кнопкой мыши на исполняемом файле, выберите “Запуск от имени администратора”). Для 32-разрядных систем используется UniversalTermsrvPatch-x86.exe, для 64-разрядных используется UniversalTermsrvPatch-x64.exe.

Появится окно, как на картинке выше, где можно патчить termsrv.dll для снятия ограничения сеансов удаленного рабочего стола, или восстановить исходный файл в любое время (путь к резервному файлу: \Windows\System32\termsrv.dll.backup). После применения патча, перезагрузите компьютер и можно приступать к работе .

Чтобы проверить снятие ограничения, оставьте открытой сессию одного пользователя на компьютере, где вы применили патч, а с другой машины попробуйте подключиться к компьютеру удаленно от другого пользователя. Если все прошло успешно, то оба пользователя будут активны в системе, каждый в своей сессии.

73 комментария на “ Несколько RDP сессий в Windows 7 ”

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

Пожалуйста!
Я нигде не встречал точной цифры, обозначающей максимально возможное число одновременных пользователей. Так как патч снимает лицензионное ограничение вообще, то, по идее, максимальное число одновременных пользователей зависит только от ресурсов ПК – на сколько хватит. Известны случаи, когда ПК на Windows 7 по RDP использовали 15 человек.

Огромное спасибо! Очень помогло!

А что делать, если поля в окошке UniversalTermsrvPatch-x64.exe не активные?

Вы имеете в виду, что в полях нет соответствующих значений? Точно запускаете патч от имени администратора? Соблюдается соответствие разрядности ОС и UniversalTermsrvPatch?

для вин сервера 2012, никто не знает где патч найти?

А этот не работает?

К сожалению не работает.

Можно сделать так, чтобы две сессии были под одним и тем же пользователем?

Для серверной Windows можно:
необходимо изменить значение fSingleSessionPerUser ключа системного реестра HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\TerminalServer с 0×1 (Force each user to a single session save this ) на 0×0 (Allow multiple sessions per user).
Для обычной Windows – похоже что нельзя.

Спасибо огромное! Работает.

Какой нахрен патч для серверной оси вам нужен? Это ж сервер,там и так всё есть!

Там есть, если у сервера лицензия легальная, а не пиратская. На пиратской все включить без лицензии не получится

нужно зайти под др. пользователем, после чего завершить процесс explorer.exe в текущем rdp-сеансе и запустить его от имени желаемого пользователя: runas /u:username explorer.exe

Скажите, а если это офисная машина.. этот патч проблем с законом не создаст?

Нет. Однако, не следует рассказывать об этом Вашим сетевикам и безопастникам:)

Дело в том, что в офисе всё на X-систамах стоит и проблема заключается в графических пакетах adobe и coral, так что надо так чтобы дизайнеры и верстальщики могли работать без проблем.

т.е. один официальный windows 7 и все к нему. Можно так? Не накажут если ворвутся?

Только не windows7, а windows server.
7-ка, какой бы не была, все равно не даст подключиться нескольким пользователям по RDP без патча.
А вот на windows server Вы можете настроить такое подключение “официально”, используя функционал “Службы удаленных рабочих столов”. За него точно не накажут)).

Усткновил работкет но вот на однгй машине пол дня работает аичерез пол дня начинает писать чтото про службу лицензирования что не достаточное количество лицензий и пользователи не могут подключитьс пока не перезагрузишь машину. Винде переустанавливал но кажлый раз беда одна и таже вин 7 про 64

на WinServer Standart реализуется такое?

ОГРОМНОЕ Спасибо! Все работает.

Чувак – ты просто супер ! СПАСИБО

Это крутой патч, всем советую) Спасибо издателям!

После обновления от 16 октября, в котором изменен драйвер RDP этот способ уже не прокатывает… пришлось откатить обновления, так как использую терминально некоторые программы.

Да действительно после выхода обновления данный способ перестал работать, есть ли возможность обновить патч?

Так где можно посмотреть описание всех обновлений, чтобы удалить именно обновление RDP?

И после обновления Октября 2014 года всё решаемо. В и-нете есть описание где и какие несколько строк заменить вручную (это-же делает этот патч, только автоматически). Так вот если исправить эти файлики вручную, всё точно так же срабатывает. И правится меньше чем за минуту.
x86 Hex Edit
find: 003B86200300000F****** – replace: 00B800010000908986200300
find: FF4350C7 – replace: FF9050C7
find: F8742F68** – replace: F8E92C000000

x64 Hex Edit
find: 8B87380600003987****** – replace: B80001000090898738060000909090909090
find: 60BB01000000 – replace: 60BB00000000
find: 50007418488D – replace: 5000EB18488D

Майкрософт опять обновил termsrv.dll, 8B87380600003987 не находит!

в termsrv.dll (x86) таких последовательностей не нахожу

Уточняю инструкцию.
Последовательность ищем и редактируем не в текстовом режиме а в шестнадцатеричном. Звездочки при поиске не ставим (это просто обозначает любые символы, но мы их потом будем менять).
Работоспособность данной редакции лично проверена, более чем на 15-ти различных системах с Win7, а так же люди отписывались что и на Win8.1 у них тоже это получилось.
Чтобы система дала отредактировать или заменить данный файл, необходимо загрузится со сторонней системы (WinPE), иначе система блокирует файл и не дает его изменить.

Привожу последовательности ещё раз.

x86 Hex edit
find: 00 3B 86 20 03 00 00 0F ** ** ** ** – replace: 00 B8 00 01 00 00 90 89 86 20 03 00
find: FF 43 50 C7 – replace: FF 90 50 C7
find: F8 74 2F 68 ** ** – replace: F8 E9 2C 00 00 00

x64 Hex edit
find: 8B 87 38 06 00 00 39 87 ** ** ** ** ** ** ** ** ** ** – replace: B8 00 01 00 00 90 89
87 38 06 00 00 90 90 90 90 90 90
find: 60 BB 01 00 00 00 – replace: 60 BB 00 00 00 00
find: 50 00 74 18 48 8D – replace: 50 00 EB 18 48 8D

К стати этот же способ действует и на Server2008R2, там используется та же DLL.

Можно и без загрузки с внешней. Мне помогал вариант с остановкой служб “Службы терминалов” и “Совместимость быстрого переключения пользователей” (не напрямую, а через перевод в “отключено” и перезагрузки).
После этого можно менять termsvr.dll
А затем возвратить способы загрузки служб, как до отключения.

Леонид. Не совсем понятно. После обновлений 16 октября, вы пишите: “Последовательность ищем и редактируем не в текстовом режиме а в шестнадцатеричном.”. Т.е. сначала нужно пропатчить программой UniversalTermsrvPatch dll а потом дополнительно отредактировать ручками в hex редакторе или можно самому обойтись без всяких патчей и просто отредактировать в hex? И второй вопрос. Если я возьму эту пропатченную dll в hex редакторе, которая будет работать на винде с последними обновлениями и скопирую ее в винду без обновлений – она будет работать??

Значит так.
Сделал я себе по этому рецепту одновременные сессии в Windows 7, но словил следующую траблу:
Если одновременно с RDP-сессией заходит пользователь с основной консоли, то наблюдаются неприятные артефакты во многих программах. А именно: не прорисовываются окна. Например: Опера, Хром, Embarcadero RAD studio. Выглядит это так: вместо окна программы рисуется любой мусор, который был на его месте до появления этого окна. При этом, кстати, браузеры FireFox и IE работают нормально. А стоит только юзера с консоли отключить, как тут же всё нормализуется. Никто не сталкивался?

Раскопал сам немного пробемму : ноги неё растут из т.н. аппаратного 2D ускорения в винде. Не нашёл у себя, где оно глобально отключается, но обнаружил, что можно отключать его для любого exe’шника, если в его свойствах/Compatibility поставить “совместимость с Windows Vista”.
А у Хрома есть специальная опция: –disable-gpu.

Прошу совета.
У нас небольшая частная контора с 10 компами, подключаемыми терминальным доступом по локальной сети к 1С 8.2 (файловая версия) на Win Server 2003 R2. Кроме 1С ничего в терминалке не используется. Сейчас назрела необходимость увеличения мощностей сервака, так как 4Гига уже маловато для бызы под 10Гиг. Есть желание перейти на Win Server 2008 R2. Но кто-то подкинул идею установить обычную Win 7 Ultimate и пропатчить RDP, дабы снять ограничение количества терминальных подключений. Она типа будет работать шустрее и не так сложна в настройке. Кто что думает?
P.S. На SQL переходить не собираемся, так как продвинутого админа нет, а я SQL не знаи и по этому боюсь.
Прошу сильно не пинать )

на данный момент серверное железо не многим дороже… поэтому советую воспользоваться решениями от НР
1.серверы начального уровня у них не дорогие (за 40к можно неплохой вариант найти)
2.совместимость с 2008 и 2012
3.именно для оптимизации подобных задач и существуют серверные решения винды… здесь же – только первый и далеко не единственный “танец с бубном” имхо
4.задел на будующее
5.серверные решения более стабильны

автору спасибо! все работает… патчил после всех обновок по состоянию на 02.12.14
P.S.: задачи не серверные, потому вполне устраивает и несколько сессий на семёрке)))

Уже неоднократно пользовался этим патчем и все было замечательно.
Затем мне позвонил знакомый, которому я ставил этот патч летом и сказал, что больше шарманка не играет, я снова пришел с патчем, запустил его – termsrv.dll видится как не патченный.
Ну пропатчил я снова, все политики безопасности проверил, там без изменений, но теперь при подключении выдается ошибка, мол неверная пара логин/пароль.
После долгих мучений и опытов было установлено, что с rdp версий до 6 все хорошо, начиная с 6 версии rdp авторизация не проходит. Грешу на сертификаты, т.к. при подключении с версии 5.2 выдается окно с предупреждением о непроверенном сертификате, а с 6 и 7 версии такого окна нет, хотя должно быть хотя бы в первый раз.
Никто не сталкивался с подобным ? Может заменить termsrv.dll на оригинальный и потом снова его пропатчить ?

Использовал этот патч пару лет назад на win serv 2008 – всё отлично работает до сих пор.
Но вот в чем беда: пытаюсь пропатчить другую win serv 2008 (не r2), в которой уже стоят какие-то лицензии microsoft – не патчится. Поменял вручную циферки в файлк termserv.dll – всё то же. При подключении спрашивает логин пароль, и выводит окошко, что лицензии закончились. Как быть?

Большое спасибо автору. Особо порадовало то, что файл лежит не на файлообменнике, а на сайте автора. За это отдельное спасибо.

Большое спасибо. Офигенский патч!

Great post with lots of imtrapont stuff.

Спасибо большое что поделились этим патчем, он меня сегодня очень выручил! Правда искренне благодарен. Успехов и процветания Вашему проекту!
С уважением, Евгений

Добрый день. Такой вопрос: можно ли сделать на рабочем столе два ярлыка подключения к удаленному рабочему столу, чтобы с одного ярлыка подключался под админом а с другого под пользователем.

Создаеш 2 пользователя:
Пользователя с правами админа и без онных прав.
при подключении просто вводиш данные пользователей в зависимости от задач ( нужен админ вводиш логин пароль админа, аналогично простому пользователю )

Доброго дня. Кто знает- опубликуйте пожалуйста байты для Windows 8(8.1) 32/64 bit . Заранее благодарю.

Спасибо, работает! Windows 7

Не знаю, народ, на сколько эта затея продлится и не создаст в будущем проблем (после какого-нибудь очередного обновления). Согласен патч работает, но надо понимать, что Windows 7 – это не серверная OSь. И лично я Windows 7 в корпоративе как терминальный сервер для 1С-ки не использовал бы никогда и ни при каком условии по ряду причин. Уж лучше потратить время и поднять на 2003r2 или 2008r2 и только на реальном железе (виртуалки исключаю строго по определению из-за риска потери данных). Два главных условия: 1) разделение мест хранения данных, система на Raid1, Raid 10 под базы, отдельный Raid под SQL, и отдельный Raid под Backup на самой машине, 2) несколько Гигабитных карт (и минимум два Link-а на маршрутизатор). Удалённые (из WAN) подключаются к одному линку (или паре линков) через проброс на шлюзе, а из локальной сети (т.е. из LAN, или из сети периметра) – подключаются к другому линку (или другой паре линков). А лучше поставить 6-7 Гигабитных карт, чтобы суммировать каналы по каждому направлению, два на внешнее хранилище, одну для связи с DC (контроллером домена) по вопросам аутентификации и авторизации (очень актуально если у вас базы в DBF-е валяются), ну и конечно для захода (админства) для себя любимого. Лень гуглить, вопрос для гуру: а Windows 7 умеет агрегацию делать (т.е. суммировать каналы)? А ведь правда, очень хороший вопрос, который вас сейчас пока не волнует. А те слова, что у нас в конторе будет… всего… да и только… 5, 10 или 15 удалённых пользователей, а завтра их не станет больше, – уже много админов тех сказок слышало, когда через N-дней этих (удалённых сотрудников) становилось более 30 и приходилось ночами ту самую наспех прикрученную систему заново перестраивать. А вы говорите, что всё так просто. Не, я не спорю, если с*кс по-быстрому вас устраивает – патч вам в руки.

Большое спасибо! Все работает! Версия файла 6.1.7601.18637

Подскажите, как можно сделать на RDP чтоб совместим был с видео картой? Или какой нибудь другой протокол есть?

Почему-то я не нашел файл termsrv.dll в директории %SystemRoot%\System32\, хотя патч отработал и достиг своево результата.
Может он правит какой-то другой файл?
Версия Windows Server 2008 R2 Enterprise.

Поясните пожалуйста: в W7x64 есть проверка файлов на сертификацию Microsoft. Ее надо будет отключить? Или этот файлик прокатит ?
Спасибо!

20.06.2016 – win 7 полет нормальный!
В архиве есть ридми и ссылка на сайт автора с кучей интересностей
deepxw.blogspot.com

Подскажите пожалуйста как патчить termsrv.dll — 6.1.7601.23403 в Win7 64bit?

Есть такой прожект на GitHub “RDP Wrap” называется.
DLL в системе не правит и работает даже на Win 10, ложится прокладкой между Терминал-сервов и Службой RDP.

Правда с автологином там трабл. Пароль ручками надо вводить.
Кто ищет, да обрящет……

Какой штраф будет юр. лицу если использовать этот патч с лицензионной системой?

Все отлично работает, большое спасибо!

СПАСИБО АВТОР. Все работает отлично! Здоровья тебе и удачи!

Подскажите, патч установил пользователей создал захожу с удаленного ПК и сразу выбрасывает.
Что делать.

Здравствуйте. А на Windows 10, будет работать программа?

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

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,[esi][000000324]
если взять на одну строку выше и несколько ниже, то выйдет конструкция ТИПА:
mov eax,[esi][000000324]
cmp eax,[esi][000000320]
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][000000324] означает, что данные надо взять из ячейки памяти, имеющей адрес, значение которого получается сложением значения в регистре ESI + 324h. В Ассемблере принято писать более понятно [ESI+324h], но автору Hiew было удобнее показывать так, возможно, для наглядности. При вводе команд Hiew отлично принимает стандартные конструкции типа [esi+324], что показано ниже.

Итого понимаем, что данная инструкция берет данные (4байта=32бит) по адресу [ESI+324h] и кладет их в регистр EAX. Следующая инструкция ((которая уже патчится) – CMP. Первое, что приходит на ум светлоликому, прилежно учившему английский в школе – это compare. Речь идет о сравнении. В остальном все тоже самое, что и в предыдущей инструкции. Адрес только соседний. Инструкция
cmp eax,[esi][000000320]
сравнивает содержимое регистра eax и ячейки памяти по адресу [esi+320h]. В регистр eax предыдущая инструкция загнала число из соседней ячейки [esi+324h]. Теперь его сравнивают с числом из ячейки [esi+324h]. Что сложного то, простите. Барана научить можно! Это уж точно проще, чем “многокилометровые” объекты из какой нибудь говножабы, тянущие за собой тысячи свойств, в которых утонуть можно…
А как же результат? Сравнить сравнили, ну и что толку, спросит внимательный читатель… Как узнать-то, где собака порылась? А результат хранится в специальном регистре флагов 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,[esi][000000324]
mov eax, 000000100
nop
mov [esi][000000320],eax
push edi
push 020
call .06F2E1440
pop ecx
Отличия видим только во второй, третьей и четвертой инструкциях.
Вторая mov eax, 000000100
просто вписать константу 100h (=256) в регистр eax
Третья nop
самая “смешная” = NoOperation – ничего не делает вообще и вовеки веков. Зачем же она нужна? А нужна она чтобы выровнять синхронизацию по коду-данным. Дело в том, что размеры оригинального и запатченного кода должны полностью совпадать по числу байт и границе команд (вместе с их аргументами). Если что либо сдвинется хотяб на один байт, процессор попадет “не туда”, будет воспринимать некий аргумент инструкции, как команду, а следубщие за ним байты – как аргументы этой команды, даже если там иной код команды. Все съедет сразу же и фатально. 99% что прога вылетит с фатальной ошибкой. Команда nop имеет код 90h и занимает один байт. Если есть избыточный код, не нужный или даже вредный для целей патча, его можно заменить вместе с аргументами на столько nop-ов подряд, сколько байт он занимает. Среди хакеров это называется занопать или занопить. Фактически, это единственный способ удалить лишний код из исполняемого кода, ибо это не текст и любое “вырезание из середины” “с целью укорачивания” немедленно приведет к тому, что сместятся, съедут все адреса и ничего работать не будет вообще. А “самое страшное” случается тогда, когда новый код, которым нужно заменить старый, никак не лезет на “старое” место… Вот тут начинается головная боль у хакера – как его ужать, чтобы влез…
Четвертая mov [esi][000000320],eax
поместить число из регистра eax в ячейку памяти [ESI+320h]
В принципе третью и четвертую или третью и вторую инструкции можно поменять местами – это ничего не изменит. Но убрать nop никак нельзя ибо новые команды по длине кода на 1 байт меньше чем старые и такое расхождение, если его не парировать nop-ом немедленно приведет к слету синхронизации.

Сравнение “с тем что было” сразу ставит все на свои места!
Было – взять число из ячейки [ESI+324h], сравнить его с числом из ячейки [ESI+320h]. Если равны, то “куда то” прыгнуть, если нет то идти дальше и выполнить процедуру. В контексте задачи напоминает это сравнение числа допустимых подключений с пределом допустимых (т.е. 1 для рабочей станции или 2 для сервера). Предел хранится в какой-то константе, адрес которой указан в инструкции сравнения.
Что стало – взять число из ячейки [RSI+324h], забить на “это дело” и тут же перезаписать значение регистра EAX константой 100h (=256 – т.е., видимо, новый предел 256 подключений), после чего поместить это число в ячейку [ESI+320h]
Никто ничего не сравнивает, процедура, которая вызывается ниже, всегда будет выполнена. Кроме того, в ячейку [ESI+320h], где, очевидно, хранился лимит подключений “насильно” записывается новый лимит =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,[esi][000000320]
jz .06F30B25E
ПОНИМАЕМ, что адрес [ESI+320h], но если он поменялся, например на [ESI+452h] это и есть нужный нам адрес и им и оперируем в дальнейшей правке.

9. Если убедились, что точно нашли то, что надо, наводите курсор на инструкцию cmp и смело жмите F3-Edit. “Серенький” курсор поменяется на “обычный” (для текстового режима дисплея) – подстрочный. Он должен указывать на ту же инструкцию cmp.
Жмите на Tab (или F2) и появится диалог ввода ассемблерных инструкций.
Туда вводите инструкцию
mov eax, 100
Потом Enter. На основном экране будет видно что байты “от инструкции” поменялись и часть из них стала “золотой” (желтой). При этом инструкции НИЖЕ “съехали” и в правом столбце напротив них показывает “белиберду” – совсем не то, что там было ранее.
Диалог ввода команд поверх основного окна продолжает “висеть” и ждать ввода новых инструкций, показывая при этом некую следующую, неверно интерпретированную, из-за съезда адресации, инструкцию.
На инструкцию эту не обращаем ни малейшего внимания и вбиваем следующую.
Вбейте nop и нажмите Enter
В основном окне желтым засветится следующая строка с кодом 90.
Синхронизация восстановится и следующей командой опять окажется jz. Ее и предложит поменять диалог ввода инструкций.
Вбивайте туда
mov [esi+320],eax
Если вместо 320 в команде cmp был иной адрес, значит вбивайте ЕГО!
Жмите Enter. после этого желтым засветится код в 3 строке, справа от которого должна быть инструкция mov [esi][000000320],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″) для других, менее искушенных пользователей, здесь и/или на других ресурсах, сделайте добро ближнему, как завещал Господь и прославьте свое имя в анналах хакерской истории.

Источник

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

  • Ralink wireless lan driver and application windows 7
  • Raid установка windows на данный диск невозможна возможно оборудование
  • Radmin deployment tool не видит компьютеры с windows xp
  • Radeon x1650 series драйвер windows 7 x64 официальный сайт
  • Radeon software crimson edition relive graphics driver installer for windows 10 64 bit