Реверс-инжиниринг программы ACO Avrora: исходники, как вставлять текст в аврору

Программа ACO Avrora почти полностью написана на JS. В основе лежит QT WebEngine, который предоставляет средства для отображения html страниц. Мы немного поковыряли этот улей, и вот что нам удалось найти.

Всего авроры использует вроде как 3 сервера, основные запросы отправляются по веб сокетам.
Сервера:
mirea2.aco-avrora.ru || ds-servers.com || node-9.ds-servers.com
Сама аврора грузится с mirea2.aco-avrora.ru. Там находится вроде все файл, которые требуются для работы авроры, но просто так зайти или скачать их не выйдет - ошибка доступа. В данном файле находятся исходники клиентской части авроры (там в том числе есть onCopy/onPaste ивенты)
avrora.rar (962.7 КБ)

Главный вопрос - можно ли открыть аврору в браузере, как, например, это делают преподаватели? Ответ - да. Нужно перейти на https://mirea2.aco-avrora.ru/student/, но User-Agent должен стоять такой, какой стоит в авроре в QtWebEngine. Нам подойдет такой:

Mozilla/5.0 (Windows NT 6.2; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) QtWebEngine/5.14.2 Chrome/77.0.3865.129 Safari/537.36

Взаимодействовать вам вряд ли удастся, так как аврора использует qrc:///qtwebchannel/qwebchannel.js для вызова Qt-шных функций. Быть может стоит попробовать скомпилить свою аврору? :thinking:

Кстати, можно попробовать сделать некий прокси-сервер с помощью host, либо подменять URL. Я уже это реализовать, URL авроровской index.html находится в программе по смещению 0x0000db70 в UNICODE формате. Вот, к примеру, я заставил Аврору грузить форум mirea.ninja. По-моему это хорошее DLC для данной программы.


Как же вставлять код в аврору?

Способ №1

В app.js (посмотреть этот файл можете в архиве, который выше) реализован основной механизм проверки буфера и сохранения в буфер. Если коротко, то у программы реализован в JS внутренний буфер обмена. Это простая переменная, которая хранит то, что пользователь скопировал из авроры в HTML формате. При вставке чего-либо аврора проверяет, является ли это что-то HTML текстом, и совпадает ли текст с тем, что сейчас в буфере. Если да - вставляем. Но есть у этой механики некоторые недоработки, которые нам удалось найти.

Шаги действий, как обойти систему:

  1. Копируем что-либо из исходного кода, чтобы заполнить внутренний буфер. Например, я скопирую букву r
    image
  2. Открываем текстовый редактор, пишем туда следующее:
<p class=' '>r

Буква r, которую мы скопировали, обязательно должна находиться в теле тега, чтобы проверка на соответствие внутреннего буфера и вставляемого текста прошла успешно. В классе пишем всё что угодно. В нём должно находиться то, что мы хотим вставить в аврору. Например:
image
3. Копируем это из текстового документа, вставляем в аврору. Код вставлен:
image

Способ №2

  1. Заходите в папку с Авророй, в адресной строке вводите cmd, нажимаете Enter
  2. В открывшейся коммандлайн пишете:
    start .\ARM_Student.exe --remote-debugging-port=8023
  3. Входите в Аврору.
  4. Открываете любой хромоподобный браузер
  5. Идете по адресу http://127.0.0.1:8023/
  6. Нажимаете на единственную кнопку
  7. Идёте в пункт console сверху
  8. Пишете вниз, где синяя стрелочка в консоли браузера, вот это:
DS.page.cb.canPaste = ()=>{return true;};

Это разрешает вставку обычным ctrl+v

setInterval(()=>{window.dispatchEvent(new MouseEvent(‘mousemove’, {}));},133337);

Это отключает автокик за афк

Как редактировать и открывать любые работы (даже закрытые)

  1. Открываем аврору в режиме отладки.
  2. Открываем файл module.js?6 из модуля task
    image
  3. Идём на строку 400, выносим click-листенер из проверки. Было так:

    Стало так:
  4. Нажимаем ctrl + s, чтобы сохранить. Кликаем на рандомную страницу в Авроре, чтобы изменения обновились.
  5. Теперь вы можете открывать и редактировать закрытые работы, работы на проверке и даже те работы, которые у вас уже зачтены.
18 Likes

Классные вещи делаешь, одмен!

2 Likes

А вот и готова программа для вставки: Программа для вставки в аврору. (Вставлятель от Шаблонизатора)

3 Likes

Пипец ребят, вы этот труп “Аврора” еще и изнасиловали

6 Likes

А по поводу вставки кода. Можно без посторонних программ, весь семестр юзал это (спасибо, очень сэкономило мое время и нервы; и на кол того, кто решил запретить вставку):

  • ЗАМЕНА АНТИЗУРАБУ:
  1. Заходите в папку с Авророй, в адресной строке вводите cmd, нажимаете Enter
  2. В открывшейся коммандлайн пишете
    start .\ARM_Student.exe --remote-debugging-port=8023
    

Нажимаете Enter и ждёте.
3. Входите в Аврору.
4. Открывате любой хромоподобный браузер
5. Идете по адресу http://127.0.0.1:8023/
6. Нажимаете на единственную кнопку
7. Идёте в пункт console сверху
8. пишете вниз, где синяя стрелочка вот это

DS.page.cb.canPaste = ()=>{return true;}; - разрешает вставку обычным ctrl+v

setInterval(()=>{window.dispatchEvent(new MouseEvent(‘mousemove’, {}));},133337); - отключает автокик за афк

Жмете Enter.
9. Готово

  • насчет первого пункта, просто в командной строке пишите путь к авроре

  • и эту команду

  • такой кайф

10 Likes

Гениально. Можно кстати без cmd, а просто ярлык создать. Будет открываться сразу в режиме отладки по порту 8080
image

4 Likes

Вы настоящие гении! Аплодирую стоя!)
Не сайт, а One Love :smiling_face_with_three_hearts: :heart_eyes:

6 Likes

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

1 Like

Способ придумал не я, поэтому вопрос не по адресу)
А вообще мне каж, что тут просто дыры в защите, что таким образом с клиента можно зайти и править исходники.

1 Like

Такими темпами, создатели Авроры будут закрывать все “дырки” в работе авроры из-за студентов и Аврора ВОЗМОЖНО станет нормальной программой :rofl:

3 Likes

Все дырки всё равно закрыть не смогут.

1 Like

Ну, это очевидно. Да и моё сообщение больше в шутку было)

2 Likes

Понимаю, что уже наверное поздно, но можно ещё открывать зачтённые работы, работы на проверке и закрытые работы. Не только открывать, но и редактировать их.

Способ добавлен в тему!

1 Like

Очень круто! Но можно ли как-то засчитвать работу у самого себя? Да, возможно, это не особо умнй вопрос, но интересно, если для этого обязательно требуется аккаунт преподавателя?

2 Likes

я бы не отказался самому себе засчитывать

Аккаунт преподавателя потребуется как минимум для того чтобы посмотреть какие запросы уходят на сервер. Был бы у нас доступ к акку препода, мы бы попробовали реализовать что-то типа этого

Это возможно только если они вынесут ВЕСЬ функционал на серверную сторону, что слишком затратно. А так всегда можно создать программу изменяющую память Авроры. Проще говоря чит, но не для игры.

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

1 Like

Нет. При открытии тренажёра отправляется сокет запрос с содержимым getTest, а сервер возвращает само содержание тренажёра.

{
    "success": true,
    "data": {
        "title": "Операторы С++",
        "variants": [
            {
                "text": " ----- ",
                "value": "0"
            },
            {
                "text": "break",
                "value": "25"
            },
            {
                "text": "Возврат",
                "value": "9"
            },
            {
                "text": "Вызов метода",
                "value": "5"
            },
            {
                "text": "Вызов функции",
                "value": "4"
            },
            {
                "text": "Декремент постфиксный",
                "value": "22"
            },
            {
                "text": "Декремент префиксный",
                "value": "21"
            },
            {
                "text": "Деструктор класса",
                "value": "17"
            },
            {
                "text": "Заголовок класса",
                "value": "15"
            },
            {
                "text": "Заголовок метода",
                "value": "8"
            },
            {
                "text": "Иначе",
                "value": "11"
            },
            {
                "text": "Инициализация",
                "value": "10"
            },
            {
                "text": "Инкремент постфиксный",
                "value": "24"
            },
            {
                "text": "Инкремент префиксный",
                "value": "23"
            },
            {
                "text": "Комментарий",
                "value": "20"
            },
            {
                "text": "Конструктор класса",
                "value": "18"
            },
            {
                "text": "Объявление",
                "value": "3"
            },
            {
                "text": "Объявление поля класса",
                "value": "16"
            },
            {
                "text": "Оператор цикла",
                "value": "7"
            },
            {
                "text": "Присвоение",
                "value": "1"
            },
            {
                "text": "Условный оператор",
                "value": "6"
            },
            {
                "text": "Элемент списка инициализации",
                "value": "19"
            }
        ],
        "questions": [
            {
                "text": "void CRenderableVisibility::setOcclusionCuller(IXOcclusionCuller *pOcclusionCuller)",
                "value": "190",
                "is_skipped": "false"
            },
            {
                "text": "{",
                "value": "191",
                "is_skipped": "true"
            },
            {
                "text": "\tfor(UINT i = 0; i < m_uRenderSystems; ++i)",
                "value": "192",
                "is_skipped": "false"
            },
            {
                "text": "\t{",
                "value": "193",
                "is_skipped": "true"
            },
            {
                "text": "\t\tif(m_ppVisibilities[i])",
                "value": "194",
                "is_skipped": "false"
            },
            {
                "text": "\t\t{",
                "value": "195",
                "is_skipped": "true"
            },
            {
                "text": "\t\t\tm_ppVisibilities[i]->setOcclusionCuller(pOcclusionCuller);",
                "value": "196",
                "is_skipped": "false"
            },
            {
                "text": "\t\t}",
                "value": "197",
                "is_skipped": "true"
            },
            {
                "text": "\t}",
                "value": "198",
                "is_skipped": "true"
            },
            {
                "text": "}",
                "value": "199",
                "is_skipped": "true"
            }
        ]
    },
    "arm_task_id": 22,
    "_type": "rsp"
}

О, нифига себе до куда дополз мой способ. Если что, “способ от zxc” - перепечатка моей изначально секретной рассылки для своих в вк

Ничего они закрывать не будут. После скандала 2 года назад я ходил к зурабу с ребятами и мы при комиссии на глазах у всех ее ломали, показывали дыры и все вот это вот. До сих пор ничего не залатано

3 Likes