Drozer, эмулятор и эльфийские костыли
AndroidGuardsВам когда-нибудь хотелось странного? Например запустить drozer в docker-контейнере и достучаться с него до эмулятора на том же хосте? Казалось бы задача предельно простая и понятная. Запускаем эмулятор, на нем drozer-agent
, пробрасываем порты, заводим контейнер говорим drozer console connect —server <locahost ip>
и.... ничего не происходит. При этом если попытаться таким образом подключиться на девайс, который висит на другом ip, то все будет хорошо. Давайте разбираться и чинить.
![](/file/a78058f0f27ff363df69a.png)
Эта проблема возникает потому, что эмулятор всегда стартует на loopback интерфейсе и никакими флагами запуска нельзя заставить его изменить это поведение. По крайней мере я не нашел таких флагов. Таким образом, когда мы пытаемся достучаться из контейнера до эмулятора через айпишник хоста (например 192.168.10.27), то терпим неудачу, потому что на этом интерфейсе нужный нам порт не прослушивается. Этот факт приводит нас к некрасивому, но рабочему решению — reverse proxy.
В качестве прокси я буду использовать socat, потому что это официальный гугловый костыль для решения этой задачи. Его можно установить разными способами, например через brew install socat
. Но это уже на ваше усмотрение. После установки делаем такие магические пасcы:
- Запустить эмулятор, drozer-agent и не забыть нажать кнопку ON
- Пробросить порты:
adb forward tcp:31415 tcp:31415
- Включить проксирование:
socat -d tcp-listen:31415,reuseaddr,fork tcp:127.0.0.1:31415 &
- Поднять контейнер с дрозером:
docker run --rm -it fsecurelabs/drozer
- Подключиться к агенту:
drozer console connect --server 192.168.10.27
В результате должна открыться консоль drozer-а, а что делать дальше вы лучше меня знаете ;)
А чтобы не набивать это все каждый раз руками, я написал небольшой скрипт, который выполняет это все за меня. Забирайте здесь. Пример запуска:
$ ./run-drozer.sh 192.168.10.27 The default port 31415 will be used 31415 Selecting 8c9128251e6d3bbd (Google Android SDK built for x86 10) ... drozer Console (v2.4.4) dz>
При запуске он полагается на переменную окружения ANDROID_HOME, поэтому не забудьте ее установить заранее или указать при запуске. Ну или вообще забить гвоздями путь к бинарнику adb
. Полный opensource, все как вы любите.