Добрый вечер господа! Суть сабжа такова: 1. Я сижу с правами юзера (др. вариантов в априоре нет); 2. на локальной машине есть некий системный сервис (AdminMagic), который создал сокет и прослушивает порт на входящие соединения, количество этих соединений м.б. дохрена, для каждого, ессесно, создается отделный поток; 3. администратор домена коннектится на этот порт и портит мне жизнь; 4. я могу его обломать, если законнекчусь первее его, т.е. займу этот порт; ВОПРОС: могу ли я (юзер) открыть данный процесс (например OpenProcess), скопировать его хэндлы (сокеты) в мой процесс (DublicateHandle) и че-нть с ним сделать страшное, например закрыть совсем или уменьшить счетчик пользователей этого(их) объекта(ов) до нуля,чтоб система сама его(их) прибила (SetHandleInformation). Короче, надо сделать так, чтобы он больше не слушал =)
MegaZu Это, конечно, решит проблему, но не совсем то, что надо. А если соединение УЖЕ установлено? =( Такое вполне возможно (конечно можно сетевой шнур выдернуть, но это слишком =))). Вопрос-то остается... Как получать чужие хэндлы и управлять ими как своими и закрывать когда захочется? P.S. что касается сокетов, то я где-то читал, что во время BIND`а создается таблица соответствий: порт - хэндл сокета. И к этой таблице можно поиметь доступ. Но как, если даже не понятно чё за таблица, где создается и кем...
gloomyraven можно поизвращаться, похувать сенд\ресв , там есть деск. сокета. Главное получить сокет, а закрыть его не проблема.
MegaZu И еще: может так и можно получить "хэндл сокета", но ты слышал про таблицу описателей? Т.е., если твой перехватываемый skt HANDLE = 2h, то в таблице описателей хэндл будет выглядеть так: 1 0х????????? 0x???????? 0x????????? 2 0xF0000000 0x???????? 0x000000001 - "сокет" Эта таблица находится в самом процессе
Мы же не можем взять "2" и считать, что это хэндл сокета =) А даже если смотреть таблицу описателей (чёртову), то каким хреном можно узнать тип хэндла? А может это не сокет, а мьютекс =)
Ведь переменные, которые мы объявляем как хэндлы в своих программах, совсем не хэндлы, а индексы в той самой таблице описателей. По этим индексам процесс получает указатель на хэндл. Это не я придумал, это все Джефри Рихтер из MS =))) Помогите разобраться, я уже запутался.
К сожалению, без повышения привилегий ничего сделать нельзя. Без прав админа ты не сможешь ничего хукать, не сможешь получить хендл сокета, не сможежь загрузит драйвер и.т.д. Так что если сидишь с правами юзера, то про таблицы хэндлов можешь забыть сразу, лучше ищи эксплоиты для поднятия привилегий.
Так ведь обычные хуки можно ставить (Setwindowshook), мало того, у меня получался сплайсинг. Может там у юзера включена debugprivilege? =) Если это так, то можно ли все-таки получить этот сокет?
Во-первых, они работают только с GUI приложениями, во-вторых, для установки хука нужно иметь доступ к декстопу процесса (ну а у юзера досупа к десктопу процессов с более высокими привилегиями нет). Фиг то там С какой это стати ей быть включеной? Короче можно только выдернуть шнур.
Тут на форуме были примеры маленьких снифферов. Качаешь, настроиваешь на этот порт. Если кто канектится - твой снифак ловит и dest\source port и dest\source ip, дальще берёшь эти данные вставляешь в функцию SetTcpEntry и будет тебе счастье
согласно дядьке http://www.madwizard.org This piece of code kills a TCP connection, which does not necessarily have to be owned by your process. It kills the connection by setting the TCP state of it to 'deleted'. Setup a MIB_TCPROW structure which contains the local IP & port as well as the remote IP & port of the connection. Then with the TcpSetEntry function in the IP Helper API, set the state to MIB_TCP_STATE_DELETE_TCB. requires iphlpapi.lib (download from my site) iphlpapi may be useful, but necessary includes are shown below: ;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ IF I_DONT_HAVE_IPHLPAPI_INCLUDES MIB_TCP_STATE_DELETE_TCB equ 12 MIB_TCPROW STRUCT dwState DWORD ? dwLocalAddr DWORD ? dwLocalPort DWORD ? dwRemoteAddr DWORD ? dwRemotePort DWORD ? MIB_TCPROW ENDS ENDIF ;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ TestRow MIB_TCPROW <MIB_TCP_STATE_DELETE_TCB, IPADDR(127,0,0,1),PORTNR(1572), ;local IP & port number IPADDR(127,0,0,1),PORTNR(9944)> ;remote IP & port number ;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ start: invoke SetTcpEntry, addr TestRow
khv_test Flasher Я уже думал насчет IPhlpApi (SetTcpSEntry и иже с ним), но, как сказал(а?) миссис Рэм, они не должны работать. Единственное, что можно извлечь полезного из этой длл (в контексте юзверя) это функцию определения состояния TCP. Да и к тому же библиотека на Си и переделывать её под масм лень (мож у кого есть?) 2 all А пока напрашивается только один вариант: по количеству тредов в процессе (сервиса) определить есть ли к нему коннект от кого-либо и если есть, то выдергиваем сетевой шнур, быстренько коннектимся на ентот порт и вставляем шнур обратно =))) Но это как-то не изящно =) Хотелось бы без выдергивания. А кстати, как можно узнать, что процесс прослушивает порт, и на каком порту уже висит соединение, а то как сделал я... это смешно =D (не используя PCap и IPhlpApi)