SHA1:
- 4af24c9f6815c8b0f5d0b44cc9040cdd7d828d96
Троянец для мобильной платформы Google Android, исследованный образец представляет собой файл:
/data/system/.loki/loki32
Основное предназначение троянца — внедрение библиотеки liblokih.so в процесс system_server и выполнение команд от имени суперпользователя (root).
Процесс loki32 запускается вместе с операционной системой и ожидает, пока она полностью загрузится. Затем троянец начинает последовательный просмотр папок в каталоге /proc, который содержит информацию о процессах, состоянии и конфигурации ядра и системы. Среди содержимого папки вредоносная программа ищет процесс, у которого в /proc/<pid>/cmdline будет установлено значение "system_server".
Затем троянец получает относительные адреса функций, необходимых для осуществления инжекта:
libcAddr = getAddressFromMaps(v1, "/system/lib/libc.so");
linkerAddr = getAddressFromMaps(v0, "/system/bin/linker");
mallocAddr = (int)&malloc - libcAddr;
dlopenAddr = (int)&dlopen - linkerAddr;
dlcloseAddr = (int)&dlclose - linkerAddr;
dlsymAddr = (int)&dlsym - linkerAddr;
dlerrorAddr = (int)&dlerror – linkerAddr.
Функция getAddressFromMaps выполняет синтаксический разбор содержимого файла /proc/self/maps, содержащего карту памяти процесса, находит там первую строку, соответствующую нужной библиотеке, например:
40020000-40065000 r-xp 00000000 1f:00 363 /system/lib/libc.so
и извлекает оттуда первое число. Далее происходит сам инжект:
inject(ss_pid, "/data/system/.loki/liblokih.so", "load_loki", "");
Эта функция получает на вход значение PID процесса, в который будет выполнен инжект, путь к библиотеке, которую нужно загрузить, и имя функции в этой библиотеке, которую нужно вызвать. Сам процесс инжекта осуществляется с помощью системного вызова ptrace, возможности которого обычно используют отладчики. С помощью функции PTRACE_ATTACH процесс останавливается, троянец подключается к нему и получает доступ к чтению и изменению состояния памяти и регистров. Затем при помощи функции PTRACE_GETREGS в остановленном процессе троянец получает значения регистров и с помощью PTRACE_SETREGS изменяет их таким образом, чтобы выполнилась нужная функция. Затем процесс запускается снова с использованием PTRACE_CONT.
Кроме того, Android.Loki.3 может выполнять от имени суперпользователя (root) команды, поступающие от Android.Loki.1.origin и Android.Loki.2.origin. Фактически, Android.Loki.3 играет роль сервера для запуска шелл-скриптов: киберпреступники передают троянцу путь к сценарию, который следует выполнить, через локальный сокет, и Android.Loki.3 запускает этот скрипт.