Глобальный перехват функции для всех java программ
От: x-code  
Дата: 09.06.23 11:16
Оценка:
Добрый день
Можно-ли как-то перехватить глобально на уровне java.exe некую функцию, а именно функцию http/https запроса в интернет, и заменить там user-agent на свою строку. То есть для любых запросов по http(s) из любых java-программ на компьютере, известных и неизвестных мне, должен подменяться user-agent.

Чатгпт говорит что есть некий Java Agent API (Java Instrumentation API), который вроде бы позволяет сделать это для одной конкретной программы (и даже приводит пример кода). А как сделать для любой программы? Я на java никогда не писал, но наверное если этот код рабочий то собрать его не сильно сложно. Приходит в голову переименовать java.exe в java2.exe, а вместо java.exe написать свою софтину на простейшем winapi, которая запускает оригинальный java2.exe с дополнительными опциями командной строки, необходимыми для внедрения этого самого агента в каждую программу, откуда бы она ни была запущена.

А сюда я пишу просто посоветоваться — может это вообще неправильный путь изначально? Может есть какие-то готовые решения? Далее, кто этим пользовался — насколько это вообще просто такое написать, насколько стабильно работает, есть ли подводные камни?
Re: Глобальный перехват функции для всех java программ
От: · Великобритания  
Дата: 09.06.23 11:36
Оценка: +2
Здравствуйте, x-code, Вы писали:

x> Добрый день

x> Можно-ли как-то перехватить глобально на уровне java.exe некую функцию, а именно функцию http/https запроса в интернет, и заменить там user-agent на свою строку. То есть для любых запросов по http(s) из любых java-программ на компьютере, известных и неизвестных мне, должен подменяться user-agent.
Проще поставить прокси и через него пускать трафик.
Реализаций http — туча. Любой код, который пишет-читает сокет может делать http-протокол. Нет такой одной некой функции и быть не может, даже теоретически, и java тут не при чём.
avalon/3.0.0
но это не зря, хотя, может быть, невзначай
гÅрмония мира не знает границ — сейчас мы будем пить чай
Re[2]: Глобальный перехват функции для всех java программ
От: x-code  
Дата: 09.06.23 11:58
Оценка:
Здравствуйте, ·, Вы писали:

·>Проще поставить прокси и через него пускать трафик.

·>Реализаций http — туча. Любой код, который пишет-читает сокет может делать http-протокол. Нет такой одной некой функции и быть не может, даже теоретически, и java тут не при чём.

Я уже пробовал, mitmproxy умеет менять заголовки. Работает, но частчино.
Такое чувство, что где-то есть некие java-программы, которые не умеют работать через прокси и все равно пытаюстя лезть напрямую. Допустим даже если я их вычислю, что я с ними сделаю если они так написаны?

Есть еще одна особенность: для скачивания больших файлов по https mitmpoxy должен их скачать целиком, перешифровать своим ключом и отдать программе, а это занимает время. Некоторые java-программы не хотят ждать и считают что наступил таймаут и нет интернетоа. Вот если бы в mitmproxy было кэширование для больших файлов, допустим один раз не получилось а второй раз он сразу отдается — это было бы более-менее приемлемым решением.
Re[3]: Глобальный перехват функции для всех java программ
От: · Великобритания  
Дата: 09.06.23 12:21
Оценка:
Здравствуйте, x-code, Вы писали:

XC>·>Проще поставить прокси и через него пускать трафик.

XC>·>Реализаций http — туча. Любой код, который пишет-читает сокет может делать http-протокол. Нет такой одной некой функции и быть не может, даже теоретически, и java тут не при чём.
XC>Я уже пробовал, mitmproxy умеет менять заголовки. Работает, но частчино.
XC>Такое чувство, что где-то есть некие java-программы, которые не умеют работать через прокси и все равно пытаюстя лезть напрямую. Допустим даже если я их вычислю, что я с ними сделаю если они так написаны?
Причём тут java-то? Задай вопрос про любую программу — открывает сокет, пишет-читает байты. Что ты с такой программой сделаешь? Ответ будет тем же. Ну можно transparent proxy поставить попробовать, чтобы весь трафик перехватывался. Учти, если используются ssl серты, то прога может отпинывать невалидные и отказываться работать.

XC>Есть еще одна особенность: для скачивания больших файлов по https mitmpoxy должен их скачать целиком, перешифровать своим ключом и отдать программе, а это занимает время. Некоторые java-программы не хотят ждать и считают что наступил таймаут и нет интернетоа. Вот если бы в mitmproxy было кэширование для больших файлов, допустим один раз не получилось а второй раз он сразу отдается — это было бы более-менее приемлемым решением.

Неясно почему должен... вроде же это поток байт, даже потенциально бесконечный.
но это не зря, хотя, может быть, невзначай
гÅрмония мира не знает границ — сейчас мы будем пить чай
Re[2]: Глобальный перехват функции для всех java программ
От: vsb Казахстан  
Дата: 09.06.23 14:21
Оценка:
Здравствуйте, ·, Вы писали:

·>Реализаций http — туча. Любой код, который пишет-читает сокет может делать http-протокол. Нет такой одной некой функции и быть не может, даже теоретически, и java тут не при чём.


Да не такая уж и туча. Думаю, что относительно используемых можно по пальцам рук пересчитать.
Re: Глобальный перехват функции для всех java программ
От: scf  
Дата: 09.06.23 15:20
Оценка:
Здравствуйте, x-code, Вы писали:

XC>Чатгпт говорит что есть некий Java Agent API (Java Instrumentation API), который вроде бы позволяет сделать это для одной конкретной программы (и даже приводит пример кода). А как сделать для любой программы? Я на java никогда не писал, но наверное если этот код рабочий то собрать его не сильно сложно. Приходит в голову переименовать java.exe в java2.exe, а вместо java.exe написать свою софтину на простейшем winapi, которая запускает оригинальный java2.exe с дополнительными опциями командной строки, необходимыми для внедрения этого самого агента в каждую программу, откуда бы она ни была запущена.


Да, это стандартный подход. Есть еще вариант для упоротых — подменить реализацию HTTP в JRE — она написана на джаве, нужно скомпилировать свою версию и подменить ей стандартную.
Re[3]: Глобальный перехват функции для всех java программ
От: · Великобритания  
Дата: 09.06.23 17:26
Оценка:
Здравствуйте, vsb, Вы писали:

vsb> ·>Реализаций http — туча. Любой код, который пишет-читает сокет может делать http-протокол. Нет такой одной некой функции и быть не может, даже теоретически, и java тут не при чём.

vsb> Да не такая уж и туча. Думаю, что относительно используемых можно по пальцам рук пересчитать.
Честно говоря, что не уверен, что рук хватит. В любом случае, да даже разные версии конкретных либ могут работать по-разному, и пачтить их надо будет по-разному. Человеку же нужно универсально "java.exe запатчить"... Ну никак.
avalon/3.0.0
но это не зря, хотя, может быть, невзначай
гÅрмония мира не знает границ — сейчас мы будем пить чай
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.