Привет, мир!

Это третий выпуск журнала «Хиккинги».

Сегодня в номере:



Hidden Internet

Всё, с чем знаком компьютерный обыватель, — верхушка айсберга Всемирной сети. Социальные сети, новостные сайты, блогоплатформы, чаты, форумы, обычные сайты — мало того, что это только веб-часть интернета (т.е., по большому счёту, один из сотен сетевых протоколов передачи данных), так ещё и к большинству контента человека “приводят”, словно осликов, поисковые системы, манипулирующие результатами по совершенно определённым алгоритмам, не говоря ещё о коммерческой составляющей сортировки результатов поисковых запросов.

Бурное развитие Интернета привело к появлению такого явления как нетсталкинг. Люди, ведомые любопытством и исследовательским интересом, выискивают в Сети контент, который “обычными” методами не найти (сканирование широких диапазонов IP-адресов, использование редких сетевых протоколов и т.п.). Считается, что рассвет нетсталкинга связан с именем Джона Рафмана, художника из Канады, который проводил по 8-12 часов в день в поиске невероятных снимков Google Street View; самые интересные находки Рафман включил в свой проект «Девять глаз Google Street View», ставший впоследствии мультимедийной выставкой.

С точки зрения нетсталкинга, Интернет можно разделить на условные сегменты:

  • индексируемый поисковыми системами, видимый Surface web — обычный, знакомый всем, открытый веб
  • неиндексируемый поисковыми системами Deep web — веб-ресурсы, не связанные с другими ресурсами гиперссылками; ресурсы с ограниченным доступом (закрытые, платные); “контекстный веб” (ресурсы с динамическим содержимым, зависящем от контекста доступа: IP, профиль пользователя) и т.п.
  • скрытый, требующий наличия программного обеспечения для доступа внутрь Dark net — сюда можно отнести различные оверлейные сети (Tor, I2P, ZeroNet и т.п.), скрытые сети правительственного или военного назначения, интернет-ресурсы с доступом по нестандартным протоколам)

Оверлейные сети даркнета создавались криптоанархистами, но сейчас он стал, по большей части, прибежищем криминальных элементов (торговля оружием, наркотиками, порнографией, документами, перепиской политиков и т.п.) и шизофреников (тут и “карты интернета”; “тихий дом”; эзотерические, нумерологические секты).

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

Bon voyage!

Tor

Tor — ПО для анонимного (теоретически) обмена информацией, реализующее так называемую “луковую маршрутизацию” (выбирается случайный маршрут через другие узлы сети, передаваемые данные многократно шифруются, каждый пункт передачи удаляет слой шифрования, чтобы открыть адрес следующего пункта, где все повторяется; таким образом, промежуточные узлы не знают источник, пункт назначения и содержание сообщения). Всё, что нужно для начала работы с Tor, — установить Tor Browser, представляющий собой комплект из сборки Mozilla Firefox с блокировщиками активного содержимого на страницах (в целях защиты от нарушения анонимности) и локального прокси-сервера.

Откуда начать (адреса в сети Tor):

ZeroNet

ZeroNet — основанная на протоколе BitTorrent распределённая одноранговая неанонимная сеть. Сеть популярна среди пользователей из Китая, так как позволяет обойти системы фильтрации интернет-контента в КНР. Установить тоже можно под множество систем. Преставляет собой сервер на python с веб-мордой, через которую можно взаимодействовать с ресурсами сети. Конечно, по сравнению с Tor, контента и участников сети в разы меньше.

Откуда начать (адреса в сети ZeroNet):

I2P

I2P — анонимная (теоретически) одноранговая распределённая (модифицированный DHT Kademlia) P2P-сеть. При передаче данных между узлами сети применяется шифрование, а также смена посредников на маршруте передачи для усложнения деанонимизации, MITM-атак. Сеть использует “чесночную маршрутизацию”; по аналогии с “луковой маршрутизацией” сообщения представляют собой зашифрованные несколько слоёв сформированных сообщений с инструкциями для их доставки, но дополнительно в передаваемые “чесноки” входят не только зашифрованные сообщения нашего узла, но и чужие — транзитными. Представляет собой сервер на Java. Для начала работы с сетью, нужно скачать программу-“роутер”, внести необходимые настройки, а также прописать 127.0.0.1:4444 и 127.0.0.1:4445 в качестве HTTP/HTTPS-прокси соответственно. Рекомендуется также добавить подписки адресной книги для того, чтобы упростить поиск и сёрфинг I2P-сайтов, после чего подождать некоторое время:

http://identiguy.i2p/hosts.txt
http://no.i2p/export/alive-hosts.txt
http://stats.i2p/cgi-bin/newhosts.txt

Сеть не очень быстрая, и вначале, особенно если вы за NAT, нужно подождать некоторое время (~10-30 минут), пока хосты (или jump-сервисы — что-то вроде местной DNS) начнут резольвиться.

3,5 анона — (читается три с половиной анона) — стандартное число посетителей любого сайта в I2P.

Откуда начать (адреса в сети i2p):

FreeNet

FreeNet — анонимная одноранговая распределённая P2P-сеть. Freenet работает на основе объединения в общий фонд (пулинга) предоставленной пользователями (членами сети) полосы пропускания и дискового пространства своих компьютеров для публикации или получения из Freenet разного рода информации. Сохранённая информация шифруется и распространяется по всем компьютерам, участвующим в сети во всём мире; они анонимны, существуют в большом количестве и постоянно обмениваются информацией. Теоретически весьма сложно определить, какой участник хранит данный файл, так как содержимое каждого файла зашифровано и может быть разбито на части, которые распределяются между множеством различных компьютеров. Freenet использует разновидность маршрутизации по ключам, похожую на распределённую хеш-таблицу, для определения местонахождения пользовательских данных.

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

Клиентское ПО поддерживается также для множества платформ.

Откуда начать (адреса в сети FreeNet):

Osiris

Osiris — распределённая (на базе Kademlia) сеть, предназначенная для создания и распространения веб-порталов, с клиентами под Windows/Linux/MacOS. Среди фич, приводимых самими разработчиками: децентрализованность (не требует наличие централизованных серверов), анонимность (между создателями контента и его распространителями-посредниками сеть не делает различий), экономичность (чтобы портал работал, достаточно, чтобы у него были пользователи, — они и будут его распространять по сети). Порталы можно найти по “подпискам” (“subscriptions”), а также получив invite link или .osiris-файл.

Откуда начать:

RetroShare

RetroShare — свободное кроссплатформенное программное обеспечение для бессерверного обмена письмами, мгновенными сообщениями и файлами с помощью шифрованной F2F-/P2P-сети. IP-адреса участников криптосети недоступны друг другу, за исключением ограниченного круга участников. Для передачи данных используется собственный протокол передачи, где элементом адресации пакета является не IP-адрес, а 128-битное случайное число — анонимный идентификатор. Узлы-посредники не могут определить как источник отправления и пункт назначения, так и осуществить мониторинг содержимого проходящих через них пакетов в силу того, что все пакеты подвергаются сильному шифрованию.

The web site ‘PRISM Break’ has recommended RetroShare for anonymous file sharing since 2013.

Откуда начать:

Стоит упомянуть

  • японские P2P-сети Winny, Share — на данный момент уже не работают (из-за проблем с правообладателями распространяемого по сети медиаконтента авторы арестованы, сайты заблокированы)
  • GNUnet — фреймворк для построения децентрализованных анонимных P2P-сетей с шифрованием
  • файлообменные сети
  • dn42
  • OneSwarm

↑ к оглавлению


Интернет-цензура

v Вот когда станут обращать внимание на айти, тогда и поговорим
v Вот когда будут сажать за пиратство, тогда и поговорим
v Вот когда начнут блокировать сайты, тогда и поговорим
v Вот когда начнут прикрывать это защитой детей, тогда и поговорим
v Вот когда начнут делать это массово, тогда и поговорим
v Вот когда обяжут хранить все данные о гражданах РФ на территории России, тогда и поговорим
v Вот когда обяжут мессенджеры выдавать переписку, тогда и поговорим
v Вот когда запретят анонимность в интернете, тогда и поговорим
v Вот когда запретят шифрование в интернете, тогда и поговорим
v Вот когда введут белые списки, тогда и поговорим
[Вы находитесь здесь]
Вот когда заблокируют заграничный интернет, тогда и поговорим
Вот когда национализируют все айти-компании, тогда и поговорим
Вот когда введут интернет по талонам, тогда и поговорим

Итак, что могу предложить, господа…

Blockcheck

Blockcheck — утилита для определения типа блокировок сайтов из единого реестра запрещенной информации на стороне провайдеров Российской Федерации.

Как это заюзать:

1) собрать openssl:

wget https://www.openssl.org/source/openssl-1.1.0e.tar.gz
tar zxvf openssl-1.1.0e.tar.gz
cd openssl-1.1.0e/
./config && make && make test && make install
ldconfig

2) поставить zlib1g-dev:

apt-get install zlib1g-dev

3) поставить python, работающий c openssl из исходников:

wget https://www.python.org/ftp/python/3.6.0/Python-3.6.0.tgz
tar zxvf Python-3.6.0.tgz
cd Python-3.6.0/
mcedit Modules/Setup.dist
// uncomment socket module
// uncomment SSL path (set to /usr/local)
// _ssl ssl.c ..........
./configure && make && sudo make install

If you are building Python from source, beware that the OpenSSL 1.1.0c release, the most recent as of this update, is known to cause Python 3.6 test suite failures and its use should be avoided without additional patches. It is expected that the next release of the OpenSSL 1.1.0 series will fix these problems. See http://bugs.python.org/issue28689 for more information. https://www.python.org/downloads/release/python-360/

4) поставить git и запустить утилиту:

sudo apt-get install git
git clone https://github.com/ValdikSS/blockcheck.git
cd blockcheck
sudo python3 -m pip install -r requirements.txt
python3 blockcheck.py

А можно ничего этого не делать, а заюзать готовый докерфайл. (Если у вас нет докера (Docker), установите)

DNSCrypt

DNSCrypt — это утилита для шифрования DNS-трафика между вашей машиной и сервером. Таким образом, никто не сможет прослушать (и тем более фильтровать) DNS-трафик.

Чтобы не бугуртить на периодически отваливающиеся публичные DNSCrypt-сервера, рекомендую поднять свой. Самый простой вариант — использовать готовый docker-образ.

Установка клиента:

sudo apt-get install dnscrypt-proxy

Учтите, что если вы используете DigitalOcean, то столкнётесь с небольшой проблемкой, связанной с блокировкой исходящего 443 порта. Для обхода этого нужно использовать DNSCrypt-сервер, работающий на другом порту (например, 5353).

Пример (/etc/default/dnscrypt-proxy):

DNSCRYPT_PROXY_RESOLVER_NAME=dnscrypt.eu-nl
DNSCRYPT_PROXY_OPTIONS="--tcp-only --ephemeral-keys"

Демонизация на линуксе:

systemctl enable dnscrypt-proxy
systemctl start dnscrypt-proxy

Демонизация на винде:

dnscrypt-proxy.exe --install-with-config-file=dnscrypt-proxy.conf

Подробнее: в мануалах.

P.S. столкнулся с проблемой DNS-резольвинга Tor Browser. Помогло отключение IPv6:

could you try setting network.dns.disableIPv6 to true and see if it helps. That may be bug 414197.

3APA3A proxy

Старый добрый 3APA3A прокси.

Маленький, быстрый, простой для установки веб- и socks4/5-прокси-сервер:

VPN

Сейчас повсеместно использовать VPN для шифрования трафика (обходы блокировок, защита конфиденциальности передачи данных) просто необходимо.

Для быстрого поднятия собственных VPN-серверов рекомендую использовать набор скриптов vpn-install, позволяющих быстро и удобно поднять и минимально сконфигурировать различные типы VPN-серверов на Linux-машинах.

Для того, чтобы поднять и использовать собственную VPN, нужно сделать следующее:

  • заказать где-нибудь (виртуальный) сервер — например, облачный дроплет в DigitalOcean (рефка)
  • git clone --depth=1 https://github.com/bedefaced/vpn-install.git
  • vpn-install/pptp/install.sh или vpn-install/openvpn/install.sh или vpn-install/ipsec/install.sh в зависимости от ресурсов сервера, уровня паранойи, удобства: PPTP — легко настроить на любой системе, в т.ч. мобильной; OpenVPN — более секьюрный и кастомизируемый вариант, но требует дополнительное клиентское ПО; IPsec — оптимальный по безопасности и удобству (поддерживается последними версиями винды, андроида) вариант.
  • скачать сгенерированные установщиком конфиг-файлы (если требуются) и настроить клиент: для убунтоводов генерируется клиентский скрипт для автоматической установки VPN-клиентов, а для виндузных есть миллион инструкций по настройке.

↑ к оглавлению


Wi-Fi эксперименты

Взлом Wi-Fi

В зависимости от настроек защиты домашних wi-fi-точек доступа существуют 3 основных вектора атак на проникновение:

  • взлом WEP-сетей
  • взлом WPA/WPA2-сетей
  • взлом WPS (по пинкоду)

Если не сосредотачиваться на архитектурных различиях, суть атак на первые 2 технологии защиты в перехвате пакетов и в подборе ключа шифрования: в случае с WEP-шифрованием это выполняется на порядки быстрее (3/6/15 байт на ключ), в случае WPA/WPA2-шифрования это требует и большего количества пакетов, и потребуется больше времени на брутфорс хеша ключа (8-63 байта). В случае включённого режима WPS-авторизации по пинкоду на точке доступа достаточно произвести не более 11000 запросов (правда, тут могут помешать дополнительные ограничения по таймауту, если такие включены на точке доступа). Такое небольшое количество запросов связано с уязвимостью в самом протоколе.

Prerequisites:

  • wi-fi адаптер с поддержкой режима мониторинга (promiscuous mode) — в таком состоянии сетевой адаптер будет обнаруживать все пакеты, независимо от того, кому они предназначались
  • Kali Linux — Debian-based LiveCD образ с набором утилит “для проведения тестов на безопасность”

Как узнать, поддерживает ли wi-fi адаптер режим мониторинга? Можно прочитать инструкцию airmon, попробовать поискать чипсет среди madwifi-compatible адаптеров, использовать утилиту iw.

Подробные инструкции по перехвату пакетов и взлому WEP-сетей, WPA/WPA2-сетей (в т.ч. используя предрассчитанные хеши), WPS-авторизации можно прочитать в интернете, я лишь приведу небольшую шпаргалку:

  • iwlist wlan1 scanning — вывод информации по обнаруженным wi-fi сетям
  • airmon-ng start wlan1 / airmon-ng stop wlan1mon — включение/выключение мониторинга
  • airodump-ng wlan1mon –-bssid BSSID –-channel CHANNEL -–write handshake — запуск перехватов хендшейков к точке доступа с MAC-адресом BSSID по каналу CHANNEL и запись в файл с именем handshake*
  • aireplay-ng -0 10 –a BSSID –c CLIENT wlan1mon — отправка 10 деаутентификаций от имени клиента с MAC-адресом CLIENT (с целью выполнения им аутентификации — чтобы перехватить его хендшейки)
  • reaver -i wlan1mon -b BSSID — инициализация перебора PIN при включённом WPS на точке доступа MAC-адресом BSSID
  • reaver -i wlan1mon -b BSSID -K 1 — выполнение атаки Pixie Dust на уязвимую точку доступа с MAC-адресом BSSID
  • aireplay-ng -1 0 -a BSSID -e CLIENT wlan1mon — ARP Request Replay от имени клиента с MAC-адресом CLIENT

Вишенка на тортике: в Kali Linux входит скрипт wifite, автоматизирующий вышеуказанные атаки. Всё, что нужно для взлома с помощью wifite — wifite и запастись терпением, остальное сделает скрипт.

Ну, и конечно же, основную роль при перехвате и отправке фейковых пакетов играет величина и соотношение мощностей сигналов между взломщиком, авторизованным пользователем и точкой доступа.

Простой captive portal

В рамках этого эксперимента хотелось поднять на обычной Linux машине (в моём случае — Ubuntu) wi-fi точку доступа с простым captive portal без авторизации.

Поднять точку доступа можно стандартными средствами Network-Manager или с помощью dnsmasq и hostapd (note: не забудьте отключить network-manager перед запуском hostapd).

Captive portal — это сервис, куда при подключении к открытой точке доступа маршрутизатор переадресует неавторизованных пользователей. Сейчас это работает повсеместно: при подключениях к wi-fi в кафе, общественном транспорте и т.п. Обычно используется для взимания платы, аутентификации абонента либо показа рекламы.

Естественно, реализаций captive portal, в т.ч. открытых, достаточно много, которые при этом настраиваются через web-gui, часто выполнены в виде образов систем для разворачивания интернет-шлюза на компьютере или на embedded-системах, вроде OpenWRT.

Впрочем, не так сложно реализовать captive portal своими руками. Принцип работы довольно простой:

  • файрволл конфигурируется для блокировки FORWARD-трафика (возможно, кроме определённых служебных протоколов)
  • перехват файрволлом запроса на 80 порт (т.е. когда подключившийся пользователь заходит на сайт через браузер, или же система обращается к веб-ресурсу с целью проверить состояние онлайн/оффлай)
  • переадресация запроса на ip:port адрес captive portal средствами файрволла (подмена destination ip:port)
  • после авторизации, ожидания или выполнения каких-то других действий пользователем на веб-сайте captive portal, в список правил файрволла добавляются правила, разрешающие обслуживание (форвардинг) трафика пользователя по его IP/MAC-адресу
  • с определённой периодичностью эти правила очищаются, статус авторизации сбрасывается

Мне хотелось поднять captive portal на своём компьютере с Ubuntu, причём открытый, без авторизации, т.е. отобразить пользователю captive portal, показать на какое-то время или дождаться нажатия на кнопочку Continue и открыть доступ в интернет. Удивительно, но captive portal такого типа разыскать было не так легко. Параллельно с самым, наверное, известным captive portal Wifidog (он с авторизацией на отдельном сервере) долгое время был проект NoCatSplash как раз для таких целей, однако, видимо, его перестали поддерживать, и ссылки на “официальные” сайты уже приводят в никуда. Но-таки нашёлся нужный captive portal с “неожиданным” названием: nodogsplash, который и написан, и работает, на мой взгляд, хорошо, причём и на OpenWRT, и на Debian-based системах.

Ниже привожу шаги для сборки и запуска nodogspash на Ubuntu 16.04:

  • git clone https://github.com/nodogsplash/nodogsplash
  • установить prerequisites для сборки libmicrohttpd нужной версии (в Ubuntu-репозитории версия ниже, не подходит): apt-get install debhelper dpkg-dev dh-systemd libmicrohttpd-dev build-essential debhelper devscripts hardening-includes
  • libmicrohttpd будем собирать из Debian 9 (stretch) репозитория из исходников, поэтому:
echo "deb-src http://deb.debian.org/debian stretch main">> /etc/apt/sources.list
apt-get install apt-src debian-archive-keyring
apt-get update
  • собираем из исходников и создаём deb-пакет:
apt-src -bi install zzuf
apt-src -bi install libmicrohttpd12
dpkg-buildpackage -b -rfakeroot -us -uc
  • устанавливаем: dpkg -i ../nodogsplash_2.0.0-1_amd64.deb
  • в конфиге /etc/nodogsplash/nodogsplash.conf вносим необходимые изменения: wi-fi интерфейс, который будет обслуживать nodogsplash, различные настройки (можно просто закомментить всё лишнее)
  • убедиться, что sysctl может форвардить: sysctl net.ipv4.ip_forward
  • возможно, может понадобиться рестартануть сеть (service network-manager restart)
  • ???
  • service nodogsplash start

↑ к оглавлению


Telegram и WhatsApp

Зародилась как-то идея получения инфы по номеру телефона из сервисов, привязанных к телефону, вроде Telegram или WhatsApp (например, в качестве дополнительной функциональности Truecaller).

Также интересовала тема вычисления (деанона) номера телефона по логину (или наоборот) в Telegram. (Не только меня эта идея преследовала.) Впрочем, с этим у меня не срослось. Для получения информации о номере телефона, нужно добавить его в контакт-лист. Но Telegram достаточно сильно ограничивает размер контакт-листа: по моему опыту там ограничения порядка 300-500 контактов, когда-либо добавленных (т.е. добавление контактов, а потом очищение контакт-листа не помогает). Потом включаются временные ограничения на добавление новых контактов (т.е. добавить ещё можно, но, например, спустя пару недель, и не больше сотни). Для обычного “легального” использования этого вполне достаточно, но для сбора базы это создаёт препятствия.

Тем не менее, у кого-то, судя по всему, хватило терпения собрать базу. Не так давно в Telegram всплывал бот (сейчас уже удалён, заблокирован; последнее, что было в информации о нём — контактная информация для предложений о сотрудничестве — @iamgustav), который выдавал инфу (телефон) по логину. Причём в качестве средства оплаты можно было использовать собственный контакт-лист: отправляешь боту контакты из своего контакт-листа (номера телефонов), получаешь за это возможность “пробить” столько же номеров/логинов. Контакты, разумеется, нужны для пополнения базы телефонов. Впрочем, лично мне не удалось пробить кого-то, видимо, база далеко не полная.

В общем, решил поэкспериментировать с документированным Telegram API и недокументированным WhatsApp API.

Telegram

В настоящее время запросы в гугле вроде “telegram api” приводят на примеры/библиотеки для написания Telegram-ботов. Мне же нужно было копнуть немного глубже — поковыряться в самом Telegram API (но не погружаясь в коммуникационный протокол MTProto). Нашлась Java-либа (https://github.com/rubenlagus/TelegramApi), которая, как я понимаю, используется в некоторых Android-клиентах (раньше была эта: https://github.com/ex3ndr/telegram-api). Правда, ничего не документировано, и примеров почти нет — приходится действовать интуитивно. Совсем недавно только ожил репозиторий исходников официального Android-клиента.

Что нужно для работы с Telegram API:

  1. Авторизоваться на https://my.telegram.org/auth и получить api_id, api_hash и IP для обращений к серверу в “API development tools”.
  2. Выбрать подходящий язык и либу в поиске на GitHub по запросам “telegram client” или “telegram library”.
  3. Открыть официальную документацию.
  4. ???
  5. PROFIT!

Несколько ссылок:

Интересный факт: в Telegram API уже несколько лет предусмотрены геочаты (geochat) — публичные чаты, куда пользователи, вероятно, попадали бы в соответствии со своим геоположением (https://core.telegram.org/api/geochats). Но, видимо, в телеграме пока на это забили.

Некий PoC идеи по получении инфы по номеру телефона нашёлся тут — в виде спрингового веб-сервиса.

Алгоритм получения инфы (разумеется, после регистрации и авторизации по номеру телефона) примерно следующий:

  1. добавить (TLRequestContactsImportContacts) номер телефона в контакт-лист;
  2. получить access_hash контакта (TLRequestUsersGetFullUser);
  3. удалить контакт (TLRequestContactsDeleteContact);
  4. используя access_hash, получить (TLRequestUsersGetFullUser) всю инфу удалённого контакта, включая аватарку (TLRequestUploadGetFile).

В принципе, получение информации (логин, авку) о контакте возможно и после первого шага, однако, в этом случае нет возможности узнать указанные самим пользователем имя и фамилию, поскольку эти поля заполняются параметрами запроса при добавлении контакта в контакт-лист (на этом, первом шаге). А вот уже после удаления контакт из контакт-листа, можно, пользуясь access_hash, узнать всё о нём.

WhatsApp

WhatsApp не предоставляет публичного API. То есть он есть (даже не один: помимо API, к которому обращаются телефончики, есть ещё Web API), но он не документирован, а обнаруженные попытки его использования пресекаются банами. В связи с этим такого большого разнообразия библиотек и клиентов, как в случае Telegram, тут нет. Всё, что есть в интернете, — кое-как работающее, ломающееся после большинства обновлений официальных клиентов, приводящее к вечным блокировкам номеров (в процессе экспериментов забанил номеров 5), созданное в результате реверс-инжиниринга официальных мобильных клиентов.

Отсутствие официального API (ну, и исходников клиента) разработчики объясняют борьбой со спамом. Не знаю, удаётся ли им это (несмотря на то, что на гитхабе есть PoC отправки сообщений через WhatsApp приложение на рутованном девайсе), но палки в колёса разработчикам вставили.

Немного ссылок:

  • https://github.com/tgalal/yowsup — python-клиент, единственная рабочая сейчас либа для работы с WhatsApp;
  • https://github.com/mgp25/Chat-API и https://github.com/mgp25/Chat-API-NET — PHP- и C#-библиотеки, ныне уже не поддерживаемые разработчиком (по его утверждению, из-за нежелания потакать разработке приложений для спама);
  • https://github.com/venomous0x/WhatsAPI/ — основа, источник вдохновения вышеуказанных либ, ныне репозиторий удалён из-за жалоб и преследований WhatsApp, но можно поискать что-нибудь рабочее среди форков (лично мне не удалось).
  • довольно интересный граббер инфы о номерах в виде Chrome-расширения, который работает через упомянутый выше Web API (однако, сначала требуется выполнить стандартную процедуру авторизации в WhatsApp через сканирование QR-кода).

Некий PoC идеи по получении инфы (время последнего подключения пользователя, авка, статус) по номеру телефона нашёлся тут — в виде ASP.NET веб-сервиса. Судя по всему, разработчик взял за основу проект mgp25/Chat-API-NET и внёс исправления для работы с современной версией WhatsApp протокола.

Немного о работе с WhatsApp. Протокол бинарный, некая переделка XMPP-протокола. При регистрации/авторизации нужно передавать токен, основанный на хардкоженных хешах классов, которые выдирают из официальных клиентов, что постоянно приводит к возникновению десятков соответствующих тредов на гитхабе. Для выполнения процесса авторизации также требуется токен, который выдаёт сервер в процессе предыдущей авторизации.

Что примечательно, в случае самой первой авторизации (т.е. прямо после регистрации) этому токену взяться неоткуда, поэтому его и передавать не нужно. Да, всё действительно обстоит так: после выполнения регистрации (т.е. отправки кода, полученного на телефон — смской ли, звонком ли) авторизоваться без какого-либо пароля может вообще любой, кто знает телефон (точнее: у кого такой же идентификатор клиента, но, например, у пользователей вышеуказанных либ идентификатор клиента будет один и тот же). Аккаунт полностью контролирует тот, кто контролирует телефонный номер.

Кстати, информацию о последнем заходе в WhatsApp (last seen timestamp) пользователя, WhatsApp отдаёт независимо от настроек приватности (и через обычный API, и через Web API).

P.S. от чистого сердца (в смысле что за рекламу никто мне не платит) рекомендую для экспериментов (для регистрации, приёма смсок — в общем, где требуется активация по номеру телефона) использовать сервис SMS-REG.com, годнота.

↑ к оглавлению


Android geoservice 2

Убив целый день на дрочево с эмуляторами, наконец, узнал, что Google Play Services Location API на эмуляторах не отладить. И вообще, с фейковым изменением координат там проблемы. Теоретически, фиксить координаты можно, подключившись к Android Emulator Console (прям telnet’ом к порту 5554) и отправляя команды вида geo fix <longitude> <latitude>. Для этого есть даже графическая утилита (веб-приложение), в которой на карте выбираешь мышкой местоположение, и в консоль эмулятора автоматически отправляется geo fix команда. Впрочем, и она у меня не заработала: отправляемые на эмулятор команды не приводили ни к какому эффекту.

Ещё один путь для фейкового изменения координат есть в самом эмуляторе. Среди менюшек, с которыми запускается эмулятор, есть вкладка Location, где можно задать координаты вручную, и, кроме того, имитировать перемещения. Для этого нужно подать на вход специальный GPX/KML-файл. Нагуглил вот такой вот сервис: ему на вход подаётся ссылка с Google Maps с начальной и конечной точкой маршрута, а он на выходе отдаёт как раз GPX-файл с промежуточными точками маршрута. Неплохо.

В общем, было решено научиться эмулировать координаты и перемещения на реальном девайсе, тем более что такая функциональность, вроде как, есть из коробки (в меню разработчика есть пункт “Разрешить фиктивные координаты”). Очень хорошее руководство было быстро найдено. (Разве что при создании объекта Location не хватает установки точности методом setAccuracy и времени — setElapsedRealtimeNanos( SystemClock.elapsedRealtimeNanos() ).)

Однако, это подходит только для старых API. Я у себя использую современный FusedLocationApi из Google Play Services. В нём работа с фиктивными координатами осуществляется примерно следующим образом:

LocationServices.FusedLocationApi.setMockMode(googleApiClient, true);
/* ... создание нужного Location ... */
LocationServices.FusedLocationApi.setMockLocation(googleApiClient, mockLocation);

↑ к оглавлению


Дайджест интересностей

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

«Гигантские кости, находимые иногда в земле, в античности считали останками героев эпохи Троянской войны, в Средние века и вплоть до XIX в. — останками исполинов, о которых упоминается в Библии и которые погибли во время всемирного потопа; на Дальнем Востоке их считали костями драконов и приписывали им целебные свойства.»

↑ к оглавлению


Хаос

Человеческий мозг стремится всё упрощать. Так нужно для облегчения познания мира, сохранения энергии. За любым, самым простым, с бытовой точки зрения, явлением скрываются сверхсложные системы и процессы. Но на уровень сознания эту информацию мозг “не поднимает” — сознание очень ограничено. Можно сравнить это с ограниченностью оперативной памяти компьютера, но и это опять же, крайне сильное упрощение. Как не сойти с ума, постоянно сознательно удерживая мысли, например, о том, что всё, что каждый из нас видит, слышит, осязает и т.п. — лишь небольшая, частичная проекция мира, создаваемая в мозге, обусловленная эволюцией.

Мы видим не просто предметы, других людей, землю, небо — мы видим отражённое электромагнитное излучение, в диапазоне длин волн 400—750 нм, которое, проходя через сложную оптическую систему, приводит в возбуждение отростки на сетчатке глаза (которые и реагируют на определённые длины волн), которые преобразуют это возбуждение в нервные импульсы, которые сами по себе тоже — сотни и тысячи химических реакций в мельчайших нейронах, а дальше мозг, состоящий из такого количества нейронов, сколько звёзд лишь в одной нашей галактике (а галактик во Вселенной порядка 2 триллионов!), собирает всю эту информацию, синхронизируя свою работу с частотой 30-100 Гц, корректирует, удаляя искажения (сферическая и хроматическая аберрации, эффекты слепого пятна, цветокоррекция), формируя стереоскопическое изображение (а глаз-то у нас — две штуки!), пропуская полученные изображения через весь свой накопленный опыт и “прошивку” из инстинктов, рефлексов (подсознательная обработка информации), формирует образ — просто образ! — который отображается в сознании, в сознании, которое тоже кажется чем-то постоянным и незыблемым, но являющимся по себе лишь “эхом” всех хаотических внутренних процессов мозга, этаким дампом оперативной памяти (если опять проводить упрощённую аналогию с компьютерными системами), снимаемым с определённой частотой. И именно такое зрение только у человека! Любое другое живое существо “видит” мир совершенно по-другому. У одних мозг попроще, и формируемые в нём образы лишь цепочка слайдов, без какой-то “психической” обработки, которая, в силу сложности нашего мозга, есть у нас. У других — попроще оптика, они видят ещё меньший диапазон света. Или он смещён, как, например, у наших любимых собак и кошек, что тоже обусловлено эволюцией (чтобы видеть, что нужно и когда нужно — во время охоты, в частности). А иногда “оптического” зрения вообще нет. Вон, летучие мыши, “видят” мир, посылая высокочастотные звуковые сигналы (которые мы, к слову, и не услышим никогда — “железо” не позволяет) и обрабатывая информацию о том, через сколько эти сигналы вернулись.

А ведь это только зрение! Через зрение человек получает более 80% информации об окружающем мире — это фундамент восприятия! “Нет, реальность у всех одна, вы всё врёти!!1” Рассмотрим на микроуровне какой-нибудь один процесс из описанных.

Возьмём передачу нервных импульсов. Тут не бьёт током и нет искрящих молний, как это изображают полуфантастические научно-популярные фильмы. У млекопитающих нервные импульсы между клетками передаются через химические синапсы. Один нейрон выдаёт нейромедиатор (сложная молекула вроде дофамина), который передаётся соседнему нейрону (который, кстати говоря, может его принять, а может не принять), этот соседний нейрон, получив достаточное количество нейромедиаторов (а ведь там нейронные сети — каждый нейрон соединён с не менее, чем 15 000 других), начинает сам “возбуждаться” (или наоборот — “тормозиться”), высвобождая уже свой нейромедиатор, передавая сигнал дальше. После передачи сигналов таким образом, обычно (опять же, упрощаю) нейромедиатор возвращается обратно в нейрон-источник сигнала (пресинаптический нейрон) — с целью экономии.

Весь мир — иллюзия в наших коробках с нервными клетками. Совсем не факт, что эта иллюзия одна и та же.

И опять же, это только вершина айсберга происходящих процессов, поверхностное описание происходящего с высоким уровнем абстракции. Может, спуститься на уровень взаимодействия веществ внутри клеток? Которые сами по себе уже являются отдельными, независимыми организмами (которых, на минуточку, порядка 30 триллионов), внутри которых плавает суп из миллионов веществ, элементов из больше чем половины таблицы Менделеева. А ещё там вирусы путешествуют и живут своей чужой жизнью…

Что, вообще, такое — взаимодействие веществ? Спустимся на атомный уровень, и будем нести чушь про электроны, которые вращаются вокруг ядер и переходят с одного облака на другое, да? Нет, нет никаких облаков и вращающихся электронов вокруг ядра. Это тоже — модель. Электронам, как и другим частицам, свойственен корпускулярно-волновой дуализм. Состояние электронов описывается волновой функцией, квадрат модуля которой характеризует плотность вероятности нахождения частиц в данной точке пространства в данный момент времени. И вот тут начинаются суперсложности, потому что единого мнения о том, что происходит на уровне микрочастиц, не существует. Квантовая механика, описывающая эти взаимодействия, породила большое количество вопросов и неразрешимых парадоксов. Всё, что случается на микроуровне, — случается с некоторой вероятностью. Можно это понимать по-разному.

Мы привыкли, что всё “просто” и “стабильно”. Сидя у сколоченных, склеенных и покрашенных кусков деревьев, расслабившись в скрученных, скрепленных и обшитых тканью деревянных или металлических палках. Сидя, обмотав тело несколькими слоями нарезанными и сшитыми тканями, вытянутых из различных волокон. На одном из бетонных пластов, стоящих друг на друге и покрытых дополнительными слоями камней и досок. Как хорошо, что рядом есть так называемые удобства, где фильтрованной питьевой водой из ближайших рек, доставленной через системы насосов и труб, мы проталкиваем по другим трубам результаты химических реакций в кишечнике и мочевом пузыре. Результаты химических реакций, которые от нашей воли никак не зависят, химических реакций, которые производят сторонние живые существа в нашем кишечники, бактерии, которые просто живут в нас. Это всё называют простым словом — микрофлора. Это слово пишут на бутылочках с йогуртами в супермаркетах, оно стало обыденным, утратило свой истинный смысл. А ведь это живые организмы, целые колонии, которые живут с нами в симбиозе. Кишечник человека содержит в среднем около 50 триллионов микроорганизмов, что примерно в 1.3 раза больше, чем суммарное количество клеток организма вообще! Эти триллионы представителей 30-40 видов живут в клетке, их удерживают от побега соляная кислота и мышцы кишок.

Мы не замечаем, как дышим воздухом (по сути накачиваемся химическим реагентом для реакций окисления), не замечаем гравитацию (а ведь она такая классная!) — мы к этому привыкли. Как глубоководные рыбы, которые не замечают, что живут в воде. Кстати, у рыбок больше свободы: мы, можно сказать, вообще живём в плоском мире — возможности свободно двигаться по выдуманной оси Z у нас нет (ну, только в лифте, в самолёте и т.п.). Не замечаем (и никогда даже не увидим), что мы никогда не касаемся никакой поверхности, потому что это физически невозможно — у нас лишь возникает импульс в нервных окончаниях, который мы воспринимаем как касание.

Мы на автомате кушаем — заполняем бензобак питательными веществами, для того, чтобы все клетки наелись и функционировали, не умирали (а какие-то странные люди решили сделать из накладывания разных видов мёртвых организмов в какие-то круглые штуки целое искусство). На автомате чистим зубы — очищаем торчащую изо рта нашей медузы часть твёрдого скелета — чтобы прослужила подольше в деле размельчения пищи (а какие-то странные люди решили, что прямые и белые зубы — это красиво). И идём на работу, главное — не опоздать к определённому времени. Времени? Да, кто-то взял и придумал часы — ничего такого в природе нет. Связали с некоторой цикличностью вроде вращения вокруг Солнца и вращения вокруг оси. Но никаких циклов нет: Земля не оказывается спустя год в той же точке — мы несёмся в космические дали со всей тусой, орбиты меняются под действием приближающихся или удаляющихся объектов.

Всё движущееся, происходящее измеряют в секундах. Откуда взялись эти секунды? Сначала это была 1/60 часть минуты, 1/3 600 часа — в общем, по размерам тех приближенных интервалов, которыми пользовались раньше. Сейчас официальное, научное определение у секунды такое: “Секунда есть время, равное 9 192 631 770 периодам излучения, соответствующего переходу между двумя сверхтонкими уровнями основного состояния атома цезия-133.” Но секунды самой по себе нет. Время непрерывно.

Всё — приближение, всё — упрощение. Чем точность измерений меньше, тем всё более упрощается (как говорится, “счастье — в неведении”). Чем точность измерений выше, тем более хаотичным, бессмысленным всё это выглядит. Причём всё это — было всегда, измерили только лучше.

Мы первые из известных нам живых существ продвинулись настолько в развитии, что можем это всё наблюдать, анализировать, осознавать. Но есть ли в этом всём какой-то высокий смысл? Мы находимся на окраине (не в столице даже!) одной из 2 триллионов галактик? “Взгляни в эти глазки, эти красивые глаза…”

В 1995 году «Хаббл» провёл исследования участка неба (Hubble Deep Field) размером в одну тридцатимиллионную площади неба, содержащего несколько тысяч тусклых галактик.

“Кто вы в этой необъятной мультивселенной, мистер Стрэндж?..”

↑ к оглавлению


Ну вот и всё… До новых встреч!