Задать вопрос
  • С чего начать для возможности написания программы встроенной в игру Lineage 2?

    VoidVolker
    @VoidVolker
    Dark side eye. А у нас печеньки! А у вас?
    С изучения:
    • Ассемблер
    • Дизассемблер
    • C и С++
    • Обратная разработка
    • Работа процессора и процессорных команд
    • Механизмы работы ОС как на низких уровнях, так и на высоких
    • Системные вызовы и их работа на всех уровнях
    • Механизмы защиты ОС и приложений
    • Сетевой стек ОС
    • Работа сети на всех уровнях
    • Механизмы, протоколы и способы коммуникаций приложений по сети
    • Противодействие взлому приложений, чтению и изменению памяти
    • Шифрование сетевого трафика и противодействию взлому сетевых протоколов
    • Механизмы работы античитов и противодействия взлому игр
    • Чтение и изменение памяти работающих приложений
    • Внедрение своего кода в приложения и ОС
    • Игровые движки, их механизмы работы на всех уровнях
    • Графические движки, видео-драйверы, видеокарты и как всё это работает на всех уровнях

    вот пример, как пишется простая программа, которая может интегрироваться в любую игру

    Это чисто физически невозможно: каждое приложение уникально и у всех игр своя логика и свои движки. Для каждой игры надо писать свой код. И даже зачастую для разных версий одной и той же игры. Универсального решения не существует.
    В целом же взлом любой игры/приложения сводится к исследованию того, как оно внутри устроено, какие инструменты использовались при его разработке и всей остальной обратной разработке. А уже после этого ищется решение для получения/изменения нужных данных или внедрения своего кода.
    Ответ написан
    Комментировать
  • С чего начать для возможности написания программы встроенной в игру Lineage 2?

    opium
    @opium
    Просто люблю качественно работать
    а ты на L2J-приватнике или нет? если да — там server-side Java-скрипты могут слушать чат-события прямо на сервере. если нет — включи команду /chatlog в игре (она записывает чат в папку ChatLog), потом читай файл watchdog'ом на Python, новые строки — requests.post() на свой сервер.
    Ответ написан
    4 комментария
  • Как модифицируют клиенты Lineage2?

    @tukreb
    Пишется программа, которая патчит библиотеки/бинарь клиента. Для этого придётся дизассемблировать/декомпилировать и изучить код. А так как клиент на UE3 написан на С++, полноценная декомпиляция/реверсинг сложнее, придётся разбираться с ассемблером и ABI.
    В то же время не всё обязательно требует полного реверса: многие визуальные правки (иконки, текстуры, макеты, скрипты) делают заменой ресурсов или правкой скриптов без ASM.
    В общем, для мелких графических модов достаточно навыков работы с ресурсами и архивами; для серьёзного патчинга бинарника нужен опыт в C++, ассемблере, работе с PE/HEX и дизассемблерах. Это может занять от часов/дней (простые правки) до месяцев/лет (глубокий реверсинг).

    Как итог, купите готовое решение за N баксов (в рублях будут миллионы) либо потратьте в 2–3 раза больше N баксов на профессионалов. Вы сами это не осилите, здесь нужны годы знаний в самых сложных языках и крепкий фундамент знаний.
    Ответ написан
    Комментировать
  • Как правильно сделать запрос на страницу для получения данных не по апи?

    VoidVolker
    @VoidVolker Куратор тега JavaScript
    Dark side eye. А у нас печеньки! А у вас?
    Для этого вам надо использовать либо эмулятор браузерного движка для ноды либо полноценный браузерный движок. Эмулятор не реализует полный функционал браузера и в некоторых случаях код на странице может работать некорректно. С браузером есть несколько вариантов: использовать селениум или любую другой альтернативный способ управления браузером либо использовать браузерные движки с интегрированной нодой типа NWJS или Electron. Обычно сайты блокируют попытки парсинга страниц ботами. Поэтому, при наличии APi следует использовать именно API, а не парсинг самого сайта.
    Ответ написан
    Комментировать
  • Как правильно сделать запрос на страницу для получения данных не по апи?

    Mike_Ro
    @Mike_Ro Куратор тега JavaScript
    Python, JS, WordPress, SEO, Bots, Adversting
    Несколько вариантов:
    - Блок по отсутствию заголовков или общая более сложная анти-бот система.
    - Если контент на сайте подгружается динамически, то мы увидим минимальный html с js скриптом (что собственно и произошло), т.к. fetch возвращает первый ответ сервера.
    try {
      let res = await fetch(
        'https://dzen.ru/',
        {
          headers: {
            'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/119.0.0.0 Safari/537.36',
            'Accept-Language': 'ru-RU,ru;q=0.9,en-US;q=0.8,en;q=0.7',
          },
        },
      );
    
      if (!res.ok) {
        throw new Error(res.status);
      }
    
      console.log(await res.text());
    
    } catch (err) {
      console.error(err);
    }
    
    // <body></body><script nonce='ad618779e9500fc2a7d9bed71cf12869'>var it = {"host":"https:\u002F\u002Fsso.dzen.ru\u002Finstall?uuid=ae69654d-6b40-4184-8839-82c85f5eaedf","retpath":"https:\u002F\u002Fdzen.ru\u002F?is_autologin_ya=true","dzen":"0"};(function() { var form = document.createElement('form'); var element1 = document.createElement('input'); var element2 = document.createElement('input'); var element3 = document.createElement('input'); element1.name = 'retpath'; element1.type = 'hidden'; element1.value = it.retpath; form.appendChild(element1); element2.name = 'container'; element2.type = 'hidden'; element2.value = '1770895244.11710656.qX-ymzWyuTn9gVki.A7P1RG6nGqnkgXc_G-efyrlAO8dSE3AngEeixcNpU-0n6URKhn9Rb5gv0hp5_WD2zV5swZXnt4a3Sh9suAGvZcnJGAuYivGBF_CRsY5ObL6oz18S3HCBB4AlrMUfdb2pBcr_KCnnfC4L1Xkfz8HxFxga07tg9pohOWFDVAJq1Lpmaj2vAqhuAv9bFiNd9uWlXbA8Mhkb-y8RtrmZt5UcciU5nj5RdPPJDv8chhGRcrstadDtiyuYtIklrB1JTlV7k_kUrUTnk-M2A-9Efgh2xyEjIRwNe0edwWg5hAnp76ZO2WH-qdOZxzgI6OLrS-zyD2rNVmiTUrRMXwjmY2JJUI8SdRsBH2yKnYXm_xWH-ixffOf84KLD_ZNuB1cfzA4w3nmkh6svzaipaWCfTJoV51jW7WHdONND-Ua5GxtqJXK1rYeXrl0sLI0DSI5H0tYB6SXLljc6-xZL5vrpvq5nZZuiOHgupGUbHlmpjfUe_swd61LDP15y8qVKePI-L-vievaZ9mSfTaMCn20_VD22dTvJXS6HN1P9zuhQ3Z8X-PvVCV8HNpdObX01gko6-e1ZVaCmwaq24YwoNfYoFJNqF83nMET52ps8GcveLO-Cl_RLxeIlTvlPl92uGQbLMaHuaSHAHq0JYlO1Q0SPMLQp0yGx8sxpCp7t46nLdF3Vhbu2Wq_sDYaot8stooTl4U6OHfFx3TRyBTQvQ7mWLayIwuGQLouRpKyAlMTfS11HU53EC2LEl9-L53n_3wFPhzB3lfDRU2WSaG0T0rafQ8ubquBmcRIkytdRm8qDpwzKVmmUXFHaejmAc9XIEifofDiEG96MpIx0oc77HeGEmwmIDxldOPqCupAUsRreoZssSBJYM1Xnyb4XCGH9XeFY9a0cKPzcwImtwagP1EdNP5rz-B5g0z4FNknUkdNQsq39q4BAftIDhb2KVdmGGp1NRyj0v3LUmGATZoGk3JpFZBuGV5oDCj29ZBIYDYEsKHaOKL70mOjHmLMmSlk7vOeoluAiX422wMniAgt3e-V5mo_i-jL9tOrRocbMdcizRTX8stqinOzlut5pde54XfY1b_m3lANXXNRdgZLp6cSxnNg6w1aGBB8rSx8lXtlNrwBpaPejp0b2kpCcw-6ga6c3zuzItpwZ6O3VZUyzL85c0Bf4jdtwTJ9zLm_9j7MkAIzUCT3PTbLLzcZA5_jGQMXUg3xvQI-53RzWVuj2Z7zDXmm58WUPjn5r6kUiBr0ZumpNdYwsfC83EU5eGyMPulKmS5N4gzyxi1_XVxYhrDg0OQGUHs5_0uRf-Lh5edlzoM4mzLEZiapfaqsEnme-yVkwDFgSM7-i3CsVsLKreuDcfxwdB80u-7N5OM5ppZA3XjerasaS6mA4L7CvOcspPHUMXrwi-z_jsWRnEia3z7510GCpYbml6-WY_YdQOj_Q0_HtLF7i2G3lly32ieSrzg6EvrPXPvaQfsS3eX1FTGk.XdnKkcqYYirqyGrd38wg3g'; form.appendChild(element2); element3.name = 'dzen'; element3.type = 'hidden'; element3.value = it.dzen; form.appendChild(element3); form.method = 'POST'; form.action = it.host; document.body.appendChild(form); form.submit();})();</script>

    Я хочу получать список новостей с сайта, но при фетче страницы, я ничего не получаю в ответ.

    В отладчике браузера смотрите, куда страница шлет запросы, смотрите на заголовки и прочие данные, которые она шлет, затем пытайтесь слать аналогичные запросы из под ноды.
    В примере с апи всё работает.

    Для быстрой проверки используйте терминал, например с curl (или curl.exe для винды):
    $ curl https://dzen.ru
    $
    $ curl https://api.github.com/repos/javascript-tutorial/en.javascript.info/commits
    [
      {
        "sha": "d78b01e9833009fab534462e05c03cffc51bf0e3",
        "node_id": "C_kwDOBY7uftoAKGQ3OGIwMWU5ODMzMDA5ZmFiNTM0NDYyZTA1YzAzY2ZmYzUxYmYwZTM",
        "commit": {
          "author": {
            "name": "Stanislav (Stanley) Modrak",
            "email": "44023416+smith558@users.noreply.github.com",
            "date": "2025-11-20T20:55:50Z"
          },
          "committer": {
            "name": "GitHub",
            "email": "noreply@github.com",
            "date": "2025-11-20T20:55:50Z"
          },
          "message": "Merge pull request #3906 from cathoderay/master\n\nMinor grammar improvement",
          "tree": {
            "sha": "e7064bb8aaef800dbe406e245bbfe0e69ec6d270",
            "url": "https://api.github.com/repos/javascript-tutorial/en.javascript.info/git/trees/e7064bb8aaef800dbe406e245bbfe0e69ec6d270"
          },
          "url": "https://api.github.com/repos/javascript-tutorial/en.javascript.info/git/commits/d78b01e9833009fab534462e05c03cffc51bf0e3",
          "comment_count": 0,
          "verification": {
            "verified": true,
            "reason": "valid",
            "signature": "-----BEGIN PGP SIGNATURE-----\n\nwsFcBAABCAAQBQJpH4BWCRC1aQ7uu5UhlAAAntUQAFeFvVv0p3ncxrNhfuVopAmE\nNmlXv+VtX2eYBLDzZn24N5fLme9wYT5sE2Ib4cyJgtNRWf+iYv66MqBoIu6oqMYE\n26y7Ylhjp3gr6/yUjfFLTvhZqOtLvddY7kH8sMH+r0T+MEvqCbwv30oKWdx39sa2\nTYvBjarpLpcdOm6k/amkDveLj148gehKZB1xeg5VgSDIdwl9cFAWLLlyf4s9dkCB\niX1+82NLR1uWT23WmflBClaP8Q+MH0dLe79KK9Aa8MV0ZuN2KQnhZ/0ICBQUAT7k\na5ks2lFJv+35S/mFjYxCIWGeHf6ntsa7NnJo/tDtSFOMVLwxZ17KeJQjBt5gvFyo\nW1xOpgCpeFL3V9fC567QZ4h2UG1pAn/3Susc6WfG7A4WsGR2La7IuzP2XbcZAN1+\nksewNCSumhWtXsmT9rdzBiDB7mchWljJKzXOAcwTL3rsenpUeLVeexU19qzdUZ4b\nLMjLbt1u+xauX85+k5OW8r/9jiz+gE3B6g3SzNY9ktAxVVQzPq83u22Z27Cm6asL\n5BnDhKIXNA+9UXCVcUWCAsSuxoV4Hgeh6htWqGBEZPWUGHUUt0l4EybnMQRtYn4P\nxTyqyIQK1rioU5Wk/4LrQ9YwPgBgNj1+FV/idunDuYcZm02N7zhCXZu9PLx2MU4u\ndwszDjfzlv5FsMNt5NRz\n=hmS8\n-----END PGP SIGNATURE-----\n",
            "payload": "tree e7064bb8aaef800dbe406e245bbfe0e69ec6d270\nparent 5e893cffce8e2346d4e50926d5148c70af172533\nparent 9ef986e9cb68073eef1c6a9ac076ec2cb3b95637\nauthor Stanislav (Stanley) Modrak <44023416+smith558@users.noreply.github.com> 1763672150 +0000\ncommitter GitHub <noreply@github.com> 1763672150 +0000\n\nMerge pull request #3906 from cathoderay/master\n\nMinor grammar improvement",
            "verified_at": "2025-11-20T20:55:50Z"
          }
    ...
    Ответ написан
    Комментировать
  • Какие данные берет функция для генерации случайного числа?

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

    Алгоритмы в играх могут быть сложные и однозначно направленные 'против' игрока.
    spoiler
    Например, throne and liberty алгоритм выпадения следующего trait (улучшение на предметы, требуется несколько однотипных для завершения), выдает 'не нужные' с бОльшими шансами (причем на порядок, речь идет о десятках не нужных на один нужный), или предмет, выпадающий с редких сундуков, нужный твоему классу не выпадет месяцами, но как только ты купишь такой на аукционе (за итемы которые очень сложно добывать либо нужно покупать за реал) так эти предметы тут же посыпятся. Это подтверждено практикой, и даже есть рекомендация, прокачивать blessing у предметов, вскрыв сначала самые мусорные трейты (которые на аукционе стоят дешевле) а затем сменить их перед самой заточкой, алгоритм определения 'нужности' бцдет подсоввать не нужные но дороже итемы, их можно накопить в сундуке или продавать сразу.
    Ответ написан
    Комментировать
  • Какие данные берет функция для генерации случайного числа?

    Rsa97
    @Rsa97
    Для правильного вопроса надо знать половину ответа
    В современных процессорах есть генератор случайных чисел (команда RdRand). Там генератор на тепловом шуме с дополнительными алгоритмами для нормализации.
    Linux в /dev/random использует накопление энтропии от процессорного ГСЧ, прерываний, системных событий, таймера. Но это накопление не особо быстрое, поэтому полученные значения обычно используют как seed для генератора псевдослучайных значений.
    Ответ написан
    1 комментарий
  • Какие данные берет функция для генерации случайного числа?

    VoidVolker
    @VoidVolker
    Dark side eye. А у нас печеньки! А у вас?
    Да, верно, самый простой способ — это использовать текущее время и далее пропустить его через какой-то алгоритм. Можно даже с использованием каких-то дополнительных значений или прошлых результатов. Обычно, конечно, используется довольно сложные алгоритмы с кучей параметров и несколькими источниками случайных чисел.

    Можно как-то спрогнозировать то, что в 00:00 у нас будет больше мелких значений, а в 23:59 больше максимальных?

    Да, зная алгоритм можно сделать такой прогноз. И такие типы атак тоже существует и используются во вредоносном ПО. Т.к. если алгоритм уязвимый, то результат его работы можно взломать за более короткое время. Случайные числа — основа современной криптографии.

    Слышал такую теорию, что случайные числа для игр (например Lineage 2 или WoW) не генерируются каждый раз, а заранее на сервере уже создан массив случайных чисел и числе берется от туда, а не генерируется в моменте.

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

    Так же существуют аппаратные генераторы случайных чисел — специальная микросхема, которая использует реальные физические явления для генерации случайных чисел. Например колебания атомов, шумы в атмосфере, электромагнитные шумы, наводки и прочее. Могу порекомендовать очень интересную лекцию "Сложность конечных последовательностей нулей и единиц и геометрия конечных функциональных пространств" Владимира Арнольда: https://elementy.ru/video/103/Slozhnost_konechnykh...
    Ответ написан
    Комментировать
  • Какие данные берет функция для генерации случайного числа?

    wataru
    @wataru Куратор тега Алгоритмы
    Разработчик на С++, экс-олимпиадник.
    Время в милиссекундах, количество тактов процессора от включения процессора, какой-нибудь шум накопленный от движения мышкой и вообще активности в системе - все это используется чтобы инициализировать генератор псевдослучайных чисел. А далее, по сложной запутанной математической формуле из одного числа получается последовательность, которую практически невозможно предсказать. Потому что брать каждый раз вермя - будет нифига не случайно, а собирать шум по всей системе долго и сложно.

    В онлайн играх сулчайность должна быть одинакова для всех игроков - если вам генератор покажет 10 единиц урона при ударе, а соседу - 20 для этого же самого удара, то в у вас монстр останется жив, а у соседа умрет, что плохо. Плюс, манипуляции со случайностью - это пространство для читов. Поэтому в онлайн играх своя специфика и там имеет смысл случайность оставлять на сервере, да.
    Ответ написан
    1 комментарий
  • Почему аргумент не видит функцию, как тип функция?

    axifive
    @axifive
    Software Engineer
    Нужно обернуть вызов функции в лямбду: repeatN(5, { printHello }) или передать функцию по ссылке repeatN(5, ::printHello)
    Ответ написан
    Комментировать
  • Почему в лямба функции нельзя называть аргументы любым названием?

    На вопрос уже ответили, val это зарезервированное слово. Но если по какой-то причине хочется, чтобы переменная называлась именно так и никак иначе, можно обернуть название в обратные апострофы:
    { `val` -> `val` > 0}) }

    Тогда компилятор примет такое название.
    Ответ написан
    Комментировать
  • Безопасны ли бесплатные ВПН сервисы?

    @Drno
    да \ нет \ смотря что Вы подразумеваете под "безопастностью"

    если вопрос конкретно по Планете - то ей вполне можно доверять.
    Ответ написан
    Комментировать
  • Безопасны ли бесплатные ВПН сервисы?

    @maksam07
    Зачем делают ВПН бесплатным
    Чтобы при помощи него рекламировать свои услуги, или всторенной рекламы зарабатывать деньги. Или продавать данные клиентов.

    можно ли доверять таким продуктам

    Зависит от пользовательского соглашения, но чаще всего - не стоит.
    Ответ написан
    6 комментариев
  • Безопасны ли бесплатные ВПН сервисы?

    Безопасность - понятие растяжимое, но твои данные как минимум точно будут продавать рекламодателям (в этом никаких сомнений быть не может. Никакой крупный сервис без рекламы не может бесплатно свои услуги предлагать. Данные платных подписчиков планеты тоже с очень большой вероятностью продают)
    Как уже сказали - твой https трафик зашифрован, так что пароли твои врядли куда-то утекут.
    Ответ написан
    Комментировать
  • Как в командной строке сохранить полный путь к файлу для вставки его в другом месте при смене директории?

    xotkot
    @xotkot
    хорошо есть и хорошо весьма
    вот простой вариант
    создаём две bash функции cp1 и cp2
    первая сохраняет полный путь к файлу
    вторая копирует файл по сохранённому пути в текущую(.) директорию
    cp1(){ echo "$PWD/$1" > /tmp/cp1;}
    cp2(){ cp "$(cat /tmp/cp1)" .;}

    чтобы каждый раз в новой сессии не прописывать можно закинуть их в конец файла .bashrc(если используете bash)
    использование банальное
    cp1 ФАЙЛ
    cd куда-то/там
    ...
    cp2

    для mv всё будет аналогично
    Ответ написан
    Комментировать
  • Как в командной строке сохранить полный путь к файлу для вставки его в другом месте при смене директории?

    @pfg21
    ex-турист
    Сохрани в /run или /tmp.
    И потом оттуда скопируй в необходимую директорию
    Ответ написан
    2 комментария
  • Как в командной строке сохранить полный путь к файлу для вставки его в другом месте при смене директории?

    SignFinder
    @SignFinder
    Wintel\Unix Engineer\DevOps
    Сохранить нужный путь в переменную и использовать ее для перехода\сохранения.
    Ответ написан
    Комментировать
  • Как в командной строке сохранить полный путь к файлу для вставки его в другом месте при смене директории?

    ipatiev
    @ipatiev
    Потомок старинного рода Ипатьевых-Колотитьевых
    Смысл проблемы непонятен.
    Даже если "путь далёк", то чтобы "сменить директорию в терминале" всё равно придётся набрать его весь. Ну так тогда можно и сразу и набрать его. В том смысле что нет разницы, набирать ли "длинный путь" в cd или в mv

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

    Ну и напомню, что при построении "длинных путей в терминале" очень помогает автодополнение по кнопке TAB
    Ответ написан
    3 комментария
  • Как в командной строке сохранить полный путь к файлу для вставки его в другом месте при смене директории?

    Vindicar
    @Vindicar
    RTFM!
    Если задача всплывает часто, освой Midnight Commander или иной двухпанельный файловый менеджер. Он запускается в терминальном режиме и прекрасно подходит для таких ситуаций.
    Ответ написан
    Комментировать
  • Почему в лямба функции нельзя называть аргументы любым названием?

    axifive
    @axifive
    Software Engineer
    val зарезервированное слово, которое не может выступать как идентификатор. (Находится в секции Hard keywords)

    The following tokens are always interpreted as keywords and cannot be used as identifiers:


    Но другие из секций Soft keywords и Modifier keywords вполне могут
    Ответ написан
    Комментировать