Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Программирование Новый топик    Ответить
 Эмулятор сокета  [new]
iskatelsql
Member

Откуда:
Сообщений: 875
Нужно покопаться в сетевом трафике некоторой программы (tcp). Не просто прослушать, а модифицировать.

Проблема в том, что адрес сервера как-то используется в самом этом трафике, и написать локальный прокси не выходит, дисконнектится с ошибкой после первого же ответа сервера.

Думаю вопрос можно решить поставив хуки на send / recv, вот только сервер рвет соединение, если по нему ничего не передается. И программа думает что пропал инет...

В этом я чесно говоря слабо разбираюсь, но подозреваю что если создать фейковый сокет, и передать его в connect вместо настоящего, то можно ее обмануть, заставив думать что она приконнекчена и все хорошо. Но мне не удалось найти описание того что из себя физически представляет сокет. Подозреваю что это некоторая структура в памяти... Можете накидать ссылок или пример какой?
25 окт 21, 22:31    [22388076]     Ответить | Цитировать Сообщить модератору
 Re: Эмулятор сокета  [new]
x1ca4064
Member

Откуда:
Сообщений: 1356
iskatelsql

Думаю вопрос можно решить поставив хуки на send / recv, вот только сервер рвет соединение, если по нему ничего не передается. И программа думает что пропал инет...


Вы правильно думаете, но почему сервер рвет соединение? Вы ведь вызываете оригинальные Send/Recv?

В этом я чесно говоря слабо разбираюсь, но подозреваю что если создать фейковый сокет, и передать его в connect вместо настоящего, то можно ее обмануть, заставив думать что она приконнекчена и все хорошо. Но мне не удалось найти описание того что из себя физически представляет сокет.

Это долгий путь в никуда, IMHO

Если у Вас есть прокси, можно перехватить функции connect (и getpeername) и подставлять туда в качестве адреса правильные значения (в коннект подставлять адрес своего прокси, в getpeername - адрес сервера), но это не лучше и не хуже, чем перехват send/recv.
Еще посмотрите функции, которые начинаются на WSA... - возможно программа использует их.
Можно попробовать создать на сетевом интерфейсе дополнительный IP, совпадающий с адресом сервера, а на него уже вешать прокси - этот путь я не исследовал, нужно разбираться с роутинигом, возможно, использовать второй компьютер
26 окт 21, 00:16    [22388114]     Ответить | Цитировать Сообщить модератору
 Re: Эмулятор сокета  [new]
iskatelsql
Member

Откуда:
Сообщений: 875
x1ca4064
Вы правильно думаете, но почему сервер рвет соединение? Вы ведь вызываете оригинальные Send/Recv?


Я хочу полностью отказаться от взаимодействия той программы с сетью.

Рвет по причине бездеятельности на соединении, я хочу все сетевое перетащить к себе. Да и вообще хочу изолировать ее от сети, пусть хавает что я ей даю. Для меня это утилита которая шифрует - дешифрует данные. Я за полный реверс, но реверс ее займет много времени и подводных камней нахватаюсь...

x1ca4064
connect (и getpeername) и подставлять туда в качестве адреса правильные значения

Нет, она даже в пакете передает апи и порт в открытом виде, я пробовал их подменять на реальные, но она учитывает что ей передали в функцию, и обменивается данными на основе этого айпи, собака страшная. (программа эта в длл) Китайцы не далеко ушли от индусов, там хитрая аутентификация в начале и все в открытом виде потом... Вот на этапе аутентификации все рушится если айпи/порт не тот.

Хотелось бы "малой кровью" обьяснить ей что она приконнекчена и счастлива, и пользовать ее как утилиту шифровки / дешифровки. Мне не нужно чтоб она реально коннектилась или передавала данные, мне нужно скормить ей сокет - обманку, чтоб она считала что на связи.

Сообщение было отредактировано: 26 окт 21, 05:08
26 окт 21, 05:06    [22388136]     Ответить | Цитировать Сообщить модератору
 Re: Эмулятор сокета  [new]
Dima T
Member

Откуда:
Сообщений: 16071
iskatelsql
Да и вообще хочу изолировать ее от сети

Для этого есть интерфейс localhost (127.0.0.1). Он доступен только в пределах компа, извне на него не попасть.
26 окт 21, 08:19    [22388154]     Ответить | Цитировать Сообщить модератору
 Re: Эмулятор сокета  [new]
x1ca4064
Member

Откуда:
Сообщений: 1356
iskatelsql


Я хочу полностью отказаться от взаимодействия той программы с сетью.

Это будет другой этап, т.к. перехват send/recv подходит для
Нужно покопаться в сетевом трафике некоторой программы (tcp). Не просто прослушать, а модифицировать.


x1ca4064
connect (и getpeername) и подставлять туда в качестве адреса правильные значения

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

Как программа работает сейчас:
1. s=connect(1.2.3.4:5678)
2. Send(s,....'1.2.3.4:5678'...)
3. Recv(s,....)
4. goto 2
после перехвата:
1. s=HookedConnect(1.2.3.4:5678), а HookedConnect вызывает connect(127.0.0.1:5678)
т.е. программа думает, что конектится к 1.2.3.4, а на самом деле подключается к 127.0.0.1

Возможен вариант, что программа может брать актуальный IP от getpeername, поэтому getpeername тоже нужно перехватывать.
Вы уверенны, что программа ничего важного от сервера не получает?
26 окт 21, 10:00    [22388180]     Ответить | Цитировать Сообщить модератору
 Re: Эмулятор сокета  [new]
iskatelsql
Member

Откуда:
Сообщений: 875
x1ca4064
т.е. программа думает, что конектится к 1.2.3.4, а на самом деле подключается к 127.0.0.1


Тоже вариант, спасибо. Кстати не тоже самое ли получится, если без всяких хуков внести запись в файл hosts? Правда админские права не всегда есть...

Но вообще всетаки хотелось бы превратить ее из проги работающей с сеть в прогу работающую... с файлами что-ли.

Сообщение было отредактировано: 26 окт 21, 18:03
26 окт 21, 18:02    [22388438]     Ответить | Цитировать Сообщить модератору
 Re: Эмулятор сокета  [new]
x1ca4064
Member

Откуда:
Сообщений: 1356
iskatelsql

Тоже вариант, спасибо. Кстати не тоже самое ли получится, если без всяких хуков внести запись в файл hosts? Правда админские права не всегда есть...

Нет - hosts это "мини dns": превращает имя хоста в IP
Но вообще всетаки хотелось бы превратить ее из проги работающей с сеть в прогу работающую... с файлами что-ли.


Перехватите:
1 connect - вместо него вызывайти CreateFile
2 send - writefile
3 recv - readfile
4 getpeername - возвращайте оригинальные параметры подключения
что сокет, что handle файла - это DWORD, поэтому проблем быть не должно, но нужно посмотреть, какие еще функции WinSock задействует программа.
26 окт 21, 18:33    [22388448]     Ответить | Цитировать Сообщить модератору
 Re: Эмулятор сокета  [new]
x1ca4064
Member

Откуда:
Сообщений: 1356
iskatelsql,
У Вас библиотека 32 или 64 бита?
26 окт 21, 19:08    [22388467]     Ответить | Цитировать Сообщить модератору
 Re: Эмулятор сокета  [new]
iskatelsql
Member

Откуда:
Сообщений: 875
x1ca4064
У Вас библиотека 32 или 64 бита?


32

Сообщение было отредактировано: 26 окт 21, 19:14
26 окт 21, 19:13    [22388470]     Ответить | Цитировать Сообщить модератору
 Re: Эмулятор сокета  [new]
iskatelsql
Member

Откуда:
Сообщений: 875
x1ca4064
1 connect - вместо него вызывайти CreateFile
2 send - writefile
3 recv - readfile
4 getpeername - возвращайте оригинальные параметры подключения


Так собственно мой вопрос то был о том что, как я понимаю, сокет содержит какое-то поле типа флага, показывающее что он "на связи", или я не прав? Как программа понимает что соединение закрыто? Если вызвать CreateFile вместо connect не отвалится ли тутже программа, подумав что ее дисконнектнули? Собственно за этим я и хотел создать сокет - обманку, не знаю как физически программа понимает что соединение еще есть.
26 окт 21, 19:59    [22388481]     Ответить | Цитировать Сообщить модератору
 Re: Эмулятор сокета  [new]
x1ca4064
Member

Откуда:
Сообщений: 1356
iskatelsql

Так собственно мой вопрос то был о том что, как я понимаю, сокет содержит какое-то поле типа флага, показывающее что он "на связи", или я не прав?


Функции WinSock возвращают код ошибки: если Send/Recv вернет SOCKET_ERROR, тогда можно вызвать WSAGetLastError и узнать причин.

Сам сокет структуры не имеет - это просто число/handle. С ним работают через функции WinSock

Сообщение было отредактировано: 26 окт 21, 21:12
26 окт 21, 21:03    [22388510]     Ответить | Цитировать Сообщить модератору
 Re: Эмулятор сокета  [new]
Dima T
Member

Откуда:
Сообщений: 16071
iskatelsql
Как программа понимает что соединение закрыто?

В реале нет никакого соединения, это логическое понятие. Есть принимаемые/отправляемые пакеты. В нормальном режиме противоположная сторона сообщает что соединение закрыто. Если этого нет, то надо выждать истечение заданного таймаута, который говорит что на той стороне никого не осталось.
26 окт 21, 21:17    [22388514]     Ответить | Цитировать Сообщить модератору
 Re: Эмулятор сокета  [new]
iskatelsql
Member

Откуда:
Сообщений: 875
x1ca4064
Сам сокет структуры не имеет - это просто число/handle. С ним работают через функции WinSock

Ясно понятно - сам выдумал проблему которой мучаю себе голову... Чтож, бывает.
27 окт 21, 08:05    [22388571]     Ответить | Цитировать Сообщить модератору
 Re: Эмулятор сокета  [new]
Barlone
Member

Откуда:
Сообщений: 1493
x1ca4064


Перехватите:
1 connect - вместо него вызывайти CreateFile
2 send - writefile
3 recv - readfile
4 getpeername - возвращайте оригинальные параметры подключения
что сокет, что handle файла - это DWORD, поэтому проблем быть не должно, но нужно посмотреть, какие еще функции WinSock задействует программа.
select на что замените?
27 окт 21, 10:18    [22388612]     Ответить | Цитировать Сообщить модератору
 Re: Эмулятор сокета  [new]
x1ca4064
Member

Откуда:
Сообщений: 1356
Barlone
select на что замените?


С select, как раз, особых проблем не вижу - можно считать, что файл доступен на запись всегда, а на чтение, если текущая позиция меньше длины. Но эмуляция работы сокета файлом - трудный путь, возможно, не всегда проходимый.
27 окт 21, 11:52    [22388649]     Ответить | Цитировать Сообщить модератору
 Re: Эмулятор сокета  [new]
Dimitry Sibiryakov
Member

Откуда:
Сообщений: 54798
Barlone
select на что замените?

WaitForMultilleObjects, вестимо.
27 окт 21, 13:40    [22388758]     Ответить | Цитировать Сообщить модератору
Все форумы / Программирование Ответить