SHA1:
- 7ed01280dd254b063fecfdbf1da773df7738120a
Троянская программа для ОС Android, встроена в системную библиотеку libandroid_runtime.so на уровне исходного кода. В методе println_native класса android.util.Log (core/jni/android_util_Log.cpp проекта platform/frameworks/base) был добавлен дополнительный вызов:
/*
* In class android.util.Log:
* public static native int println_native(int buffer, int priority, String tag, String msg)
*/
extern "C" int xlogf_java_tag_is_on(const char *name, int level);
extern "C" int xlogf_java_xtag_is_on(const char *name, int level);
static jint android_util_Log_println_native(JNIEnv* env, jobject clazz,
jint bufID, jint priority, jstring tagObj, jstring msgObj)
{
const char* tag = NULL;
const char* msg = NULL;
if (msgObj == NULL) {
jniThrowNullPointerException(env, "println needs a message");
return -1;
}
if (bufID < 0 || bufID >= LOG_ID_MAX) {
jniThrowNullPointerException(env, "bad bufID");
return -1;
}
if (tagObj != NULL)
tag = env->GetStringUTFChars(tagObj, NULL);
msg = env->GetStringUTFChars(msgObj, NULL);
int res = -1;
int flag_m = 0;
int count = 0;
char new_tag[50];
if (tag != NULL && (strncmp(tag, "@M_", 3) == 0)) {
flag_m = 1;
while(tag[count+3]) {
new_tag[count] = tag[count+3];
count++;
}
new_tag[count] = 0;
}
#ifdef HAVE_XLOG_FEATURE
if (flag_m == 1) {
if (xlogf_java_xtag_is_on(new_tag, (android_LogPriority)priority)) {
res = __android_log_buf_write(bufID, (android_LogPriority)priority, new_tag, msg);
}
} else if (xlogf_java_tag_is_on(tag, (android_LogPriority)priority)) {
res = __android_log_buf_write(bufID, (android_LogPriority)priority, tag, msg);
}
#else
if (flag_m == 1) {
res = __android_log_buf_write(bufID, (android_LogPriority)priority, new_tag, msg);
} else {
res = __android_log_buf_write(bufID, (android_LogPriority)priority, tag, msg);
}
#endif
// droi.zhanglin,20160901. add leagoo custom code
/* qy start*/
// TODO:渠道机型号
__config_log_println(env,priority, tag, msg, "cf89490001");
/* qy end*/
if (tag != NULL)
env->ReleaseStringUTFChars(tagObj, tag);
env->ReleaseStringUTFChars(msgObj, msg);
return res;
}
В результате указанная функция вызывается каждый раз, когда какое-либо приложение на зараженном мобильном устройстве выполняет запись в системный журнал.
Первоначальный запуск Android.Triada.231 происходит при вызове этой функции в процессе Zygote. Троянец расшифровывает строки с данными, которые он использует для работы, а также выполняет проверку версии API операционной системы и среды исполнения, в которой он запущен. Если это виртуальная машина Dalvik, Android.Triada.231 перехватывает в оперативной памяти метод onCreate класса Application, выполняя патч структуры jmethodID, которая соответствует этому методу. Патч производится таким образом, что метод помечается как native. Затем троянец вызывает класс RegisterNatives.
С использованием метода java.lang.System.setProperty вредоносная программа изменяет следующие системные свойства:
- os.config.ppgl.dir – название рабочего каталога троянца (/data/configppgl для виртуальной машины Dalvik и /sdcard/.SDAndroid для виртуальной машины ART);
- os.config.ppgl.version – параметр со значением «1.3.3»;
- os.config.ppgl.status – параметр со значением «working»;
- os.config.ppgl.cd – параметр, переданный троянской функции (в описываемом образце имеет значение «M5 Plus Lte»).
После этого Android.Triada.231 создает свой рабочий каталог.
Так как при запуске приложений их процессы ответвляются от процесса Zygote, в них автоматически попадает и код троянца вместе с расшифрованными при его первом запуске строками и инициализированными переменными.
В случае если Android.Triada.231 исполняется в виртуальной машине ART, активизация троянца в процессах приложений производится не сразу после их запуска, а лишь после того, как они выполнят запись в системный журнал. Это действие осуществляется с использованием той же самой функции, которую вирусописатели встроили в метод println_native для инициализации троянца.
Android.Triada.231 проверяет в своем рабочем каталоге наличие поддиректории, имя которой содержит значение MD5 имени зараженного процесса. Если такая поддиректория находится, троянец ищет в ней зашифрованный файл с именем 32.mmd или 64.mmd (для 32- и 64-битных версий операционной системы соответственно). Найдя необходимый файл, Android.Triada.231 расшифровывает его и сохраняет под именем libcnfgp.so, после чего загружает в оперативную память с использованием метода java.lang.System.load и удаляет расшифрованную копию с устройства.
При отсутствии указанного файла троянец ищет вместо него файл с именем 36.jmd, который при обнаружении также расшифровывается, сохраняется под именем mms-core.jar, запускается с использованием класса DexClassLoader, после чего удаляется.
В результате Android.Triada.231 может внедрять в процессы приложений вредоносные модули, которые способны выполнять самые разнообразные действия, например красть конфиденциальные данные или подменять отображаемую в атакуемых программах информацию.
Троянец также может извлекать из модифицированной библиотеки libandroid_runtime.so зашифрованный в ней jar-модуль (детектируется как Android.Triada.194.origin). Android.Triada.231 загружает этот модуль в процесс com.android.mms, когда он вызывает метод println_native. Это делается при условии, если параметр tag метода println_native отличен от значения «DownloadManager» и «MmsSystemEventReceiver», и троянская функция вызывается в атакуемом процессе как минимум третий раз.