И снова здравствуйте
Продолжим обсуждение того, как сделать свою ферму на Android девайсах и не облажаться (а сделать это просто). Если вспомним, то мы уже рассмотрели как нам скрыть root права многими способами и то, как обойти проверки на постоянное нахождение девайса на зарядке. Сегодня же я предлагаю посмотреть на то, как телефон подключен к сети.
WiFi
Сначала рассмотрим Wifi как самый простой способ подключения к интернету.
Тут все на самом деле прозаично. Чаще всего у девайса забирают его MAC адрес, название сети (SSID) и ее BSSID. Живут они все в
FakeTelephony/gsm
Тут посложнее уже, так как нам хочется выдать девайс за живой. А это уже требует времени. Но давайте по частям.
В основном все данные прилами берутся из
Но бывало что различные системы забирали данные по оператору и из
Так мы закончили смотреть еше на один важную деталь в создании фермы девайсов для каких-либо целей
Продолжим обсуждение того, как сделать свою ферму на Android девайсах и не облажаться (а сделать это просто). Если вспомним, то мы уже рассмотрели как нам скрыть root права многими способами и то, как обойти проверки на постоянное нахождение девайса на зарядке. Сегодня же я предлагаю посмотреть на то, как телефон подключен к сети.
Напоминаю что все, что вSharedPref.getXValue
или генерируется на удаленном сервере и подбирается для конкретной задачи девайса на сессию, в рамках которой выполняется действие.
WiFi
Сначала рассмотрим Wifi как самый простой способ подключения к интернету.
Хочу обратить внимание на то, что вам нужно будет подумать о том, как не выдавать свой IP. Один из вариантов я описал в этом комментарии (Ссылка скрыта от гостей).
Тут все на самом деле прозаично. Чаще всего у девайса забирают его MAC адрес, название сети (SSID) и ее BSSID. Живут они все в
android.net.wifi.WifiInfo
там и будем менять.
Java:
XposedHelpers.findAndHookMethod("android.net.wifi.WifiInfo", lpparam.classLoader, "getMacAddress", new XC_MethodHook() {
@Override
protected void afterHookedMethod(MethodHookParam param) throws Throwable {
param.setResult(SharedPref.getXValue("WifiMAC"));
}
});
XposedHelpers.findAndHookMethod("android.net.wifi.WifiInfo", lpparam.classLoader, "getSSID", new XC_MethodHook() {
@Override
protected void afterHookedMethod(MethodHookParam param) throws Throwable {
param.setResult(SharedPref.getXValue("WifiName"));
}
});
XposedHelpers.findAndHookMethod("android.net.wifi.WifiInfo", lpparam.classLoader, "getBSSID", new XC_MethodHook() {
@Override
protected void afterHookedMethod(MethodHookParam param) throws Throwable {
param.setResult(SharedPref.getXValue("BSSID"));
}
});
FakeTelephony/gsm
Тут посложнее уже, так как нам хочется выдать девайс за живой. А это уже требует времени. Но давайте по частям.
В основном все данные прилами берутся из
android.telephony.TelephonyManager
и тут я говорю проIMEI
, который естьgetDeviceId
SubscriberId
->getSubscriberId
PhoneNumber
->getLine1Number
SimSerial
->getSimSerialNumber
CarrierCode
->getNetworkOperator
,getSimOperator
CountryCode
->getNetworkCountryIso
,getSimCountryIso
Java:
public void FakeTelephony(LoadPackageParam loadPkgParam){
String TelePhone = "android.telephony.TelephonyManager";
HookTelephony(TelePhone, loadPkgParam, "getDeviceId", SharedPref.getXValue("IMEI"));
HookTelephony(TelePhone, loadPkgParam, "getSubscriberId", SharedPref.getXValue("SUBSCRIBERID"));
HookTelephony(TelePhone, loadPkgParam, "getLine1Number", SharedPref.getXValue("PhoneNumber"));
HookTelephony(TelePhone, loadPkgParam, "getSimSerialNumber", SharedPref.getXValue("SimSerial"));
HookTelephony(TelePhone, loadPkgParam, "getNetworkOperator", SharedPref.getXValue("CarrierCode"));
HookTelephony(TelePhone, loadPkgParam, "getSimOperator", SharedPref.getXValue("CarrierCode"));
HookTelephony(TelePhone, loadPkgParam, "getNetworkCountryIso", SharedPref.getXValue("CountryCode"));
HookTelephony(TelePhone, loadPkgParam, "getSimCountryIso", SharedPref.getXValue("CountryCode"));
}
private void HookTelephony(String hookClass, LoadPackageParam loadPkgParam, String funcName, final String value){
try {
XposedHelpers.findAndHookMethod(hookClass, loadPkgParam.classLoader, funcName, new XC_MethodHook() {
@Override
protected void afterHookedMethod(MethodHookParam param)
throws Throwable {
// TODO Auto-generated method stub
super.afterHookedMethod(param);
param.setResult(value);
}
});
} catch (Exception e) {
XposedBridge.log("Fake " + funcName + " ERROR: " + e.getMessage());
}
}
Но бывало что различные системы забирали данные по оператору и из
build.prop
. Там тоже меняем, но как работать с build.prop расскажу в слудующей статье, так как там много подводных камней :/ Вообще build.prop очень тонкий и чувствиельный файл, так как некорректно заменив данные в нем можно отправить девайс в бутлуп.Так мы закончили смотреть еше на один важную деталь в создании фермы девайсов для каких-либо целей