Нужен ли такой модуль? (Кратко: запросы с подменой TLS (JA3))

Moved Other
  • В планах опубликовать модуль запросов с возможностью подмены отпечатка JA3. Грубо говоря, это полная замена текущего HTTP-клиента способная обходить CloudFlare (и не нужно узнавать IP сайта для обхода).
    Среда: Node.js. Основа: CycleTLS, tough-cookie.

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

    Что планируется реализовать или уже реализовано в первую очередь:

    • GET/POST запросы (позже PUT/DELETE/PUTCH).
    • Легкая подмена JA3 отпечатка (идентичная известным сигнатурам браузера и их связь с User-Agent). Информирование в топике об известных валдиных сигнатурах. Возможность задавать свой JA3 отпечаток или использовать уже предустановленные сигнатуры. В приоритете сигнатуры Google Chrome (потому что я ненавижу корпорацию Google, потому что им пользуется большинство людей, и в BAS эти отпечатки бесплатны). В конечном итоге FingerprintSwitcher не нужен.
    • Включение и отключение редиректа (реализация собственного редиректа, потому что в CycleTLS нельзя адекватно устанавливать cookie при включенном редиректе).
    • Возможность нормально парсить "Set-Cookie", если это необходимо (допустим, это нужно если отключен редирект или хочется модифицировать эти cookie).
    • Автоматическая история cookies для запросов (сохранение и передача, как в текущем HTTP-клиенте). Проверка валидных cookie и их исправление. Возможность добавления собственных cookie, указав только имя, значение и домен. Всё согласно специцикации RFC6265.
    • Конвертация текущей истории cookie в валидные cookie для браузера и HTTP-клиента BAS (то есть конвертация в полукриовай формат BAS без объяснений и спецификации прошу не бейте меня).
    • Дефолтный порядок заголовков, соответствующий браузерному. Возможность устанавливать свой порядок заголовков (а не как сейчас, то есть получается никак).
    • Обертка запросов с настройками количества повторов запроса и их задержкой при неудачном статусе запроса (чтобы самому не городить огромные проверки на статусы в циклах). Возможность отключить обертку, чтобы делать как обычно при текущем HTTP-клиенте.
    • Включение и отключение остановки потока, если за указанное количество повторов в обертке запрос не приобрел успешный статус (с отображением в логе).
    • Автоматическая проверка и кодирование URL-адреса перед отправкой запроса (не нужно дополнительно кодировать сайты с русскими доменами).
    • Автоматическое вычисление заголовка "Content-Length" при POST запросе (почему бы и не да? И вроде CycleTLS делает это сам).
    • Режим отладки: в консоль выводится URL, STATUS, BODY, HEADERS, JA3, USER_AGENT (потому что обычная панель запросов BAS будет недоступна).
    • Реализация и описание в топике базовых известных ошибок (например, неправильного URL, неправильного тела POST запроса, ошибок Cookie и т.д.)

    Моя прошлые идеи решения проблемы:

    Недостатки использование CycleTLS:


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

  • @SecDeveloper said in Нужен ли такой модуль? (Кратко: запросы с подменой TLS (JA3)):

    Недостатки использование CycleTLS:

    А ещё он не все сигнатуры умеет менять, но это вроде лучшее что есть в паблике

  • @UserTrue, добавлю в недостатки, но дотошно не знаю. Полагаю, некоторые версии Firefox не способен подделывать из-за вечно всплывающего "GREASE" от Google Chrome.

  • Дело доброе дело хорошее, уже много раз поднимали этот вопрос. Я за .

  • @SecDeveloper он не все расширения ssl поддерживает, точно не поддерживает 41, и есть ещё другие проблемы там есть в issue.

  • @SecDeveloper BAS нужен любой шас модуль. Острый дефицит модулей ....

  • @SecDeveloper said in Нужен ли такой модуль? (Кратко: запросы с подменой TLS (JA3)):

    "global.cookieStore[номер_потока]", но хотелось бы избежать глобальные переменные (пока в раздумьях).

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

  • Про ошибку с потоками в Node.js и global читал. К счастью пока функций у меня не много и в случае чего переписать на "global" не составит труда. Пока главный вопрос: где хранить cookie потоков. Пока нацелился на глобальные переменные.

    Если есть решения получше CycleTSL + Node.js. Буду рад выслушать и попытаться доработать. В ином случае продолжу текущую реализацию.

    Еще очень интересно услышать про "libcurl-impersonate-win" и параметры, которые мне не удалось передать.

  • @SecDeveloper Кстати если нода по какой-то причине упадет по таймауту, может даже в чужом модуле или коде , то все куки слетят как и все другие состояния.

  • @UserTrue, это да)) все переменные же в ноде. Но неужели она так часто отлетает?
    Как дикий костыль - хранить cookie в файлах?

  • @SecDeveloper said in Нужен ли такой модуль? (Кратко: запросы с подменой TLS (JA3)):

    @UserTrue, это да)) все переменные же в ноде. Но неужели она так часто отлетает?

    Это может быть просто ошибка в чужом коде, например коде пользователя. Дело не в ноде

  • @UserTrue, Как правило, cookie сохраняют в конце скрипта. Если в коде пользователя появляется ошибка, то в таком случае он и с обычным HTTP-клиентом не сохранит cookie.

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

    try{ ... } catch (e)
    

    И целенаправленно положить ноду будет ну очень сложно. А то что при дотошных манипуляциях с настройками 1 потока можно положить все сразу - это понятно. Мне нужно как сумашедшему обрабатывать любые возможные неккоректные значения. Но возможно я неправильно понял?

  • @UserTrue said in Нужен ли такой модуль? (Кратко: запросы с подменой TLS (JA3)):

    @SecDeveloper said in Нужен ли такой модуль? (Кратко: запросы с подменой TLS (JA3)):

    "global.cookieStore[номер_потока]", но хотелось бы избежать глобальные переменные (пока в раздумьях).

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

    Получается в Node.js переменные и функции экспортированные через "module.exports" и подключаемые через "require" в многопотоке создают собственные копии и нагружают память этой кучей? Я правильно понимаю?

  • @SecDeveloper said in Нужен ли такой модуль? (Кратко: запросы с подменой TLS (JA3)):

    @UserTrue, Как правило, cookie сохраняют в конце скрипта. Если в коде пользователя появляется ошибка, то в таком случае он и с обычным HTTP-клиентом не сохранит cookie.

    Речь не только сохранение в файл, но и их наличии в процессе работы. В любой момент после падения процесса ноды их может не стать.

    @SecDeveloper said in Нужен ли такой модуль? (Кратко: запросы с подменой TLS (JA3)):

    И целенаправленно положить ноду будет ну очень сложно. А то что при дотошных манипуляциях с настройками 1 потока можно положить все сразу - это понятно. Мне нужно как сумашедшему обрабатывать любые возможные неккоректные значения. Но возможно я неправильно понял?

    Процесс ноды общий для всего клиентского кода, его использует не только ваш модуль. И если он упадет в чужом модуле или коде то у вас все тоже улетит. А ещё в режиме записи достаточно просто открыть экшен ноды и процесс насколько я понимаю перезапускается. В общем вы не можете полагаться на его постоянство

  • @SecDeveloper said in Нужен ли такой модуль? (Кратко: запросы с подменой TLS (JA3)):

    Получается в Node.js переменные и функции экспортированные через "module.exports" и подключаемые через "require" в многопотоке создают собственные копии и нагружают память этой кучей? Я правильно понимаю?

    Вроде бы нет, но по какой-то магической причине через глобал работает и 500 потоков, а без него максимум 255 или около того. Я не изучал причину этого

  • @SecDeveloper делал ранее себе такой модуль но

    1. cycletls юзает голанг, либо уже компиленый го файл
    2. как уже было отмечено, нужно и саму либу допилить, добавить multipart, фиксануть мелочи с подделкой ja3
  • @SecDeveloper я собирал и некоторый другой перечить решений, могу дать линк на пост

  • @Q_Q, был бы благодарен. Интересно посмотреть.
    А пока что я пытаюсь понять, как управлять dll в BAS и подглядываю синтаксис C++. Явно не мой стек. Мб все-таки получится сделать чистое решение все с тем же многострадальным libcurl-impersonate, судя по тому, что решение с нодой ну не самое элегантное. Ноду я могу и сейчас успешно использовать, но собирать это в модуль для пользователей = разрабатывать костыль. Еще и в ноде костылить в глобал), а там после и все падать у пользователей может...

  • Так как любые состояния в Node.js ненадежны (могут слететь от действий пользователей в Node.js и от неожиданных ошибок в модуле), я принял решение не публиковать модуль. Проведенные тесты и сохранение состояний в глобальные переменные Node.js/файлы/переменные BAS меня не устраивают. Явно не подходит для стабильного массового использования. Это заранее полукостыль в реалиях BAS, хоть и по скорости производительный.

    Кому это необходимо, можно с пониманием реализовать это самому в личных скриптах или, как уже упоминалось, использовать curl-impersonate с небольшими проблемами с производительностью (из-за нагрузки при запуске cmd).


    Приношу извинения тем, кто "возможно" ждал модуль (если такие вообще были).

  • Автору респект за подобные труды