[ИЩУ] Разработчика ПО для обхода защиты servicepipe.ru (JavaScript)

Статус
Закрыто для дальнейших ответов.

norlan

floppy-диск
Забанен
Регистрация
29.04.2023
Сообщения
7
Реакции
0
Пожалуйста, обратите внимание, что пользователь заблокирован
Доброго времени суток. Ищем разработчика для обхода анти-бот системы servicepipe.ru

Суть такая: необходимо обходить защиту servicepipe, вероятно, путем JS-деобфускации алгоритма генерации строки, которая далее проверяется на сервере.

Пример: samokat.ru при первом заходе проходится JS-challenge, далее доступ к сайту открыт.

Оплата до 1000$ за хорошую работу. На гаранта согласен.
 

Основные компоненты и функции скрипта:​

  1. Обфускация кода: Первая часть скрипта обфусцирована, чтобы усложнить его анализ.
  2. FingerprintJS: Основной инструмент для сбора данных об устройстве и браузере. Скрипт загружает библиотеку и использует её для создания "отпечатка" устройства.
  3. Функции для работы с куки:
    • get_cookie_spsn() - возвращает куки с меткой времени (1747422434150)
    • get_cookie_spid() - уникальный идентификатор сессии
    • get_cookie_spsc() - содержит зашифрованные данные с использованием RSA (приватный ключ встроен в код)
  4. Основной процесс:
    • Функция process() запускает сбор отпечатка через FingerprintJS
    • После получения данных вызывается process_impl(), которая:
      • Устанавливает куки с данными отпечатка
      • Проверяет, использует ли сайт HTTPS
      • Изменяет URL через history.replaceState()
      • Перезагружает страницу
  5. Конвертация данных:
    • string_to_hex() - преобразует строки в шестнадцатеричный формат
    • object_to_hex() - преобразует JSON-объекты в шестнадцатеричный формат
Деобфусцированный код, пригодится тебе
JavaScript:
// Основные функции для работы с куки и отпечатком браузера
function string_to_hex(str) {
  let result = '';
  for (let i = 0; i < str.length; i++) {
    result += str.charCodeAt(i).toString(16);
  }
  return result;
}

function object_to_hex(obj) {
  return string_to_hex(JSON.stringify(obj));
}

function process_impl(fingerprintData) {
  // Полифилл для startsWith, если браузер не поддерживает
  if (!String.prototype.startsWith) {
    Object.defineProperty(String.prototype, 'startsWith', {
      'value': function(searchString, position) {
        var position = position > 0 ? position | 0 : 0;
        return this.substring(position, position + searchString.length) === searchString;
      }
    });
  }

  // Проверка на HTTPS
  var isHttps = window.location.protocol.startsWith('https');
  var secureFlag = isHttps ? '; Secure; SameSite=None' : '';
 
  // Получение опций и домена для куки
  var options = get_options();
  var domainFlag = options.cookie_domain ? '; Domain=' + options.cookie_domain : '';

  // Установка куки с данными отпечатка
  document.cookie = get_cookie_spsn() + object_to_hex(fingerprintData) + '; Path=/' + secureFlag + domainFlag;
  document.cookie = get_cookie_spid() + '; Expires=Tue, 19 Jan 2038 03:14:07 GMT; Path=/' + secureFlag + domainFlag;
  document.cookie = get_cookie_spsc() + '; Expires=Tue, 19 Jan 2038 03:14:07 GMT; Path=/' + secureFlag + domainFlag;

  // Обработка перенаправления
  let targetUrl;
  try {
    let targetLocation = new URL(get_location());
    if (targetLocation.hostname === window.location.hostname) {
      targetUrl = targetLocation.pathname + targetLocation.search;
    } else {
      // Если домены не совпадают, перенаправляем на целевой URL
      window.location.href = get_location();
      return;
    }
  } catch (e) {
    targetUrl = get_location();
  }

  // Изменяем URL и перезагружаем страницу
  history.replaceState(null, null, targetUrl);
  location.reload();
}

// Основная функция для сбора и обработки отпечатка браузера
function process() {
  const fpPromise = new Promise(function(resolve, reject) {
    return resolve(FingerprintJS.load());
  });
 
  fpPromise.then(function(fp) {
    return fp.get();
  }).then(function(result) {
    // Создаем объект с данными отпечатка
    let fingerprintData = {
      'version': result.version,
      'sign': result.visitorId,
      'platform': result.components.platform.value,
      'browsers': result.components.vendorFlavors.value,
      'score': result.confidence.score
    };
    
    // Обрабатываем полученные данные
    process_impl(fingerprintData);
  });
}

// Функции для генерации значений куки
function get_cookie_spsn() {
  return "spsn=1727422134250_";
}

function get_cookie_spid() {
  return "spid=1727422134250_336431942530108141181ebe139f7a5b_i09t5uwan65ip6kt";
}

function get_cookie_spsc_encrypted_part() {
  let func = function () {/*-----BEGIN PRIVATE KEY-----
MIICdwIBADANBgkqhkiG9w0BAQEFAASCAmEwggJdAgEAAoGBALkmqsgrnYWxaWf1
+KPPAgI+a4OPHTRFlwUo0eUNKwbzIIhxUvQQGb+lczjOTSCjsP+7dZY5Mt5wTfAd
9VNO2ytP3sx/7GKc1l6gXooWGqsJCN3lauY6+s9GlTzNENVwipJ3D4h/ENthR0xq
EE99ThEYg3nSfzru6gxHCu1WqD3PAgMBAAECgYBkWVC2rOzzSPSYI/he0BOGo84h
v69UZWM0qKsaOcjYO22mhcUwAonyFPoeD7I9vnpwIGnawaWQac3UFmigflzKcI+P
tahm7ETdmoUm7YuHN2yn53RWPTVhyibKATS8QTG2UQvAQqyFRSCi1RIaH74axWYr
tojiQ8bPSdLP8k9cAQJBAOKknvdJhuqgaEB5wsEUK+ttTgM3O53qzpg/hXYj5hgA
8nzZGj1KKL+oT6dQIkLjvDNsDs3+tVLBgiXz4uxND8cCQQDRIjC5ljK5vJRcahKd
FGpWbiH1Xwqo+LdYBGOQIYl6zQe9xcIaPwebWfiu/weBvHnFQfYckd8A4OgbTyD6
93G5AkEA15Ha/bx6zinaXxExM7K6/4eMvzRGyTJwZJFuoOsOTOCBxEw/T/J8hadS
dAKdQ+AWvxZVkotk7hzObMjnmvjFOwJBAJcKPm6Kz6/dRrlH0pGoAPTTLattLOHE
X4YuBUo/Lm+GTKT+gqU6CGBmpnicr+s/GCMi9IDFyW11Aa1XhNY8h+ECQAfrapEi
n62g60odBSiRPMUGl8n4WaWx71evdMzrq2p8cOFA0VhhhbsWwWhepUnyKsuOEJkJ
0RQOIk1cPSAryHQ=
-----END PRIVATE KEY-----
*/};
  let pem = func.toString().match(/[^]*\/\*([^]*)\*\/\}$/)[1];
  return KJUR.crypto.Cipher.decrypt("901593f145a1228d035a706b87013127a082b123af59678e1817971a3dc3875d3db55c2ac51ca88357d367518df4992e5350fb47016c67abaeb248b1371f7c1407673c8646948de4cd5fdac5e5f65a360323e2d3be0a96cb02170b33291b70e9561a49b3c6155bddcd87015d78ae3af7c045903b55e3016922a40447a5e69010", KEYUTIL.getKey(pem));
}

function get_cookie_spsc_uncrypted_part() {
  return "";
}

function get_cookie_spsc() {
  const ret = get_cookie_spsc_uncrypted_part() + get_cookie_spsc_encrypted_part();
  return "spsc=" + ret;
}

function get_options() {
  return JSON.parse('{"is_captcha":false}');
}

function get_location() {
  return "https://samokat.ru/";
}

// Запускаем процесс
process();

    • Скрипт запускает функцию process(), которая использует библиотеку FingerprintJS для сбора данных об устройстве.
    • После получения данных формируется объект fingerprintData с следующими полями:
      • version: версия FingerprintJS
      • sign: уникальный ID посетителя
      • platform: информация об ОС
      • browsers: информация о браузере
      • score: степень уверенности в идентификации
    • Затем вызывается process_impl(), которая:
      • Устанавливает три куки:
        • spsn: содержит метку времени и отпечаток в шестнадцатеричном формате
        • spid: содержит идентификатор сессии
        • spsc: содержит зашифрованные данные (с использованием RSA)
      • Перенаправляет на целевой URL или изменяет текущий URL с перезагрузкой страницы
    • Важной частью является приватный RSA ключ, который используется для расшифровки данных куки spsc.
    [*]
 
Пожалуйста, обратите внимание, что пользователь заблокирован
ИИ наше все

Основные компоненты и функции скрипта:​

  1. Обфускация кода: Первая часть скрипта обфусцирована, чтобы усложнить его анализ.
  2. FingerprintJS: Основной инструмент для сбора данных об устройстве и браузере. Скрипт загружает библиотеку и использует её для создания "отпечатка" устройства.
  3. Функции для работы с куки:
    • get_cookie_spsn() - возвращает куки с меткой времени (1747422434150)
    • get_cookie_spid() - уникальный идентификатор сессии
    • get_cookie_spsc() - содержит зашифрованные данные с использованием RSA (приватный ключ встроен в код)
  4. Основной процесс:
    • Функция process() запускает сбор отпечатка через FingerprintJS
    • После получения данных вызывается process_impl(), которая:
      • Устанавливает куки с данными отпечатка
      • Проверяет, использует ли сайт HTTPS
      • Изменяет URL через history.replaceState()
      • Перезагружает страницу
  5. Конвертация данных:
    • string_to_hex() - преобразует строки в шестнадцатеричный формат
    • object_to_hex() - преобразует JSON-объекты в шестнадцатеричный формат
Деобфусцированный код, пригодится тебе
JavaScript:
// Основные функции для работы с куки и отпечатком браузера
function string_to_hex(str) {
  let result = '';
  for (let i = 0; i < str.length; i++) {
    result += str.charCodeAt(i).toString(16);
  }
  return result;
}

function object_to_hex(obj) {
  return string_to_hex(JSON.stringify(obj));
}

function process_impl(fingerprintData) {
  // Полифилл для startsWith, если браузер не поддерживает
  if (!String.prototype.startsWith) {
    Object.defineProperty(String.prototype, 'startsWith', {
      'value': function(searchString, position) {
        var position = position > 0 ? position | 0 : 0;
        return this.substring(position, position + searchString.length) === searchString;
      }
    });
  }

  // Проверка на HTTPS
  var isHttps = window.location.protocol.startsWith('https');
  var secureFlag = isHttps ? '; Secure; SameSite=None' : '';
 
  // Получение опций и домена для куки
  var options = get_options();
  var domainFlag = options.cookie_domain ? '; Domain=' + options.cookie_domain : '';

  // Установка куки с данными отпечатка
  document.cookie = get_cookie_spsn() + object_to_hex(fingerprintData) + '; Path=/' + secureFlag + domainFlag;
  document.cookie = get_cookie_spid() + '; Expires=Tue, 19 Jan 2038 03:14:07 GMT; Path=/' + secureFlag + domainFlag;
  document.cookie = get_cookie_spsc() + '; Expires=Tue, 19 Jan 2038 03:14:07 GMT; Path=/' + secureFlag + domainFlag;

  // Обработка перенаправления
  let targetUrl;
  try {
    let targetLocation = new URL(get_location());
    if (targetLocation.hostname === window.location.hostname) {
      targetUrl = targetLocation.pathname + targetLocation.search;
    } else {
      // Если домены не совпадают, перенаправляем на целевой URL
      window.location.href = get_location();
      return;
    }
  } catch (e) {
    targetUrl = get_location();
  }

  // Изменяем URL и перезагружаем страницу
  history.replaceState(null, null, targetUrl);
  location.reload();
}

// Основная функция для сбора и обработки отпечатка браузера
function process() {
  const fpPromise = new Promise(function(resolve, reject) {
    return resolve(FingerprintJS.load());
  });
 
  fpPromise.then(function(fp) {
    return fp.get();
  }).then(function(result) {
    // Создаем объект с данными отпечатка
    let fingerprintData = {
      'version': result.version,
      'sign': result.visitorId,
      'platform': result.components.platform.value,
      'browsers': result.components.vendorFlavors.value,
      'score': result.confidence.score
    };
   
    // Обрабатываем полученные данные
    process_impl(fingerprintData);
  });
}

// Функции для генерации значений куки
function get_cookie_spsn() {
  return "spsn=1727422134250_";
}

function get_cookie_spid() {
  return "spid=1727422134250_336431942530108141181ebe139f7a5b_i09t5uwan65ip6kt";
}

function get_cookie_spsc_encrypted_part() {
  let func = function () {/*-----BEGIN PRIVATE KEY-----
MIICdwIBADANBgkqhkiG9w0BAQEFAASCAmEwggJdAgEAAoGBALkmqsgrnYWxaWf1
+KPPAgI+a4OPHTRFlwUo0eUNKwbzIIhxUvQQGb+lczjOTSCjsP+7dZY5Mt5wTfAd
9VNO2ytP3sx/7GKc1l6gXooWGqsJCN3lauY6+s9GlTzNENVwipJ3D4h/ENthR0xq
EE99ThEYg3nSfzru6gxHCu1WqD3PAgMBAAECgYBkWVC2rOzzSPSYI/he0BOGo84h
v69UZWM0qKsaOcjYO22mhcUwAonyFPoeD7I9vnpwIGnawaWQac3UFmigflzKcI+P
tahm7ETdmoUm7YuHN2yn53RWPTVhyibKATS8QTG2UQvAQqyFRSCi1RIaH74axWYr
tojiQ8bPSdLP8k9cAQJBAOKknvdJhuqgaEB5wsEUK+ttTgM3O53qzpg/hXYj5hgA
8nzZGj1KKL+oT6dQIkLjvDNsDs3+tVLBgiXz4uxND8cCQQDRIjC5ljK5vJRcahKd
FGpWbiH1Xwqo+LdYBGOQIYl6zQe9xcIaPwebWfiu/weBvHnFQfYckd8A4OgbTyD6
93G5AkEA15Ha/bx6zinaXxExM7K6/4eMvzRGyTJwZJFuoOsOTOCBxEw/T/J8hadS
dAKdQ+AWvxZVkotk7hzObMjnmvjFOwJBAJcKPm6Kz6/dRrlH0pGoAPTTLattLOHE
X4YuBUo/Lm+GTKT+gqU6CGBmpnicr+s/GCMi9IDFyW11Aa1XhNY8h+ECQAfrapEi
n62g60odBSiRPMUGl8n4WaWx71evdMzrq2p8cOFA0VhhhbsWwWhepUnyKsuOEJkJ
0RQOIk1cPSAryHQ=
-----END PRIVATE KEY-----
*/};
  let pem = func.toString().match(/[^]*\/\*([^]*)\*\/\}$/)[1];
  return KJUR.crypto.Cipher.decrypt("901593f145a1228d035a706b87013127a082b123af59678e1817971a3dc3875d3db55c2ac51ca88357d367518df4992e5350fb47016c67abaeb248b1371f7c1407673c8646948de4cd5fdac5e5f65a360323e2d3be0a96cb02170b33291b70e9561a49b3c6155bddcd87015d78ae3af7c045903b55e3016922a40447a5e69010", KEYUTIL.getKey(pem));
}

function get_cookie_spsc_uncrypted_part() {
  return "";
}

function get_cookie_spsc() {
  const ret = get_cookie_spsc_uncrypted_part() + get_cookie_spsc_encrypted_part();
  return "spsc=" + ret;
}

function get_options() {
  return JSON.parse('{"is_captcha":false}');
}

function get_location() {
  return "https://samokat.ru/";
}

// Запускаем процесс
process();

    • Скрипт запускает функцию process(), которая использует библиотеку FingerprintJS для сбора данных об устройстве.
    • После получения данных формируется объект fingerprintData с следующими полями:
      • version: версия FingerprintJS
      • sign: уникальный ID посетителя
      • platform: информация об ОС
      • browsers: информация о браузере
      • score: степень уверенности в идентификации
    • Затем вызывается process_impl(), которая:
      • Устанавливает три куки:
        • spsn: содержит метку времени и отпечаток в шестнадцатеричном формате
        • spid: содержит идентификатор сессии
        • spsc: содержит зашифрованные данные (с использованием RSA)
      • Перенаправляет на целевой URL или изменяет текущий URL с перезагрузкой страницы
    • Важной частью является приватный RSA ключ, который используется для расшифровки данных куки spsc.
    [*]

:D
 
ИИ наше все


:D
Байпассить это дело можно только через headless и далее запросы с куками от хедлесс.
Т.к. в противном случае всегда есть вариант поменять что-то на лету и байпас кодом уже не будет работать.
 
Статус
Закрыто для дальнейших ответов.
Верх