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 метров. Вполне вероятно, что именно так и вычисляется твое расстояние до клиента