Добрый день
Можно-ли как-то перехватить глобально на уровне 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 программ
Здравствуйте, x-code, Вы писали:
x> Добрый день x> Можно-ли как-то перехватить глобально на уровне java.exe некую функцию, а именно функцию http/https запроса в интернет, и заменить там user-agent на свою строку. То есть для любых запросов по http(s) из любых java-программ на компьютере, известных и неизвестных мне, должен подменяться user-agent.
Проще поставить прокси и через него пускать трафик.
Реализаций http — туча. Любой код, который пишет-читает сокет может делать http-протокол. Нет такой одной некой функции и быть не может, даже теоретически, и java тут не при чём.
Здравствуйте, ·, Вы писали:
·>Проще поставить прокси и через него пускать трафик. ·>Реализаций http — туча. Любой код, который пишет-читает сокет может делать http-протокол. Нет такой одной некой функции и быть не может, даже теоретически, и java тут не при чём.
Я уже пробовал, mitmproxy умеет менять заголовки. Работает, но частчино.
Такое чувство, что где-то есть некие java-программы, которые не умеют работать через прокси и все равно пытаюстя лезть напрямую. Допустим даже если я их вычислю, что я с ними сделаю если они так написаны?
Есть еще одна особенность: для скачивания больших файлов по https mitmpoxy должен их скачать целиком, перешифровать своим ключом и отдать программе, а это занимает время. Некоторые java-программы не хотят ждать и считают что наступил таймаут и нет интернетоа. Вот если бы в mitmproxy было кэширование для больших файлов, допустим один раз не получилось а второй раз он сразу отдается — это было бы более-менее приемлемым решением.
Re[3]: Глобальный перехват функции для всех java программ
Здравствуйте, x-code, Вы писали:
XC>·>Проще поставить прокси и через него пускать трафик. XC>·>Реализаций http — туча. Любой код, который пишет-читает сокет может делать http-протокол. Нет такой одной некой функции и быть не может, даже теоретически, и java тут не при чём. XC>Я уже пробовал, mitmproxy умеет менять заголовки. Работает, но частчино. XC>Такое чувство, что где-то есть некие java-программы, которые не умеют работать через прокси и все равно пытаюстя лезть напрямую. Допустим даже если я их вычислю, что я с ними сделаю если они так написаны?
Причём тут java-то? Задай вопрос про любую программу — открывает сокет, пишет-читает байты. Что ты с такой программой сделаешь? Ответ будет тем же. Ну можно transparent proxy поставить попробовать, чтобы весь трафик перехватывался. Учти, если используются ssl серты, то прога может отпинывать невалидные и отказываться работать.
XC>Есть еще одна особенность: для скачивания больших файлов по https mitmpoxy должен их скачать целиком, перешифровать своим ключом и отдать программе, а это занимает время. Некоторые java-программы не хотят ждать и считают что наступил таймаут и нет интернетоа. Вот если бы в mitmproxy было кэширование для больших файлов, допустим один раз не получилось а второй раз он сразу отдается — это было бы более-менее приемлемым решением.
Неясно почему должен... вроде же это поток байт, даже потенциально бесконечный.
но это не зря, хотя, может быть, невзначай
гÅрмония мира не знает границ — сейчас мы будем пить чай
Re[2]: Глобальный перехват функции для всех java программ
Здравствуйте, ·, Вы писали:
·>Реализаций http — туча. Любой код, который пишет-читает сокет может делать http-протокол. Нет такой одной некой функции и быть не может, даже теоретически, и java тут не при чём.
Да не такая уж и туча. Думаю, что относительно используемых можно по пальцам рук пересчитать.
Re: Глобальный перехват функции для всех java программ
Здравствуйте, x-code, Вы писали:
XC>Чатгпт говорит что есть некий Java Agent API (Java Instrumentation API), который вроде бы позволяет сделать это для одной конкретной программы (и даже приводит пример кода). А как сделать для любой программы? Я на java никогда не писал, но наверное если этот код рабочий то собрать его не сильно сложно. Приходит в голову переименовать java.exe в java2.exe, а вместо java.exe написать свою софтину на простейшем winapi, которая запускает оригинальный java2.exe с дополнительными опциями командной строки, необходимыми для внедрения этого самого агента в каждую программу, откуда бы она ни была запущена.
Да, это стандартный подход. Есть еще вариант для упоротых — подменить реализацию HTTP в JRE — она написана на джаве, нужно скомпилировать свою версию и подменить ей стандартную.
Re[3]: Глобальный перехват функции для всех java программ
Здравствуйте, vsb, Вы писали:
vsb> ·>Реализаций http — туча. Любой код, который пишет-читает сокет может делать http-протокол. Нет такой одной некой функции и быть не может, даже теоретически, и java тут не при чём. vsb> Да не такая уж и туча. Думаю, что относительно используемых можно по пальцам рук пересчитать.
Честно говоря, что не уверен, что рук хватит. В любом случае, да даже разные версии конкретных либ могут работать по-разному, и пачтить их надо будет по-разному. Человеку же нужно универсально "java.exe запатчить"... Ну никак.