предисловие
В последнее время очень популярно приложение ответы на вопросы.Что за встреча на высшем уровне,миллионы героев,десятки миллионов бонусов на каждом шагу,это реально вызывает у людей зависть...А то эта слабая курица невежественна....Тема это все о Монголии, поэтому я не буду участвовать в веселье. Через несколько дней появилась небольшая программа, которая стала популярной в офисе, и именно в этот раз мне понадобилось использовать ее для операции.《头脑王者》
, на самом деле это еще и маленькая программа для ответов на вопросы, так что я пока в ней не силен. Хоть я и не умею отвечать на вопросы, но я все равно программист, поэтому я встал на путь к вершине программиста...
достижение
В каждом раунде игры необходимо ответить на 5 вопросов, за все правильные и быстрые ответы можно получить полный балл, полный балл составляет 1200 баллов. С таким послужным списком стать номером один в мире — это не мечта! Конечно, игры для удовольствия, а эта слабенькая курица просто из интереса, в такую ответную игру интереснее играть в одиночку.
Готов к работе
Несколько вопросов, над которыми нужно подумать, прежде чем начать писать помощь для такого рода игр.
- Как подделывать интерфейсные запросы?
- Как добиться точных ответов?
- Как заполнить автоответчик?
Как подделывать интерфейсные запросы?
Во-первых, все интерфейсные запросы апплета основаны на HTTPS. Конкретный способ захвата HTTPS — использование Anyproxy для его захвата.Необходимо установить соответствующий сертификат HTTPS. Это также было упомянуто в предыдущей статье, поэтому я повторю это здесь. Любой прокси-сервер, используемый в этой статье, аналогичен использованию других прокси-инструментов.
1. 安装node.js
2. npm i -g anyproxy
3. anyproxy-ca // 生成证书
4. anyproxy -i // 以代理https的方式启动
// 然后手机端配置代理的IP及PORT,默认端口为8001,
// Anyproxy的WebService的默认端口为8002,这里可以查看到接口
// 手机端配置代理以后需要下载证书并信任,
// 苹果端的可以在手机的Safiri里面输入xxx.xxx.xxx.xxx:8002/fetchCrtFile的方式下载到证书
// 高版本的iOS可能需要在两处地方信任。
После настройки откройте игру, чтобы получить пакет запроса, соответствующий королю разума. Я сначала смоделировал френд-баттл, а потом нужно было проанализировать, какие пакеты нужны. Здесь я сразу вставлю некоторые важные интерфейсы.
- интерфейс входа в систему (интерфейс входа в систему, важная информация здесь — uid и токен)
- intoRoom interface (интерфейс для входа в комнату)
- Интерфейс beginFight (интерфейс начала боя)
- Интерфейс findQuiz (интерфейс поиска вопросов)
- выбрать интерфейс (интерфейс ответа)
- Интерфейс getResults (интерфейс для получения результатов игры)
- Интерфейс leaveRoom (интерфейс выхода из комнаты)
Давайте сначала посмотрим на интерфейс.Это очень плавный игровой процесс, но могу ли я начать делать все, что захочу, с этими интерфейсами? Очевидно, что это невозможно.Если каждый имеет право произвольно использовать чужие интерфейсы, разве они не смогут легко проводить DDoS-атаки или легко получать нужную им информацию? Для опытной компании совершить такую ошибку заведомо невозможно, поэтому для небольшого анализа я возьму случайный интерфейс.
На приведенном выше рисунке показан интерфейс сопоставления ранжирования лестницы. Из тела видно, что серверу необходимо передать пять параметров: matchId, npcId, uid, t и знак. Все эти пять параметров являются обязательными. Если только один параметр неправильно, то запрос не может быть выполнен.Первые четыре на самом деле легко понять.Ключ-это пятый признак параметра подписи.Откуда он взялся?
Здесь нам нужно использовать реверс-инжиниринг... Простое описание такое... Получите сжатый исходный код Mind King в апплете, и проанализируйте правила шифрования в нем.Место ограничено, поэтому я опишу непосредственно правила шифрования здесь.
Правило генерации знака:Body内所有的参数(除去sign)+ token(login接口获取)并按照key值排序以后对齐进行MD5加密
,
Например, uid=111, t=222, token=333, тогда подстрока перед шифрованием должна быть t=222token=333uid=111
Поскольку SIGN есть, это очень просто, то я напишу простой клиент с Node, чтобы сделать простой клиент, чтобы сделать запрос интерфейса.
Как добиться точных ответов?
В настоящее время также есть много помощников встречи на высшем уровне и миллионы героев.Их идея состоит в том, чтобы быстро определить вопросы при ответе на вопросы и провести быстрый поиск вопросов, чтобы помочь в ответах на вопросы, но для этой игры, если вы хотите добиться точного ответы, лучшие Решение состоит в том, чтобы соответствовать банку вопросов, поэтому вопрос в том, откуда берется банк вопросов? Конечно, краулером сканируется, ОК... Давайте найдем интерфейс банка вопросов! Очевидно, что это невозможно! Если интерфейс банка вопросов открыт для внешнего мира, эту игру слишком легко сломать. Но из предыдущего шага мы фактически реализовали симуляцию открытия комнаты, так можно ли получить банк вопросов, открывая комнату и постоянно сражаясь? Так вот что я использую здесь.
Успех — это вопрос, на который скрипт автоматически отвечает правильно (всего 5 вопросов), а общее количество — это общее количество банков вопросов. Из этой шкалы видно, что правильный показатель уже чрезвычайно высок, что указывает на то, что количество банков вопросов следует оценивать только в пределах около 17 000, но поскольку оставшиеся банки вопросов все еще дополняются и последние 10 % потребует большей стоимости для покрытия.Теперь, по сути, банка вопросов достаточно для этого шага.Вероятность 80%+ полных оценок... почти не имеет себе равных, верно?
Как добиться автоматического ответа?
Есть два варианта автоматического ответа:
- Как и в игре с прыжками, сделайте снимок экрана => OCR, чтобы прочитать вопрос => сопоставьте банк вопросов => смоделируйте щелчок по ответу
- Anyproxy proxy, напишите запрос на изменение файла правила, зафиксируйте интерфейс запроса findQuiz, сервер повторно инициирует запрос и ждет возврата данных => определите, существует ли возвращенный вопрос в базе данных => сопоставьте ответ с ответом напрямую или вернуть вопрос
Эта слабенькая курица использует здесь вторую схему (конкретная реализация повторяться не буду, можно прямо посмотреть исходный код)
Суммировать
Я не очень хорошо пишу статьи. Многие из вышеперечисленных шагов были кратко освещены. Я просто кратко описываю процесс здесь. Затем я открою исходный код этой части кода. Я не могу использовать babel, когда я указываю правило , поэтому я использовал require вместо import). Наконец, я надеюсь, что каждый может оказать мне некоторую поддержку и подтверждение, и дать мне несколько звезд...>.
Адрес проектаGitHub:помощник короля разума