А давайте создадим ферму девайсов, которые должны будут выполнять какие-то действия и так, чтобы это было удобно и беспалевно?
Сразу предупрежу что это будет серия статей о том, как сформировать подобную ферму для своих нужд (может быть вы хотите построить автоматизированную систему тестирования вашего мобильного приложения, а может, быть и скликивать рекламу или регистрировать аккаунты), но предупрежу сразу что все статьи написаны в ознакомительных целях. И да, я буду говорить только в рамках Xposed Framework (Magisk и прочие новомодные штуки пока не будем рассматривать).
Как могут определить такую ферму antifraud системыи побанить ваши аккаунты? Тут огромый простор для фантазий и самое первое что приходит в голову дак это:
- Все девайсы всегда стоят на зарядке и это не похоже на поведение живых пользователей. У вас телефоны всегда на зарядке?
- GPS у них тоже в одном положении, они не двигаются
- Симки отсутсвуют почти у всех, соединение по WiFi
- Девайсы зафиксированы в достаточно жестком положении (они не крутятся в руке как у живого пользователя) и нам придется подумать о том, как обмануть гироскоп и подобные датчики
Кстати, куски кода, которые я раскрываю являются частью системы, которую мы делали и она состоит их таких частей как серверный бэкэнд (который хранит, планирует и разрадет задания девайсам по API) и фронтенд в виде девайсов, которые работают и выполняют задания. Девайсы по расписанию опрашивают сервер для того, чтобы получить таску и если ее нет, то повторяют запрос через какое-то время. Про планирование тасок я расскажу отдельно потом.
Многие данные генерируются и отдаютмя по API, попадая в SharedPref, откуда потом забираются в жизненный цикл задачи
Многие данные генерируются и отдаютмя по API, попадая в SharedPref, откуда потом забираются в жизненный цикл задачи
Начнем как раз с батареи и типа подключения к зарядке.
У батареи есть такие параметры как temperature, level, plugged, health и другие, но если описывать все, то нам не хватит места на форуме и статья будет большой и скучной. Поэтому будет хукать то, что самое интересное, а кому нужно остальное (
Ссылка скрыта от гостей
), по аналогии доработают под свои нужды Получить значения проще всего из
android.content.Intent
, поэтому будем хукать именно этот метод. Для того, чтобы понять какие значения нам нужны идем смотреть в документацию Android (
Ссылка скрыта от гостей
)
Java:
import android.support.v4.app.NotificationCompat;
import java.util.Random;
import de.robv.android.xposed.XC_MethodHook;
import de.robv.android.xposed.XposedBridge;
import de.robv.android.xposed.XposedHelpers;
import de.robv.android.xposed.callbacks.XC_LoadPackage.LoadPackageParam;
public class FakeBattery {
public void fakePinStt(LoadPackageParam loadPkgParam) {
try {
XposedHelpers.findAndHookMethod("android.content.Intent", loadPkgParam.classLoader, "getIntExtra", String.class, Integer.TYPE, new XC_MethodHook() {
@Override
protected void beforeHookedMethod(MethodHookParam param)
throws Throwable {
// TODO: Auto-generated method stub
super.beforeHookedMethod(param);
if (param.args[0] != null) {
if (param.args[0] == "temperature") {
param.setResult(Integer.valueOf(SharedPref.getXValue("Temp")));
}
if (param.args[0] == "level") {
param.setResult(Integer.valueOf(SharedPref.getXValue("Level")));
}
if (param.args[0] == "plugged") {
param.setResult(Integer.valueOf(random02()));
}
//......
if (param.args[0] == "health") {
param.setResult(Integer.valueOf("2"));
}
}
}
});
} catch (Exception e) {
XposedBridge.log("Fake Pin ERROR: " + e.getMessage());
}
}
private String random02() {
String[] arrayValue = new String[] { "0", "1", "2" };
return arrayValue[new Random().nextInt(arrayValue.length)];
}
}
В следующих статьях будем рассматривать остальные компоненты системы и то, что нужно хукать Думаю что поговорим о местоположении и типе подключения девайса к сети (sim,wifi).