June 7, 2019
SOSITE HYI
Ну что, ты как-то просил глянуть что там с "sosite_hyi" // Отвечаю.
Данная строка встречается в модуле "network", который содержит логику взаимодействия с сервером. Сравним две версии, чтобы понять что к чему относится.
2.6.0
Класс один и тот же: com/pk/taxoid/network/c/b.smali
Декомпилированный JAVA код:
public void a(com.pk.taxoid.c.b.b bVar, String str, long j) {
if (str.equals("assign") && this.g) {
b(bVar, str);
return;
}
if (str.equals("assign")) {
this.g = true;
}
if (str.equals("state")) {
this.g = false;
}
try {
com.pk.taxoid.c.b.a E = bVar.E();
JSONObject jSONObject = new JSONObject();
jSONObject.put("action", str);
jSONObject.put("fmanid", E.c());
jSONObject.put("session", E.d());
jSONObject.put("ftaxi", E.e());
jSONObject.put("order_id", bVar.h());
jSONObject.put("os", "android");
jSONObject.put("version", 40);
if (this.d != null) {
this.d.interrupt();
}
if (j == 0) {
a(jSONObject);
} else {
a(jSONObject, j);
}
} catch (JSONException e) {
e.printStackTrace();
}
}public void a(String str, String str2, String str3) {
try {
JSONObject jSONObject = new JSONObject();
jSONObject.put("action", str3);
jSONObject.put("login", str);
jSONObject.put("password", str2);
a(jSONObject);
} catch (JSONException e) {
e.printStackTrace();
}
} public void d() {
try {
JSONObject jSONObject = new JSONObject();
JSONArray jSONArray = new JSONArray();
Iterator it = this.a.iterator();
while (it.hasNext()) {
com.pk.taxoid.c.b.a aVar = (com.pk.taxoid.c.b.a) it.next();
JSONObject jSONObject2 = new JSONObject();
jSONObject2.put("login", aVar.a());
jSONObject2.put("password", aVar.b());
jSONArray.put(jSONObject2);
}
Object obj = BuildConfig.FLAVOR;
if (this.a.size() > 0) {
obj = com.pk.taxoid.b.d.a((com.pk.taxoid.c.b.a) this.a.get(0));
}
jSONObject.put("action", "get_session");
jSONObject.put("data", jSONArray);
jSONObject.put("imei", com.pk.taxoid.b.d.a());
jSONObject.put("number", com.pk.taxoid.b.d.b());
jSONObject.put("model", com.pk.taxoid.b.d.d());
jSONObject.put("mac", com.pk.taxoid.b.d.c());
jSONObject.put("os", "android");
jSONObject.put("android", VERSION.RELEASE);
jSONObject.put("version", 40);
jSONObject.put("version_name", "2.6.0");
jSONObject.put("push_endpoint", this.b.ab());
jSONObject.put("city", obj);
a(jSONObject, 0);
} catch (JSONException e) {
e.printStackTrace();
}
}
}2.6.1
public void a(com.pk.taxoid.b.b.b bVar, String str, long j) {
if (str.equals("assign") && this.i) {
c(bVar, str);
return;
}
if (str.equals("assign")) {
this.i = true;
}
if (str.equals("state")) {
this.i = false;
}
try {
com.pk.taxoid.b.b.a A = bVar.A();
JSONObject jSONObject = new JSONObject();
jSONObject.put("action", str);
jSONObject.put("fmanid", A.c());
jSONObject.put("session", A.d());
jSONObject.put("ftaxi", A.e());
jSONObject.put("order_id", bVar.g());
jSONObject.put("os", "android");
jSONObject.put("version", 50);
if (this.i) {
Context b = Application.b();
if (b != null) {
jSONObject.put("anal", a(bVar, com.pk.taxoid.libs.a.b(b), "T"));
} else {
jSONObject.put("anal", a(bVar, "unknown", "T"));
}
} else {
jSONObject.put("sosite_huy", this.f.g());
}
if (this.d != null) {
this.d.interrupt();
}
if (j == 0) {
a(jSONObject);
} else {
a(jSONObject, j);
}
} catch (JSONException e) {
e.printStackTrace();
}
} public void a(String str, String str2, String str3) {
try {
JSONObject jSONObject = new JSONObject();
jSONObject.put("action", str3);
jSONObject.put("login", str);
jSONObject.put("password", str2);
jSONObject.put("sosite_huy", this.f.g());
a(jSONObject);
} catch (JSONException e) {
e.printStackTrace();
}
} public void b(com.pk.taxoid.b.b.a aVar) {
try {
JSONObject jSONObject = new JSONObject();
jSONObject.put("action", "tidings");
jSONObject.put("ftaxi", aVar.e());
jSONObject.put("sosite_huy", this.f.g());
a(jSONObject);
} catch (JSONException e) {
e.printStackTrace();
}
} public void c(com.pk.taxoid.b.b.a aVar) {
try {
JSONObject jSONObject = new JSONObject();
jSONObject.put("action", "cash");
jSONObject.put("fmanid", aVar.c());
jSONObject.put("sosite_huy", this.f.g());
a(jSONObject);
} catch (JSONException e) {
e.printStackTrace();
}
} public void c(com.pk.taxoid.b.b.b bVar, String str) {
this.i = false;
try {
com.pk.taxoid.b.b.a A = bVar.A();
JSONObject jSONObject = new JSONObject();
jSONObject.put("action", "revise");
jSONObject.put("type", str);
jSONObject.put("fmanid", A.c());
jSONObject.put("session", A.d());
jSONObject.put("order_id", bVar.g());
jSONObject.put("version", 50);
jSONObject.put("sosite_huy", this.f.g());
a(jSONObject);
} catch (JSONException e) {
e.printStackTrace();
}
} public void d() {
try {
JSONObject jSONObject = new JSONObject();
JSONArray jSONArray = new JSONArray();
Iterator it = this.a.iterator();
while (it.hasNext()) {
com.pk.taxoid.b.b.a aVar = (com.pk.taxoid.b.b.a) it.next();
JSONObject jSONObject2 = new JSONObject();
jSONObject2.put("login", aVar.a());
jSONObject2.put("password", aVar.b());
jSONArray.put(jSONObject2);
}
Object obj = BuildConfig.FLAVOR;
if (this.a.size() > 0) {
obj = Utils.a((com.pk.taxoid.b.b.a) this.a.get(0));
}
jSONObject.put("action", "get_session");
jSONObject.put("data", jSONArray);
jSONObject.put("imei", Utils.a());
jSONObject.put("number", Utils.b());
jSONObject.put("model", Utils.d());
jSONObject.put("mac", Utils.c());
jSONObject.put("os", "android");
jSONObject.put("android", VERSION.RELEASE);
jSONObject.put("version", 50);
jSONObject.put("version_name", "2.6.1");
jSONObject.put("push_endpoint", this.b.ad());
jSONObject.put("city", obj);
jSONObject.put("sosite_huy", this.f.g());
a(jSONObject, 1000);
} catch (JSONException e) {
e.printStackTrace();
}
}
}Так... Давай разбираться...
Во всех методах, котрые связаны с формированием запроса на сервер добавилась строка типа:
jSONObject.put("sosite_huy", this.f.g());Очевидно, что sosite_huy - ключ. Значение этого поля высчитывается динамически через метод this.f.g(). Тот самый метод g() находится в классе
com/pk/taxoid/libs/a/b.smali
Вот краткая выжимка этого класса. Только самое нужное:
public final class b implements com.google.android.gms.common.api.f.b, c, d, a {//...
private Location k;
//...
static {
System.loadLibrary("kk");
}//...
public String f() {
if (this.k == null) {
return "unknown";
}
StringBuilder stringBuilder = new StringBuilder();
stringBuilder.append(this.k.getLatitude());
stringBuilder.append(",");
stringBuilder.append(this.k.getLongitude());
return stringBuilder.toString();
} public String g() {
String str = "none";
try {
str = Utils.encrypt(f());
return str;
} catch (Exception unused) {
return str;
}
}
}Разберем попорядку:
- Инициализируется переменная k
- Из натива (папка /libs/) подгружается библиотека "kk.so"
public String f():Формируется строка вида "широта , долгота". Координаты широты и долготы берутся из переменной kpublic String g():Идет попытка зашифровать эти координаты с помощью нативного метода Utils.encrypt() который как раз и находится внутри библиотеки "kk.so". Если попытка не удалась (кривая прошивка например), то присваивается значение "none"
Резюмирую:
- Во время каждого запрса приложение палит твое местоположение на карте
- Это местоположение шифруется и отправляется на сервер
- На сервере его расшифровывают, и в зависимости от этого что-либо предпринимают. Ты говорил о радиусе в 500 метров. Вполне вероятно, что именно так и вычисляется твое расстояние до клиента