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(): Формируется строка вида "широта , долгота". Координаты широты и долготы берутся из переменной k
  • public String g(): Идет попытка зашифровать эти координаты с помощью нативного метода Utils.encrypt() который как раз и находится внутри библиотеки "kk.so". Если попытка не удалась (кривая прошивка например), то присваивается значение "none"

Резюмирую:

  • Во время каждого запрса приложение палит твое местоположение на карте
  • Это местоположение шифруется и отправляется на сервер
  • На сервере его расшифровывают, и в зависимости от этого что-либо предпринимают. Ты говорил о радиусе в 500 метров. Вполне вероятно, что именно так и вычисляется твое расстояние до клиента