ΠΠ²Π΅Π΄Π΅Π½ΠΈΠ΅
Π ΠΊΠΎΠ½ΡΠ΅ ΠΌΠ°ΡΡΠ° ΠΌΡ
ΠΠ΅ΠΊΠΎΡΠΎΡΠΎΠ΅ Π²ΡΠ΅ΠΌΡ Π½Π°Π·Π°Π΄ UC Browser ΡΠ΅ΠΊΠ»Π°ΠΌΠΈΡΠΎΠ²Π°Π»ΠΈ ΠΈ ΡΠ°ΡΠΏΡΠΎΡΡΡΠ°Π½ΡΠ»ΠΈ ΠΎΡΠ΅Π½Ρ Π°Π³ΡΠ΅ΡΡΠΈΠ²Π½ΠΎ: Π΅Π³ΠΎ ΡΡΡΠ°Π½Π°Π²Π»ΠΈΠ²Π°Π»ΠΈ Π½Π° ΡΡΡΡΠΎΠΉΡΡΠ²Π° ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Π΅ΠΉ Ρ ΠΏΠΎΠΌΠΎΡΡΡ Π²ΡΠ΅Π΄ΠΎΠ½ΠΎΡΠ½ΡΡ
ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌ, ΡΠ°ΡΠΏΡΠΎΡΡΡΠ°Π½ΡΠ»ΠΈ Ρ ΡΠ°Π·Π»ΠΈΡΠ½ΡΡ
ΡΠ°ΠΉΡΠΎΠ² ΠΏΠΎΠ΄ Π²ΠΈΠ΄ΠΎΠΌ Π²ΠΈΠ΄Π΅ΠΎΡΠ°ΠΉΠ»ΠΎΠ² (Ρ. Π΅. ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»ΠΈ Π΄ΡΠΌΠ°Π»ΠΈ, ΡΡΠΎ ΠΊΠ°ΡΠ°ΡΡ, Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, ΠΏΠΎΡΠ½ΠΎΡΠΎΠ»ΠΈΠΊ, Π° ΠΏΠΎΠ»ΡΡΠ°Π»ΠΈ Π²ΠΌΠ΅ΡΡΠΎ Π½Π΅Π³ΠΎ APK Ρ ΡΡΠΈΠΌ Π±ΡΠ°ΡΠ·Π΅ΡΠΎΠΌ), ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π»ΠΈ ΠΏΡΠ³Π°ΡΡΠΈΠ΅ Π±Π°Π½Π½Π΅ΡΡ Ρ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΡΠΌΠΈ ΠΎ ΡΠΎΠΌ, ΡΡΠΎ Π±ΡΠ°ΡΠ·Π΅Ρ ΡΡΡΠ°ΡΠ΅Π», ΡΡΠ·Π²ΠΈΠΌ ΠΈ Π²ΡΡ Π² ΡΠ°ΠΊΠΎΠΌ Π΄ΡΡ
Π΅. Π ΠΎΡΠΈΡΠΈΠ°Π»ΡΠ½ΠΎΠΉ Π³ΡΡΠΏΠΏΠ΅ UC Browser Π² VK Π΅ΡΡΡ
ΠΠ° ΠΌΠΎΠΌΠ΅Π½Ρ Π½Π°ΠΏΠΈΡΠ°Π½ΠΈΡ ΡΡΠ°ΡΡΠΈ Ρ UC Browser Π½Π°Π±ΡΠ°Π»ΠΎΡΡ Π±ΠΎΠ»Π΅Π΅ 500 000 000 ΡΡΡΠ°Π½ΠΎΠ²ΠΎΠΊ Π² Google Play. ΠΡΠΎ Π²ΠΏΠ΅ΡΠ°ΡΠ»ΡΠ΅Ρ β Π±ΠΎΠ»ΡΡΠ΅ ΡΠΎΠ»ΡΠΊΠΎ Ρ Google Chrome. Π‘ΡΠ΅Π΄ΠΈ ΠΎΡΠ·ΡΠ²ΠΎΠ² ΠΌΠΎΠΆΠ½ΠΎ ΡΠ²ΠΈΠ΄Π΅ΡΡ Π΄ΠΎΡΡΠ°ΡΠΎΡΠ½ΠΎ ΠΌΠ½ΠΎΠ³ΠΎ ΠΆΠ°Π»ΠΎΠ± Π½Π° ΡΠ΅ΠΊΠ»Π°ΠΌΡ ΠΈ ΡΠ΅Π΄ΠΈΡΠ΅ΠΊΡΡ Π½Π° ΠΊΠ°ΠΊΠΈΠ΅-ΡΠΎ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ Π² Google Play. ΠΡΠΎ ΠΈ ΡΡΠ°Π»ΠΎ ΠΏΠΎΠ²ΠΎΠ΄ΠΎΠΌ ΠΊ ΠΈΡΡΠ»Π΅Π΄ΠΎΠ²Π°Π½ΠΈΡ: ΠΌΡ ΡΠ΅ΡΠΈΠ»ΠΈ ΠΏΠΎΡΠΌΠΎΡΡΠ΅ΡΡ, Π½Π΅ Π΄Π΅Π»Π°Π΅Ρ Π»ΠΈ UC Browser ΡΡΠΎ-ΡΠΎ Π½Π΅Ρ
ΠΎΡΠΎΡΠ΅Π΅. Π ΠΎΠΊΠ°Π·Π°Π»ΠΎΡΡ, ΡΡΠΎ ΡΠ°ΠΊΠΈ Π΄Π΅Π»Π°Π΅Ρ!
Π ΠΊΠΎΠ΄Π΅ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ ΠΎΠ±Π½Π°ΡΡΠΆΠΈΠ»Π°ΡΡ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΡ Π·Π°Π³ΡΡΠ·ΠΊΠΈ ΠΈ Π·Π°ΠΏΡΡΠΊΠ° ΠΈΡΠΏΠΎΠ»Π½ΡΠ΅ΠΌΠΎΠ³ΠΎ ΠΊΠΎΠ΄Π°,
ΠΡΡ, ΡΡΠΎ Π½Π°ΠΏΠΈΡΠ°Π½ΠΎ Π΄Π°Π»Π΅Π΅, Π°ΠΊΡΡΠ°Π»ΡΠ½ΠΎ Π΄Π»Ρ Π²Π΅ΡΡΠΈΠΈ UC Browser, ΠΊΠΎΡΠΎΡΠ°Ρ ΠΏΡΠΈΡΡΡΡΡΠ²ΠΎΠ²Π°Π»Π° Π² Google Play Π½Π° ΠΌΠΎΠΌΠ΅Π½Ρ ΠΏΡΠΎΠ²Π΅Π΄Π΅Π½ΠΈΡ ΠΈΡΡΠ»Π΅Π΄ΠΎΠ²Π°Π½ΠΈΡ:
package: com.UCMobile.intl
versionName: 12.10.8.1172
versionCode: 10598
sha1 APK-ΡΠ°ΠΉΠ»Π°: f5edb2243413c777172f6362876041eb0c3a928c
ΠΠ΅ΠΊΡΠΎΡ Π°ΡΠ°ΠΊΠΈ
Π ΠΌΠ°Π½ΠΈΡΠ΅ΡΡΠ΅ UC Browser ΠΌΠΎΠΆΠ½ΠΎ ΠΎΠ±Π½Π°ΡΡΠΆΠΈΡΡ ΡΠ΅ΡΠ²ΠΈΡ Ρ Π³ΠΎΠ²ΠΎΡΡΡΠΈΠΌ Π½Π°Π·Π²Π°Π½ΠΈΠ΅ΠΌ com.uc.deployment.UpgradeDeployService.
<service android_exported="false" android_name="com.uc.deployment.UpgradeDeployService" android_process=":deploy" />
ΠΡΠΈ Π·Π°ΠΏΡΡΠΊΠ΅ ΡΡΠΎΠ³ΠΎ ΡΠ΅ΡΠ²ΠΈΡΠ° Π±ΡΠ°ΡΠ·Π΅Ρ Π²ΡΠΏΠΎΠ»Π½ΡΠ΅Ρ POST-Π·Π°ΠΏΡΠΎΡ ΠΊ
ΠΡΠ°ΠΊ, ΠΊΠΎΠ³Π΄Π° ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Ρ Ρ ΠΎΡΠ΅Ρ ΠΎΡΠΊΡΡΡΡ PDF ΠΏΡΡΠΌΠΎ Π² Π±ΡΠ°ΡΠ·Π΅ΡΠ΅, Π² ΡΡΠ°ΡΠΈΠΊΠ΅ ΠΌΠΎΠΆΠ½ΠΎ ΡΠ²ΠΈΠ΄Π΅ΡΡ ΡΠ»Π΅Π΄ΡΡΡΠΈΠ΅ Π·Π°ΠΏΡΠΎΡΡ:
Π‘Π½Π°ΡΠ°Π»Π° ΠΈΠ΄ΡΡ POST-Π·Π°ΠΏΡΠΎΡ ΠΊ
ΡΠΊΠ°ΡΠΈΠ²Π°Π΅ΡΡΡ Π°ΡΡ
ΠΈΠ² Ρ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠΎΠΉ Π΄Π»Ρ ΠΏΡΠΎΡΠΌΠΎΡΡΠ° PDF ΠΈ ΠΎΡΠΈΡΠ½ΡΡ
ΡΠΎΡΠΌΠ°ΡΠΎΠ². ΠΠΎΠ³ΠΈΡΠ½ΠΎ ΠΏΡΠ΅Π΄ΠΏΠΎΠ»ΠΎΠΆΠΈΡΡ, ΡΡΠΎ Π² ΠΏΠ΅ΡΠ²ΠΎΠΌ Π·Π°ΠΏΡΠΎΡΠ΅ ΠΏΠ΅ΡΠ΅Π΄Π°ΡΡΡΡ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΡ ΠΎ ΡΠΈΡΡΠ΅ΠΌΠ΅ (ΠΊΠ°ΠΊ ΠΌΠΈΠ½ΠΈΠΌΡΠΌ, Π°ΡΡ
ΠΈΡΠ΅ΠΊΡΡΡΠ°, ΡΡΠΎΠ±Ρ ΠΎΡΠ΄Π°ΡΡ Π½ΡΠΆΠ½ΡΡ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΡ), Π° Π² ΠΎΡΠ²Π΅Ρ Π½Π° Π½Π΅Π³ΠΎ Π±ΡΠ°ΡΠ·Π΅Ρ ΠΏΠΎΠ»ΡΡΠ°Π΅Ρ Π½Π΅ΠΊΡΡ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΡ ΠΎ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠ΅, ΠΊΠΎΡΠΎΡΡΡ Π½ΡΠΆΠ½ΠΎ ΡΠΊΠ°ΡΠ°ΡΡ: Π°Π΄ΡΠ΅Ρ ΠΈ, Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ, ΡΡΠΎ-ΡΠΎ Π΅ΡΡ. ΠΡΠΎΠ±Π»Π΅ΠΌΠ° Π² ΡΠΎΠΌ, ΡΡΠΎ Π·Π°ΠΏΡΠΎΡ ΡΡΠΎΡ Π·Π°ΡΠΈΡΡΠΎΠ²Π°Π½.
Π€ΡΠ°Π³ΠΌΠ΅Π½Ρ Π·Π°ΠΏΡΠΎΡΠ°
Π€ΡΠ°Π³ΠΌΠ΅Π½Ρ ΠΎΡΠ²Π΅ΡΠ°
Π‘Π°ΠΌΠ° Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠ° ΡΠΏΠ°ΠΊΠΎΠ²Π°Π½Π° Π² ZIP ΠΈ Π½Π΅ Π·Π°ΡΠΈΡΡΠΎΠ²Π°Π½Π°.
ΠΠΎΠΈΡΠΊ ΠΊΠΎΠ΄Π° ΡΠ°ΡΡΠΈΡΡΠΎΠ²ΠΊΠΈ ΡΡΠ°ΡΠΈΠΊΠ°
ΠΠΎΠΏΡΠΎΠ±ΡΠ΅ΠΌ ΡΠ°ΡΡΠΈΡΡΠΎΠ²Π°ΡΡ ΠΎΡΠ²Π΅Ρ ΡΠ΅ΡΠ²Π΅ΡΠ°. Π‘ΠΌΠΎΡΡΠΈΠΌ ΠΊΠΎΠ΄ ΠΊΠ»Π°ΡΡΠ° com.uc.deployment.UpgradeDeployService: ΠΈΠ· ΠΌΠ΅ΡΠΎΠ΄Π° onStartCommand ΠΏΠ΅ΡΠ΅Ρ ΠΎΠ΄ΠΈΠΌ Π² com.uc.deployment.b.x, Π° ΠΈΠ· Π½Π΅Π³ΠΎ Π² com.uc.browser.core.d.c.f.e:
public final void e(l arg9) {
int v4_5;
String v3_1;
byte[] v3;
byte[] v1 = null;
if(arg9 == null) {
v3 = v1;
}
else {
v3_1 = arg9.iGX.ipR;
StringBuilder v4 = new StringBuilder("[");
v4.append(v3_1);
v4.append("]product:");
v4.append(arg9.iGX.ipR);
v4 = new StringBuilder("[");
v4.append(v3_1);
v4.append("]version:");
v4.append(arg9.iGX.iEn);
v4 = new StringBuilder("[");
v4.append(v3_1);
v4.append("]upgrade_type:");
v4.append(arg9.iGX.mMode);
v4 = new StringBuilder("[");
v4.append(v3_1);
v4.append("]force_flag:");
v4.append(arg9.iGX.iEo);
v4 = new StringBuilder("[");
v4.append(v3_1);
v4.append("]silent_mode:");
v4.append(arg9.iGX.iDQ);
v4 = new StringBuilder("[");
v4.append(v3_1);
v4.append("]silent_type:");
v4.append(arg9.iGX.iEr);
v4 = new StringBuilder("[");
v4.append(v3_1);
v4.append("]silent_state:");
v4.append(arg9.iGX.iEp);
v4 = new StringBuilder("[");
v4.append(v3_1);
v4.append("]silent_file:");
v4.append(arg9.iGX.iEq);
v4 = new StringBuilder("[");
v4.append(v3_1);
v4.append("]apk_md5:");
v4.append(arg9.iGX.iEl);
v4 = new StringBuilder("[");
v4.append(v3_1);
v4.append("]download_type:");
v4.append(arg9.mDownloadType);
v4 = new StringBuilder("[");
v4.append(v3_1);
v4.append("]download_group:");
v4.append(arg9.mDownloadGroup);
v4 = new StringBuilder("[");
v4.append(v3_1);
v4.append("]download_path:");
v4.append(arg9.iGH);
v4 = new StringBuilder("[");
v4.append(v3_1);
v4.append("]apollo_child_version:");
v4.append(arg9.iGX.iEx);
v4 = new StringBuilder("[");
v4.append(v3_1);
v4.append("]apollo_series:");
v4.append(arg9.iGX.iEw);
v4 = new StringBuilder("[");
v4.append(v3_1);
v4.append("]apollo_cpu_arch:");
v4.append(arg9.iGX.iEt);
v4 = new StringBuilder("[");
v4.append(v3_1);
v4.append("]apollo_cpu_vfp3:");
v4.append(arg9.iGX.iEv);
v4 = new StringBuilder("[");
v4.append(v3_1);
v4.append("]apollo_cpu_vfp:");
v4.append(arg9.iGX.iEu);
ArrayList v3_2 = arg9.iGX.iEz;
if(v3_2 != null && v3_2.size() != 0) {
Iterator v3_3 = v3_2.iterator();
while(v3_3.hasNext()) {
Object v4_1 = v3_3.next();
StringBuilder v5 = new StringBuilder("[");
v5.append(((au)v4_1).getName());
v5.append("]component_name:");
v5.append(((au)v4_1).getName());
v5 = new StringBuilder("[");
v5.append(((au)v4_1).getName());
v5.append("]component_ver_name:");
v5.append(((au)v4_1).aDA());
v5 = new StringBuilder("[");
v5.append(((au)v4_1).getName());
v5.append("]component_ver_code:");
v5.append(((au)v4_1).gBl);
v5 = new StringBuilder("[");
v5.append(((au)v4_1).getName());
v5.append("]component_req_type:");
v5.append(((au)v4_1).gBq);
}
}
j v3_4 = new j();
m.b(v3_4);
h v4_2 = new h();
m.b(v4_2);
ay v5_1 = new ay();
v3_4.hS("");
v3_4.setImsi("");
v3_4.hV("");
v5_1.bPQ = v3_4;
v5_1.bPP = v4_2;
v5_1.yr(arg9.iGX.ipR);
v5_1.gBF = arg9.iGX.mMode;
v5_1.gBI = arg9.iGX.iEz;
v3_2 = v5_1.gAr;
c.aBh();
v3_2.add(g.fs("os_ver", c.getRomInfo()));
v3_2.add(g.fs("processor_arch", com.uc.b.a.a.c.getCpuArch()));
v3_2.add(g.fs("cpu_arch", com.uc.b.a.a.c.Pb()));
String v4_3 = com.uc.b.a.a.c.Pd();
v3_2.add(g.fs("cpu_vfp", v4_3));
v3_2.add(g.fs("net_type", String.valueOf(com.uc.base.system.a.Jo())));
v3_2.add(g.fs("fromhost", arg9.iGX.iEm));
v3_2.add(g.fs("plugin_ver", arg9.iGX.iEn));
v3_2.add(g.fs("target_lang", arg9.iGX.iEs));
v3_2.add(g.fs("vitamio_cpu_arch", arg9.iGX.iEt));
v3_2.add(g.fs("vitamio_vfp", arg9.iGX.iEu));
v3_2.add(g.fs("vitamio_vfp3", arg9.iGX.iEv));
v3_2.add(g.fs("plugin_child_ver", arg9.iGX.iEx));
v3_2.add(g.fs("ver_series", arg9.iGX.iEw));
v3_2.add(g.fs("child_ver", r.aVw()));
v3_2.add(g.fs("cur_ver_md5", arg9.iGX.iEl));
v3_2.add(g.fs("cur_ver_signature", SystemHelper.getUCMSignature()));
v3_2.add(g.fs("upgrade_log", i.bjt()));
v3_2.add(g.fs("silent_install", String.valueOf(arg9.iGX.iDQ)));
v3_2.add(g.fs("silent_state", String.valueOf(arg9.iGX.iEp)));
v3_2.add(g.fs("silent_file", arg9.iGX.iEq));
v3_2.add(g.fs("silent_type", String.valueOf(arg9.iGX.iEr)));
v3_2.add(g.fs("cpu_archit", com.uc.b.a.a.c.Pc()));
v3_2.add(g.fs("cpu_set", SystemHelper.getCpuInstruction()));
boolean v4_4 = v4_3 == null || !v4_3.contains("neon") ? false : true;
v3_2.add(g.fs("neon", String.valueOf(v4_4)));
v3_2.add(g.fs("cpu_cores", String.valueOf(com.uc.b.a.a.c.Jl())));
v3_2.add(g.fs("ram_1", String.valueOf(com.uc.b.a.a.h.Po())));
v3_2.add(g.fs("totalram", String.valueOf(com.uc.b.a.a.h.OL())));
c.aBh();
v3_2.add(g.fs("rom_1", c.getRomInfo()));
v4_5 = e.getScreenWidth();
int v6 = e.getScreenHeight();
StringBuilder v7 = new StringBuilder();
v7.append(v4_5);
v7.append("*");
v7.append(v6);
v3_2.add(g.fs("ss", v7.toString()));
v3_2.add(g.fs("api_level", String.valueOf(Build$VERSION.SDK_INT)));
v3_2.add(g.fs("uc_apk_list", SystemHelper.getUCMobileApks()));
Iterator v4_6 = arg9.iGX.iEA.entrySet().iterator();
while(v4_6.hasNext()) {
Object v6_1 = v4_6.next();
v3_2.add(g.fs(((Map$Entry)v6_1).getKey(), ((Map$Entry)v6_1).getValue()));
}
v3 = v5_1.toByteArray();
}
if(v3 == null) {
this.iGY.iGI.a(arg9, "up_encode", "yes", "fail");
return;
}
v4_5 = this.iGY.iGw ? 0x1F : 0;
if(v3 == null) {
}
else {
v3 = g.i(v4_5, v3);
if(v3 == null) {
}
else {
v1 = new byte[v3.length + 16];
byte[] v6_2 = new byte[16];
Arrays.fill(v6_2, 0);
v6_2[0] = 0x5F;
v6_2[1] = 0;
v6_2[2] = ((byte)v4_5);
v6_2[3] = -50;
System.arraycopy(v6_2, 0, v1, 0, 16);
System.arraycopy(v3, 0, v1, 16, v3.length);
}
}
if(v1 == null) {
this.iGY.iGI.a(arg9, "up_encrypt", "yes", "fail");
return;
}
if(TextUtils.isEmpty(this.iGY.mUpgradeUrl)) {
this.iGY.iGI.a(arg9, "up_url", "yes", "fail");
return;
}
StringBuilder v0 = new StringBuilder("[");
v0.append(arg9.iGX.ipR);
v0.append("]url:");
v0.append(this.iGY.mUpgradeUrl);
com.uc.browser.core.d.c.i v0_1 = this.iGY.iGI;
v3_1 = this.iGY.mUpgradeUrl;
com.uc.base.net.e v0_2 = new com.uc.base.net.e(new com.uc.browser.core.d.c.i$a(v0_1, arg9));
v3_1 = v3_1.contains("?") ? v3_1 + "&dataver=pb" : v3_1 + "?dataver=pb";
n v3_5 = v0_2.uc(v3_1);
m.b(v3_5, false);
v3_5.setMethod("POST");
v3_5.setBodyProvider(v1);
v0_2.b(v3_5);
this.iGY.iGI.a(arg9, "up_null", "yes", "success");
this.iGY.iGI.b(arg9);
}
ΠΠΈΠ΄ΠΈΠΌ ΡΡΡ ΡΠΎΡΠΌΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅ POST-Π·Π°ΠΏΡΠΎΡΠ°. ΠΠ±ΡΠ°ΡΠ°Π΅ΠΌ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅ Π½Π° ΡΠΎΠ·Π΄Π°Π½ΠΈΠ΅ ΠΌΠ°ΡΡΠΈΠ²Π° ΠΈΠ· 16 Π±Π°ΠΉΡ ΠΈ Π΅Π³ΠΎ Π·Π°ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅: 0x5F, 0, 0x1F, -50 (=0xCE). Π‘ΠΎΠ²ΠΏΠ°Π΄Π°Π΅Ρ Ρ ΡΠ΅ΠΌ, ΡΡΠΎ ΠΌΡ Π²ΠΈΠ΄Π΅Π»ΠΈ Π² Π·Π°ΠΏΡΠΎΡΠ΅ Π²ΡΡΠ΅.
Π ΡΡΠΎΠΌ ΠΆΠ΅ ΠΊΠ»Π°ΡΡΠ΅ ΠΌΠΎΠΆΠ½ΠΎ Π·Π°ΠΌΠ΅ΡΠΈΡΡ Π²Π»ΠΎΠΆΠ΅Π½Π½ΡΠΉ ΠΊΠ»Π°ΡΡ, Π² ΠΊΠΎΡΠΎΡΠΎΠΌ Π΅ΡΡΡ Π΄ΡΡΠ³ΠΎΠΉ ΠΈΠ½ΡΠ΅ΡΠ΅ΡΠ½ΡΠΉ ΠΌΠ΅ΡΠΎΠ΄:
public final void a(l arg10, byte[] arg11) {
f v0 = this.iGQ;
StringBuilder v1 = new StringBuilder("[");
v1.append(arg10.iGX.ipR);
v1.append("]:UpgradeSuccess");
byte[] v1_1 = null;
if(arg11 == null) {
}
else if(arg11.length < 16) {
}
else {
if(arg11[0] != 0x60 && arg11[3] != 0xFFFFFFD0) {
goto label_57;
}
int v3 = 1;
int v5 = arg11[1] == 1 ? 1 : 0;
if(arg11[2] != 1 && arg11[2] != 11) {
if(arg11[2] == 0x1F) {
}
else {
v3 = 0;
}
}
byte[] v7 = new byte[arg11.length - 16];
System.arraycopy(arg11, 16, v7, 0, v7.length);
if(v3 != 0) {
v7 = g.j(arg11[2], v7);
}
if(v7 == null) {
goto label_57;
}
if(v5 != 0) {
v1_1 = g.P(v7);
goto label_57;
}
v1_1 = v7;
}
label_57:
if(v1_1 == null) {
v0.iGY.iGI.a(arg10, "up_decrypt", "yes", "fail");
return;
}
q v11 = g.b(arg10, v1_1);
if(v11 == null) {
v0.iGY.iGI.a(arg10, "up_decode", "yes", "fail");
return;
}
if(v0.iGY.iGt) {
v0.d(arg10);
}
if(v0.iGY.iGo != null) {
v0.iGY.iGo.a(0, ((o)v11));
}
if(v0.iGY.iGs) {
v0.iGY.a(((o)v11));
v0.iGY.iGI.a(v11, "up_silent", "yes", "success");
v0.iGY.iGI.a(v11);
return;
}
v0.iGY.iGI.a(v11, "up_silent", "no", "success");
}
}
ΠΠ΅ΡΠΎΠ΄ ΠΏΠΎΠ»ΡΡΠ°Π΅Ρ Π½Π° Π²Ρ
ΠΎΠ΄ ΠΌΠ°ΡΡΠΈΠ² Π±Π°ΠΉΡΠΎΠ² ΠΈ ΠΏΡΠΎΠ²Π΅ΡΡΠ΅Ρ, ΡΡΠΎ Π½ΡΠ»Π΅Π²ΠΎΠΉ Π±Π°ΠΉΡ ΡΠ°Π²Π΅Π½ 0x60 ΠΈΠ»ΠΈ ΡΡΠ΅ΡΠΈΠΉ Π±Π°ΠΉΡ ΡΠ°Π²Π΅Π½ 0xD0, Π° Π²ΡΠΎΡΠΎΠΉ Π±Π°ΠΉΡ β 1, 11 ΠΈΠ»ΠΈ 0x1F. Π‘ΠΌΠΎΡΡΠΈΠΌ ΠΎΡΠ²Π΅Ρ ΠΎΡ ΡΠ΅ΡΠ²Π΅ΡΠ°: Π½ΡΠ»Π΅Π²ΠΎΠΉ Π±Π°ΠΉΡ β 0x60, Π²ΡΠΎΡΠΎΠΉ β 0x1F, ΡΡΠ΅ΡΠΈΠΉ β 0x60. ΠΠΎΡ
ΠΎΠΆΠ΅ Π½Π° ΡΠΎ, ΡΡΠΎ Π½Π°ΠΌ Π½ΡΠΆΠ½ΠΎ. Π‘ΡΠ΄Ρ ΠΏΠΎ ΡΡΡΠΎΡΠΊΠ°ΠΌ (Β«up_decryptΒ», Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ), ΡΡΡ Π΄ΠΎΠ»ΠΆΠ΅Π½ Π²ΡΠ·ΡΠ²Π°ΡΡΡΡ ΠΌΠ΅ΡΠΎΠ΄, ΠΊΠΎΡΠΎΡΡΠΉ ΡΠ°ΡΡΠΈΡΡΡΠ΅Ρ ΠΎΡΠ²Π΅Ρ ΡΠ΅ΡΠ²Π΅ΡΠ°.
ΠΠ΅ΡΠ΅Ρ
ΠΎΠ΄ΠΈΠΌ ΠΊ ΠΌΠ΅ΡΠΎΠ΄Ρ g.j. ΠΠ°ΠΌΠ΅ΡΠΈΠΌ, ΡΡΠΎ Π² ΠΊΠ°ΡΠ΅ΡΡΠ²Π΅ ΠΏΠ΅ΡΠ²ΠΎΠ³ΠΎ Π°ΡΠ³ΡΠΌΠ΅Π½ΡΠ° Π² Π½Π΅Π³ΠΎ ΠΏΠ΅ΡΠ΅Π΄Π°ΡΡΡΡ Π±Π°ΠΉΡ ΠΏΠΎ ΡΠΌΠ΅ΡΠ΅Π½ΠΈΡ 2 (Ρ. Π΅. 0x1F Π² Π½Π°ΡΠ΅ΠΌ ΡΠ»ΡΡΠ°Π΅), Π° Π² ΠΊΠ°ΡΠ΅ΡΡΠ²Π΅ Π²ΡΠΎΡΠΎΠ³ΠΎ β ΠΎΡΠ²Π΅Ρ ΡΠ΅ΡΠ²Π΅ΡΠ° Π±Π΅Π·
ΠΏΠ΅ΡΠ²ΡΡ
16 Π±Π°ΠΉΡ.
public static byte[] j(int arg1, byte[] arg2) {
if(arg1 == 1) {
arg2 = c.c(arg2, c.adu);
}
else if(arg1 == 11) {
arg2 = m.aF(arg2);
}
else if(arg1 != 0x1F) {
}
else {
arg2 = EncryptHelper.decrypt(arg2);
}
return arg2;
}
ΠΡΠ΅Π²ΠΈΠ΄Π½ΠΎ, ΡΡΡ ΠΏΡΠΎΠΈΡΡ
ΠΎΠ΄ΠΈΡ Π²ΡΠ±ΠΎΡ Π°Π»Π³ΠΎΡΠΈΡΠΌΠ° ΡΠ°ΡΡΠΈΡΡΠΎΠ²ΠΊΠΈ, ΠΈ ΡΠΎΡ ΡΠ°ΠΌΡΠΉ Π±Π°ΠΉΡ, ΠΊΠΎΡΠΎΡΡΠΉ Π² Π½Π°ΡΠ΅ΠΌ
ΡΠ»ΡΡΠ°Π΅ ΡΠ°Π²Π΅Π½ 0x1F, ΠΎΠ±ΠΎΠ·Π½Π°ΡΠ°Π΅Ρ ΠΎΠ΄ΠΈΠ½ ΠΈΠ· ΡΡΡΡ
Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΡΡ
Π²Π°ΡΠΈΠ°Π½ΡΠΎΠ².
ΠΡΠΎΠ΄ΠΎΠ»ΠΆΠ°Π΅ΠΌ Π°Π½Π°Π»ΠΈΠ· ΠΊΠΎΠ΄Π°. ΠΠΎΡΠ»Π΅ ΠΏΠ°ΡΡ ΠΏΡΡΠΆΠΊΠΎΠ² ΠΏΠΎΠΏΠ°Π΄Π°Π΅ΠΌ Π² ΠΌΠ΅ΡΠΎΠ΄ Ρ Π³ΠΎΠ²ΠΎΡΡΡΠΈΠΌ Π½Π°Π·Π²Π°Π½ΠΈΠ΅ΠΌ decryptBytesByKey.
Π’ΡΡ ΠΎΡ Π½Π°ΡΠ΅Π³ΠΎ ΠΎΡΠ²Π΅ΡΠ° ΠΎΡΠ΄Π΅Π»ΡΠ΅ΡΡΡ Π΅ΡΡ Π΄Π²Π° Π±Π°ΠΉΡΠ°, ΠΈ ΠΈΠ· Π½ΠΈΡ ΠΏΠΎΠ»ΡΡΠ°Π΅ΡΡΡ ΡΡΡΠΎΠΊΠ°. ΠΠΎΠ½ΡΡΠ½ΠΎ, ΡΡΠΎ ΡΠ°ΠΊΠΈΠΌ ΡΠΏΠΎΡΠΎΠ±ΠΎΠΌ Π²ΡΠ±ΠΈΡΠ°Π΅ΡΡΡ ΠΊΠ»ΡΡ Π΄Π»Ρ ΡΠ°ΡΡΠΈΡΡΠΎΠ²ΠΊΠΈ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΡ.
private static byte[] decryptBytesByKey(byte[] bytes) {
byte[] v0 = null;
if(bytes != null) {
try {
if(bytes.length < EncryptHelper.PREFIX_BYTES_SIZE) {
}
else if(bytes.length == EncryptHelper.PREFIX_BYTES_SIZE) {
return v0;
}
else {
byte[] prefix = new byte[EncryptHelper.PREFIX_BYTES_SIZE]; // 2 Π±Π°ΠΉΡΠ°
System.arraycopy(bytes, 0, prefix, 0, prefix.length);
String keyId = c.ayR().d(ByteBuffer.wrap(prefix).getShort()); // ΠΡΠ±ΠΎΡ ΠΊΠ»ΡΡΠ°
if(keyId == null) {
return v0;
}
else {
a v2 = EncryptHelper.ayL();
if(v2 == null) {
return v0;
}
else {
byte[] enrypted = new byte[bytes.length - EncryptHelper.PREFIX_BYTES_SIZE];
System.arraycopy(bytes, EncryptHelper.PREFIX_BYTES_SIZE, enrypted, 0, enrypted.length);
return v2.l(keyId, enrypted);
}
}
}
}
catch(SecException v7_1) {
EncryptHelper.handleDecryptException(((Throwable)v7_1), v7_1.getErrorCode());
return v0;
}
catch(Throwable v7) {
EncryptHelper.handleDecryptException(v7, 2);
return v0;
}
}
return v0;
}
ΠΠ°Π±Π΅Π³Π°Ρ Π²ΠΏΠ΅ΡΡΠ΄, ΠΎΡΠΌΠ΅ΡΠΈΠΌ, ΡΡΠΎ Π½Π° ΡΡΠΎΠΌ ΡΡΠ°ΠΏΠ΅ ΠΏΠΎΠ»ΡΡΠ°Π΅ΡΡΡ Π΅ΡΡ Π½Π΅ ΠΊΠ»ΡΡ, Π° ΡΠΎΠ»ΡΠΊΠΎ Π΅Π³ΠΎ Β«ΠΈΠ΄Π΅Π½ΡΠΈΡΠΈΠΊΠ°ΡΠΎΡΒ». Π‘ ΠΏΠΎΠ»ΡΡΠ΅Π½ΠΈΠ΅ΠΌ ΠΊΠ»ΡΡΠ° Π²ΡΡ Π½Π΅ΠΌΠ½ΠΎΠ³ΠΎ ΡΠ»ΠΎΠΆΠ½Π΅Π΅.
Π ΡΠ»Π΅Π΄ΡΡΡΠ΅ΠΌ ΠΌΠ΅ΡΠΎΠ΄Π΅ ΠΊ ΠΈΠΌΠ΅ΡΡΠΈΠΌΡΡ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠ°ΠΌ Π΄ΠΎΠ±Π°Π²Π»ΡΠ΅ΡΡΡ Π΅ΡΡ Π΄Π²Π°, ΠΈ ΠΈΡ ΡΡΠ°Π½ΠΎΠ²ΠΈΡΡΡ ΡΠ΅ΡΡΡΠ΅: Π²ΠΎΠ»ΡΠ΅Π±Π½ΠΎΠ΅ ΡΠΈΡΠ»ΠΎ 16, ΠΈΠ΄Π΅Π½ΡΠΈΡΠΈΠΊΠ°ΡΠΎΡ ΠΊΠ»ΡΡΠ°, Π·Π°ΡΠΈΡΡΠΎΠ²Π°Π½Π½ΡΠ΅ Π΄Π°Π½Π½ΡΠ΅ ΠΈ Π½Π΅ΠΏΠΎΠ½ΡΡΠ½Π°Ρ ΡΡΡΠΎΠΊΠ° (Π² Π½Π°ΡΠ΅ΠΌ ΡΠ»ΡΡΠ°Π΅ ΠΏΡΡΡΠ°Ρ).
public final byte[] l(String keyId, byte[] encrypted) throws SecException {
return this.ayJ().staticBinarySafeDecryptNoB64(16, keyId, encrypted, "");
}
ΠΠΎΡΠ»Π΅ ΡΠ΅ΡΠΈΠΈ ΠΏΠ΅ΡΠ΅Ρ ΠΎΠ΄ΠΎΠ² ΠΏΡΠΈΡ ΠΎΠ΄ΠΈΠΌ ΠΊ ΠΌΠ΅ΡΠΎΠ΄Ρ staticBinarySafeDecryptNoB64 ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡΠ° com.alibaba.wireless.security.open.staticdataencrypt.IStaticDataEncryptComponent. Π ΠΎΡΠ½ΠΎΠ²Π½ΠΎΠΌ ΠΊΠΎΠ΄Π΅ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ Π½Π΅Ρ ΠΊΠ»Π°ΡΡΠΎΠ², ΡΠ΅Π°Π»ΠΈΠ·ΡΡΡΠΈΡ ΡΡΠΎΡ ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡ. Π’Π°ΠΊΠΎΠΉ ΠΊΠ»Π°ΡΡ Π΅ΡΡΡ Π² ΡΠ°ΠΉΠ»Π΅ lib/armeabi-v7a/libsgmain.so, ΠΊΠΎΡΠΎΡΡΠΉ Π½Π° ΡΠ°ΠΌΠΎΠΌ Π΄Π΅Π»Π΅ Π½Π΅ .so, Π° .jar. ΠΠ½ΡΠ΅ΡΠ΅ΡΡΡΡΠΈΠΉ Π½Π°Ρ ΠΌΠ΅ΡΠΎΠ΄ ΡΠ΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½ ΡΠ»Π΅Π΄ΡΡΡΠΈΠΌ ΠΎΠ±ΡΠ°Π·ΠΎΠΌ:
package com.alibaba.wireless.security.a.i;
// ...
public class a implements IStaticDataEncryptComponent {
private ISecurityGuardPlugin a;
// ...
private byte[] a(int mode, int magicInt, int xzInt, String keyId, byte[] encrypted, String magicString) {
return this.a.getRouter().doCommand(10601, new Object[]{Integer.valueOf(mode), Integer.valueOf(magicInt), Integer.valueOf(xzInt), keyId, encrypted, magicString});
}
// ...
private byte[] b(int magicInt, String keyId, byte[] encrypted, String magicString) {
return this.a(2, magicInt, 0, keyId, encrypted, magicString);
}
// ...
public byte[] staticBinarySafeDecryptNoB64(int magicInt, String keyId, byte[] encrypted, String magicString) throws SecException {
if(keyId != null && keyId.length() > 0 && magicInt >= 0 && magicInt < 19 && encrypted != null && encrypted.length > 0) {
return this.b(magicInt, keyId, encrypted, magicString);
}
throw new SecException("", 301);
}
//...
}
Π’ΡΡ Π½Π°Ρ ΡΠΏΠΈΡΠΎΠΊ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠΎΠ² Π΄ΠΎΠΏΠΎΠ»Π½ΡΠ΅ΡΡΡ Π΅ΡΡ Π΄Π²ΡΠΌΡ ΡΠ΅Π»ΡΠΌΠΈ ΡΠΈΡΠ»Π°ΠΌΠΈ: 2 ΠΈ 0. Π‘ΡΠ΄Ρ ΠΏΠΎ
Π²ΡΠ΅ΠΌΡ, 2 ΠΎΠ·Π½Π°ΡΠ°Π΅Ρ ΡΠ°ΡΡΠΈΡΡΠΎΠ²ΠΊΡ, ΠΊΠ°ΠΊ Π² ΠΌΠ΅ΡΠΎΠ΄Π΅ doFinal ΡΠΈΡΡΠ΅ΠΌΠ½ΠΎΠ³ΠΎ ΠΊΠ»Π°ΡΡΠ° javax.crypto.Cipher. Π Π²ΡΡ ΡΡΠΎ ΠΏΠ΅ΡΠ΅Π΄Π°ΡΡΡΡ Π² Π½Π΅ΠΊΠΈΠΉ Router Ρ ΡΠΈΡΠ»ΠΎΠΌ 10601 β ΡΡΠΎ, Π²ΠΈΠ΄ΠΈΠΌΠΎ, Π½ΠΎΠΌΠ΅Ρ ΠΊΠΎΠΌΠ°Π½Π΄Ρ.
ΠΠΎΡΠ»Π΅ ΠΎΡΠ΅ΡΠ΅Π΄Π½ΠΎΠΉ ΡΠ΅ΠΏΠΎΡΠΊΠΈ ΠΏΠ΅ΡΠ΅Ρ ΠΎΠ΄ΠΎΠ² Π½Π°Ρ ΠΎΠ΄ΠΈΠΌ ΠΊΠ»Π°ΡΡ, ΠΊΠΎΡΠΎΡΡΠΉ ΡΠ΅Π°Π»ΠΈΠ·ΡΠ΅Ρ ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡ IRouterComponent ΠΈ ΠΌΠ΅ΡΠΎΠ΄ doCommand:
package com.alibaba.wireless.security.mainplugin;
import com.alibaba.wireless.security.framework.IRouterComponent;
import com.taobao.wireless.security.adapter.JNICLibrary;
public class a implements IRouterComponent {
public a() {
super();
}
public Object doCommand(int arg2, Object[] arg3) {
return JNICLibrary.doCommandNative(arg2, arg3);
}
}
Π ΡΠ°ΠΊΠΆΠ΅ ΠΊΠ»Π°ΡΡ JNICLibrary, Π² ΠΊΠΎΡΠΎΡΠΎΠΌ ΠΎΠ±ΡΡΠ²Π»Π΅Π½ Π½Π°ΡΠΈΠ²Π½ΡΠΉ ΠΌΠ΅ΡΠΎΠ΄ doCommandNative:
package com.taobao.wireless.security.adapter;
public class JNICLibrary {
public static native Object doCommandNative(int arg0, Object[] arg1);
}
ΠΠ½Π°ΡΠΈΡ, Π½Π°ΠΌ Π½ΡΠΆΠ½ΠΎ Π² Π½Π°ΡΠΈΠ²Π½ΠΎΠΌ ΠΊΠΎΠ΄Π΅ Π½Π°ΠΉΡΠΈ ΠΌΠ΅ΡΠΎΠ΄ doCommandNative. Π ΡΡΡ Π½Π°ΡΠΈΠ½Π°Π΅ΡΡΡ ΡΠ°ΠΌΠΎΠ΅ Π²Π΅ΡΠ΅Π»ΡΠ΅.
ΠΠ±ΡΡΡΠΊΠ°ΡΠΈΡ ΠΌΠ°ΡΠΈΠ½Π½ΠΎΠ³ΠΎ ΠΊΠΎΠ΄Π°
Π ΡΠ°ΠΉΠ»Π΅ libsgmain.so (ΠΊΠΎΡΠΎΡΡΠΉ Π½Π° ΡΠ°ΠΌΠΎΠΌ Π΄Π΅Π»Π΅ .jar ΠΈ Π² ΠΊΠΎΡΠΎΡΠΎΠΌ ΠΌΡ ΡΡΡΡ Π²ΡΡΠ΅ Π½Π°ΡΠ»ΠΈ ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΡ Π½Π΅ΠΊΠΎΡΠΎΡΡΡ ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡΠΎΠ², ΡΠ²ΡΠ·Π°Π½Π½ΡΡ Ρ ΡΠΈΡΡΠΎΠ²Π°Π½ΠΈΠ΅ΠΌ) Π΅ΡΡΡ ΠΎΠ΄Π½Π° Π½Π°ΡΠΈΠ²Π½Π°Ρ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠ°: libsgmainso-6.4.36.so. ΠΡΠΊΡΡΠ²Π°Π΅ΠΌ Π΅Ρ Π² IDA ΠΈ ΠΏΠΎΠ»ΡΡΠ°Π΅ΠΌ ΠΊΡΡΡ Π΄ΠΈΠ°Π»ΠΎΠ³ΠΎΠ²ΡΡ ΠΎΠΊΠΎΠ½ Ρ ΠΎΡΠΈΠ±ΠΊΠ°ΠΌΠΈ. ΠΡΠΎΠ±Π»Π΅ΠΌΠ° Π² ΡΠΎΠΌ, ΡΡΠΎ ΡΠ°Π±Π»ΠΈΡΠ° ΡΠ΅ΠΊΡΠΈΠΉ (section header table) β Π½Π΅Π²Π°Π»ΠΈΠ΄Π½Π°Ρ. ΠΡΠΎ ΡΠ΄Π΅Π»Π°Π½ΠΎ ΡΠΏΠ΅ΡΠΈΠ°Π»ΡΠ½ΠΎ, ΡΡΠΎΠ±Ρ ΡΡΠ»ΠΎΠΆΠ½ΠΈΡΡ Π°Π½Π°Π»ΠΈΠ·.
ΠΠΎ ΠΎΠ½Π° ΠΈ Π½Π΅ Π½ΡΠΆΠ½Π°: ΡΡΠΎΠ±Ρ ΠΊΠΎΡΡΠ΅ΠΊΡΠ½ΠΎ Π·Π°Π³ΡΡΠ·ΠΈΡΡ ELF-ΡΠ°ΠΉΠ» ΠΈ ΠΏΡΠΎΠ°Π½Π°Π»ΠΈΠ·ΠΈΡΠΎΠ²Π°ΡΡ Π΅Π³ΠΎ, Π²ΠΏΠΎΠ»Π½Π΅ Π΄ΠΎΡΡΠ°ΡΠΎΡΠ½ΠΎ ΡΠ°Π±Π»ΠΈΡΡ ΡΠ΅Π³ΠΌΠ΅Π½ΡΠΎΠ² (program header table). ΠΠΎΡΡΠΎΠΌΡ ΠΏΡΠΎΡΡΠΎ ΡΠ΄Π°Π»ΡΠ΅ΠΌ ΡΠ°Π±Π»ΠΈΡΡ ΡΠ΅ΠΊΡΠΈΠΉ, Π·Π°Π½ΡΠ»ΡΡ ΡΠΎΠΎΡΠ²Π΅ΡΡΡΠ²ΡΡΡΠΈΠ΅ ΠΏΠΎΠ»Ρ Π² Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΊΠ΅.
Π‘Π½ΠΎΠ²Π° ΠΎΡΠΊΡΡΠ²Π°Π΅ΠΌ ΡΠ°ΠΉΠ» Π² IDA.
ΠΡΡΡ Π΄Π²Π° ΡΠΏΠΎΡΠΎΠ±Π° ΡΠΎΠΎΠ±ΡΠΈΡΡ Π²ΠΈΡΡΡΠ°Π»ΡΠ½ΠΎΠΉ Java-ΠΌΠ°ΡΠΈΠ½Π΅, Π³Π΄Π΅ ΠΈΠΌΠ΅Π½Π½ΠΎ Π² Π½Π°ΡΠΈΠ²Π½ΠΎΠΉ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠ΅ Π½Π°Ρ ΠΎΠ΄ΠΈΡΡΡ ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΡ ΠΌΠ΅ΡΠΎΠ΄Π°, ΠΎΠ±ΡΡΠ²Π»Π΅Π½Π½ΠΎΠ³ΠΎ Π² Java-ΠΊΠΎΠ΄Π΅ ΠΊΠ°ΠΊ native. ΠΠ΅ΡΠ²ΡΠΉ β Π΄Π°ΡΡ Π΅ΠΌΡ ΠΈΠΌΡ Π²ΠΈΠ΄Π° Java_ΠΈΠΌΡ_ΠΏΠ°ΠΊΠ΅ΡΠ°_ΠΠΌΡΠΠ»Π°ΡΡΠ°_ΠΈΠΌΡΠΠ΅ΡΠΎΠ΄Π°.
ΠΡΠΎΡΠΎΠΉ β Π·Π°ΡΠ΅Π³ΠΈΡΡΡΠΈΡΠΎΠ²Π°ΡΡ Π΅Π³ΠΎ ΠΏΡΠΈ Π·Π°Π³ΡΡΠ·ΠΊΠ΅ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠΈ (Π² ΡΡΠ½ΠΊΡΠΈΠΈ JNI_OnLoad)
Ρ ΠΏΠΎΠΌΠΎΡΡΡ Π²ΡΠ·ΠΎΠ²Π° ΡΡΠ½ΠΊΡΠΈΠΈ RegisterNatives.
Π Π½Π°ΡΠ΅ΠΌ ΡΠ»ΡΡΠ°Π΅, Π΅ΡΠ»ΠΈ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ ΠΏΠ΅ΡΠ²ΡΠΉ ΡΠΏΠΎΡΠΎΠ±, ΠΈΠΌΡ Π΄ΠΎΠ»ΠΆΠ½ΠΎ Π±ΡΡΡ ΡΠ°ΠΊΠΈΠΌ: Java_com_taobao_wireless_security_adapter_JNICLibrary_doCommandNative.
Π‘ΡΠ΅Π΄ΠΈ ΡΠΊΡΠΏΠΎΡΡΠΈΡΡΠ΅ΠΌΡΡ
ΡΡΠ½ΠΊΡΠΈΠΉ ΡΠ°ΠΊΠΎΠΉ Π½Π΅Ρ, Π·Π½Π°ΡΠΈΡ, Π½ΡΠΆΠ½ΠΎ ΠΈΡΠΊΠ°ΡΡ Π²ΡΠ·ΠΎΠ² RegisterNatives.
ΠΠ΄ΡΠΌ Π² ΡΡΠ½ΠΊΡΠΈΡ JNI_OnLoad ΠΈ Π²ΠΈΠ΄ΠΈΠΌ ΡΠ°ΠΊΡΡ ΠΊΠ°ΡΡΠΈΠ½Ρ:
Π§ΡΠΎ ΡΡΡ ΠΏΡΠΎΠΈΡΡ
ΠΎΠ΄ΠΈΡ? ΠΠ° ΠΏΠ΅ΡΠ²ΡΠΉ Π²Π·Π³Π»ΡΠ΄, Π½Π°ΡΠ°Π»ΠΎ ΠΈ ΠΊΠΎΠ½Π΅Ρ ΡΡΠ½ΠΊΡΠΈΠΈ ΡΠΈΠΏΠΈΡΠ½Ρ Π΄Π»Ρ Π°ΡΡ
ΠΈΡΠ΅ΠΊΡΡΡΡ ARM. ΠΠ΅ΡΠ²ΠΎΠΉ ΠΈΠ½ΡΡΡΡΠΊΡΠΈΠ΅ΠΉ Π² ΡΡΠ΅ΠΊ ΡΠΎΡ
ΡΠ°Π½ΡΠ΅ΡΡΡ ΡΠΎΠ΄Π΅ΡΠΆΠΈΠΌΠΎΠ΅ ΡΠ΅Π³ΠΈΡΡΡΠΎΠ², ΠΊΠΎΡΠΎΡΡΠ΅ ΡΡΠ½ΠΊΡΠΈΡ Π±ΡΠ΄Π΅Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ Π² ΡΠ²ΠΎΠ΅ΠΉ ΡΠ°Π±ΠΎΡΠ΅ (Π² Π΄Π°Π½Π½ΠΎΠΌ ΡΠ»ΡΡΠ°Π΅ R0, R1 ΠΈ R2), Π° ΡΠ°ΠΊΠΆΠ΅ ΡΠΎΠ΄Π΅ΡΠΆΠΈΠΌΠΎΠ΅ ΡΠ΅Π³ΠΈΡΡΡΠ° LR, Π² ΠΊΠΎΡΠΎΡΠΎΠΌ Π½Π°Ρ
ΠΎΠ΄ΠΈΡΡΡ Π°Π΄ΡΠ΅Ρ Π²ΠΎΠ·Π²ΡΠ°ΡΠ° ΠΈΠ· ΡΡΠ½ΠΊΡΠΈΠΈ. ΠΠΎΡΠ»Π΅Π΄Π½Π΅ΠΉ ΠΈΠ½ΡΡΡΡΠΊΡΠΈΠ΅ΠΉ ΡΠΎΡ
ΡΠ°Π½ΡΠ½Π½ΡΠ΅ ΡΠ΅Π³ΠΈΡΡΡΡ Π²ΠΎΡΡΡΠ°Π½Π°Π²Π»ΠΈΠ²Π°ΡΡΡΡ, ΠΏΡΠΈΡΡΠΌ Π°Π΄ΡΠ΅Ρ Π²ΠΎΠ·Π²ΡΠ°ΡΠ° ΡΡΠ°Π·Ρ ΠΏΠΎΠΌΠ΅ΡΠ°Π΅ΡΡΡ Π² ΡΠ΅Π³ΠΈΡΡΡ PC β ΡΠ°ΠΊΠΈΠΌ ΠΎΠ±ΡΠ°Π·ΠΎΠΌ ΠΏΡΠΎΠΈΡΡ
ΠΎΠ΄ΠΈΡ Π²ΠΎΠ·Π²ΡΠ°Ρ ΠΈΠ· ΡΡΠ½ΠΊΡΠΈΠΈ. ΠΠΎ Π΅ΡΠ»ΠΈ ΠΏΡΠΈΡΠΌΠΎΡΡΠ΅ΡΡΡΡ, ΠΌΠΎΠΆΠ½ΠΎ Π·Π°ΠΌΠ΅ΡΠΈΡΡ, ΡΡΠΎ ΠΏΡΠ΅Π΄ΠΏΠΎΡΠ»Π΅Π΄Π½ΡΡ ΠΈΠ½ΡΡΡΡΠΊΡΠΈΡ ΠΈΠ·ΠΌΠ΅Π½ΡΠ΅Ρ Π°Π΄ΡΠ΅Ρ Π²ΠΎΠ·Π²ΡΠ°ΡΠ°, ΡΠΎΡ
ΡΠ°Π½ΡΠ½Π½ΡΠΉ Π² ΡΡΠ΅ΠΊΠ΅. ΠΡΡΠΈΡΠ»ΠΈΠΌ, ΠΊΠ°ΠΊΠΈΠΌ ΠΎΠ½ Π±ΡΠ΄Π΅Ρ ΠΏΠΎΡΠ»Π΅
Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΡ ΠΊΠΎΠ΄Π°. Π R1 Π·Π°Π³ΡΡΠΆΠ°Π΅ΡΡΡ Π½Π΅ΠΊΠΈΠΉ Π°Π΄ΡΠ΅Ρ 0xB130, ΠΈΠ· Π½Π΅Π³ΠΎ Π²ΡΡΠΈΡΠ°Π΅ΡΡΡ 5, Π·Π°ΡΠ΅ΠΌ ΠΎΠ½ ΠΏΠ΅ΡΠ΅ΠΊΠ»Π°Π΄ΡΠ²Π°Π΅ΡΡΡ Π² R0 ΠΈ ΠΊ Π½Π΅ΠΌΡ ΠΏΡΠΈΠ±Π°Π²Π»ΡΠ΅ΡΡΡ 0x10. ΠΠΎΠ»ΡΡΠ°Π΅ΡΡΡ 0xB13B. Π’Π°ΠΊΠΈΠΌ ΠΎΠ±ΡΠ°Π·ΠΎΠΌ, IDA Π΄ΡΠΌΠ°Π΅Ρ, ΡΡΠΎ Π² ΠΏΠΎΡΠ»Π΅Π΄Π½Π΅ΠΉ ΠΈΠ½ΡΡΡΡΠΊΡΠΈΠΈ ΠΏΡΠΎΠΈΡΡ
ΠΎΠ΄ΠΈΡ ΠΎΠ±ΡΡΠ½ΡΠΉ Π²ΠΎΠ·Π²ΡΠ°Ρ ΠΈΠ· ΡΡΠ½ΠΊΡΠΈΠΈ, Π° Π½Π° ΡΠ°ΠΌΠΎΠΌ Π΄Π΅Π»Π΅ ΠΏΡΠΎΠΈΡΡ
ΠΎΠ΄ΠΈΡ ΠΏΠ΅ΡΠ΅Ρ
ΠΎΠ΄ ΠΏΠΎ Π²ΡΡΠΈΡΠ»Π΅Π½Π½ΠΎΠΌΡ Π°Π΄ΡΠ΅ΡΡ 0xB13B.
Π’ΡΡ ΡΡΠΎΠΈΡ Π½Π°ΠΏΠΎΠΌΠ½ΠΈΡΡ, ΡΡΠΎ Ρ ΠΏΡΠΎΡΠ΅ΡΡΠΎΡΠΎΠ² ARM Π΅ΡΡΡ Π΄Π²Π° ΡΠ΅ΠΆΠΈΠΌΠ° ΠΈ Π΄Π²Π° Π½Π°Π±ΠΎΡΠ° ΠΈΠ½ΡΡΡΡΠΊΡΠΈΠΉ: ARM ΠΈ Thumb. ΠΠ»Π°Π΄ΡΠΈΠΉ Π±ΠΈΡ Π°Π΄ΡΠ΅ΡΠ° Π³ΠΎΠ²ΠΎΡΠΈΡ ΠΏΡΠΎΡΠ΅ΡΡΠΎΡΡ, ΠΊΠ°ΠΊΠΎΠΉ Π½Π°Π±ΠΎΡ ΠΈΠ½ΡΡΡΡΠΊΡΠΈΠΉ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΡΡ. Π’. Π΅. Π°Π΄ΡΠ΅Ρ Π½Π° ΡΠ°ΠΌΠΎΠΌ Π΄Π΅Π»Π΅ 0xB13A, Π° Π΅Π΄ΠΈΠ½ΠΈΡΠ° Π² ΠΌΠ»Π°Π΄ΡΠ΅ΠΌ Π±ΠΈΡΠ΅ ΠΎΠ±ΠΎΠ·Π½Π°ΡΠ°Π΅Ρ ΡΠ΅ΠΆΠΈΠΌ Thumb.
Π Π½Π°ΡΠ°Π»ΠΎ ΠΊΠ°ΠΆΠ΄ΠΎΠΉ ΡΡΠ½ΠΊΡΠΈΠΈ Π² ΡΡΠΎΠΉ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠ΅ Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ ΠΏΠΎΠ΄ΠΎΠ±Π½ΡΠΉ Β«ΠΏΠ΅ΡΠ΅Ρ
ΠΎΠ΄Π½ΠΈΠΊΒ» ΠΈ
ΠΌΡΡΠΎΡΠ½ΡΠΉ ΠΊΠΎΠ΄. ΠΠ°Π»Π΅Π΅ Π½Π΅ Π±ΡΠ΄Π΅ΠΌ ΠΏΠΎΠ΄ΡΠΎΠ±Π½ΠΎ Π½Π° Π½ΠΈΡ
ΠΎΡΡΠ°Π½Π°Π²Π»ΠΈΠ²Π°ΡΡΡΡ β ΠΏΡΠΎΡΡΠΎ ΠΏΠΎΠΌΠ½ΠΈΠΌ,
ΡΡΠΎ Π½Π°ΡΡΠΎΡΡΠ΅Π΅ Π½Π°ΡΠ°Π»ΠΎ ΠΏΠΎΡΡΠΈ Π²ΡΠ΅Ρ
ΡΡΠ½ΠΊΡΠΈΠΉ Π½Π°Ρ
ΠΎΠ΄ΠΈΡΡΡ ΡΡΡΡ Π΄Π°Π»ΡΡΠ΅.
Π’Π°ΠΊ ΠΊΠ°ΠΊ Π² ΠΊΠΎΠ΄Π΅ Π½Π΅Ρ ΡΠ²Π½ΠΎΠ³ΠΎ ΠΏΠ΅ΡΠ΅Ρ ΠΎΠ΄Π° Π½Π° 0xB13A, IDA ΡΠ°ΠΌΠ° Π½Π΅ ΠΎΠΏΠΎΠ·Π½Π°Π»Π°, ΡΡΠΎ Π² ΡΡΠΎΠΌ ΠΌΠ΅ΡΡΠ΅ Π½Π°Ρ ΠΎΠ΄ΠΈΡΡΡ ΠΊΠΎΠ΄. ΠΠΎ ΡΡΠΎΠΉ ΠΆΠ΅ ΠΏΡΠΈΡΠΈΠ½Π΅ Π±ΠΎΠ»ΡΡΡΡ ΡΠ°ΡΡΡ ΠΊΠΎΠ΄Π° Π² Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠ΅ ΠΎΠ½Π° Π½Π΅ ΠΎΠΏΠΎΠ·Π½Π°ΡΡ ΠΊΠ°ΠΊ ΠΊΠΎΠ΄, ΡΡΠΎ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΎ Π·Π°ΡΡΡΠ΄Π½ΡΠ΅Ρ Π°Π½Π°Π»ΠΈΠ·. ΠΠΎΠ²ΠΎΡΠΈΠΌ IDA, ΡΡΠΎ ΡΡΡ ΠΊΠΎΠ΄, ΠΈ Π²ΠΎΡ ΡΡΠΎ ΠΏΠΎΠ»ΡΡΠ°Π΅ΡΡΡ:
ΠΠ° 0xB144 ΡΠ²Π½ΠΎ Π½Π°ΡΠΈΠ½Π°Π΅ΡΡΡ ΡΠ°Π±Π»ΠΈΡΠ°. Π ΡΡΠΎ Π² sub_494C?
ΠΡΠΈ Π²ΡΠ·ΠΎΠ²Π΅ ΡΡΠΎΠΉ ΡΡΠ½ΠΊΡΠΈΠΈ Π² ΡΠ΅Π³ΠΈΡΡΡΠ΅ LR ΠΏΠΎΠ»ΡΡΠΈΠΌ Π°Π΄ΡΠ΅Ρ ΡΠΏΠΎΠΌΡΠ½ΡΡΠΎΠΉ ΡΠ°Π½Π΅Π΅ ΡΠ°Π±Π»ΠΈΡΡ (0xB144). Π R0 β ΠΈΠ½Π΄Π΅ΠΊΡ Π² ΡΡΠΎΠΉ ΡΠ°Π±Π»ΠΈΡΠ΅. Π’. Π΅. Π±Π΅ΡΡΡΡΡ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ ΠΈΠ· ΡΠ°Π±Π»ΠΈΡΡ, ΠΏΡΠΈΠ±Π°Π²Π»ΡΠ΅ΡΡΡ ΠΊ LR ΠΈ ΠΏΠΎΠ»ΡΡΠ°Π΅ΡΡΡ
Π°Π΄ΡΠ΅Ρ, ΠΏΠΎ ΠΊΠΎΡΠΎΡΠΎΠΌΡ Π½ΡΠΆΠ½ΠΎ ΠΏΠ΅ΡΠ΅ΠΉΡΠΈ. ΠΠΎΠΏΡΠΎΠ±ΡΠ΅ΠΌ Π΅Π³ΠΎ Π²ΡΡΠΈΡΠ»ΠΈΡΡ: 0xB144 + [0xB144 + 8* 4] = 0xB144 + 0x120 = 0xB264. ΠΠ΅ΡΠ΅Ρ
ΠΎΠ΄ΠΈΠΌ ΠΏΠΎ ΠΏΠΎΠ»ΡΡΠ΅Π½Π½ΠΎΠΌΡ Π°Π΄ΡΠ΅ΡΡ ΠΈ Π²ΠΈΠ΄ΠΈΠΌ Π±ΡΠΊΠ²Π°Π»ΡΠ½ΠΎ ΠΏΠ°ΡΡ ΠΏΠΎΠ»Π΅Π·Π½ΡΡ
ΠΈΠ½ΡΡΡΡΠΊΡΠΈΠΉ ΠΈ ΠΎΠΏΡΡΡ ΠΏΠ΅ΡΠ΅Ρ
ΠΎΠ΄ Π½Π° 0xB140:
Π’Π΅ΠΏΠ΅ΡΡ Π±ΡΠ΄Π΅Ρ ΠΏΠ΅ΡΠ΅Ρ
ΠΎΠ΄ ΠΏΠΎ ΡΠΌΠ΅ΡΠ΅Π½ΠΈΡ Ρ ΠΈΠ½Π΄Π΅ΠΊΡΠΎΠΌ 0x20 ΠΈΠ· ΡΠ°Π±Π»ΠΈΡΡ.
Π‘ΡΠ΄Ρ ΠΏΠΎ ΡΠ°Π·ΠΌΠ΅ΡΡ ΡΠ°Π±Π»ΠΈΡΡ, ΡΠ°ΠΊΠΈΡ ΠΏΠ΅ΡΠ΅Ρ ΠΎΠ΄ΠΎΠ² Π² ΠΊΠΎΠ΄Π΅ Π²ΡΡΡΠ΅ΡΠΈΡΡΡ ΠΌΠ½ΠΎΠ³ΠΎ. ΠΠΎΠ·Π½ΠΈΠΊΠ°Π΅Ρ Π²ΠΎΠΏΡΠΎΡ, ΠΌΠΎΠΆΠ½ΠΎ Π»ΠΈ ΠΊΠ°ΠΊ-ΡΠΎ Ρ ΡΡΠΈΠΌ Π±ΠΎΡΠΎΡΡΡΡ Π±ΠΎΠ»Π΅Π΅ Π°Π²ΡΠΎΠΌΠ°ΡΠΈΠ·ΠΈΡΠΎΠ²Π°Π½Π½ΠΎ, Π±Π΅Π· ΡΡΡΠ½ΠΎΠ³ΠΎ Π²ΡΡΠΈΡΠ»Π΅Π½ΠΈΡ Π°Π΄ΡΠ΅ΡΠΎΠ². Π Π½Π° ΠΏΠΎΠΌΠΎΡΡ Π½Π°ΠΌ ΠΏΡΠΈΡ ΠΎΠ΄ΡΡ ΡΠΊΡΠΈΠΏΡΡ ΠΈ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΡ ΠΏΠ°ΡΡΠΈΡΡ ΠΊΠΎΠ΄ Π² IDA:
def put_unconditional_branch(source, destination):
offset = (destination - source - 4) >> 1
if offset > 2097151 or offset < -2097152:
raise RuntimeError("Invalid offset")
if offset > 1023 or offset < -1024:
instruction1 = 0xf000 | ((offset >> 11) & 0x7ff)
instruction2 = 0xb800 | (offset & 0x7ff)
patch_word(source, instruction1)
patch_word(source + 2, instruction2)
else:
instruction = 0xe000 | (offset & 0x7ff)
patch_word(source, instruction)
ea = here()
if get_wide_word(ea) == 0xb503: #PUSH {R0,R1,LR}
ea1 = ea + 2
if get_wide_word(ea1) == 0xbf00: #NOP
ea1 += 2
if get_operand_type(ea1, 0) == 1 and get_operand_value(ea1, 0) == 0 and get_operand_type(ea1, 1) == 2:
index = get_wide_dword(get_operand_value(ea1, 1))
print "index =", hex(index)
ea1 += 2
if get_operand_type(ea1, 0) == 7:
table = get_operand_value(ea1, 0) + 4
elif get_operand_type(ea1, 1) == 2:
table = get_operand_value(ea1, 1) + 4
else:
print "Wrong operand type on", hex(ea1), "-", get_operand_type(ea1, 0), get_operand_type(ea1, 1)
table = None
if table is None:
print "Unable to find table"
else:
print "table =", hex(table)
offset = get_wide_dword(table + (index << 2))
put_unconditional_branch(ea, table + offset)
else:
print "Unknown code", get_operand_type(ea1, 0), get_operand_value(ea1, 0), get_operand_type(ea1, 1) == 2
else:
print "Unable to detect first instruction"
Π‘ΡΠ°Π²ΠΈΠΌ ΠΊΡΡΡΠΎΡ Π½Π° ΡΡΡΠΎΡΠΊΡ 0xB26A, Π·Π°ΠΏΡΡΠΊΠ°Π΅ΠΌ ΡΠΊΡΠΈΠΏΡ ΠΈ Π²ΠΈΠ΄ΠΈΠΌ ΠΏΠ΅ΡΠ΅Ρ ΠΎΠ΄ Π½Π° 0xB4B0:
IDA ΠΎΠΏΡΡΡ Π½Π΅ ΠΎΠΏΠΎΠ·Π½Π°Π»Π° ΡΡΠΎΡ ΡΡΠ°ΡΡΠΎΠΊ ΠΊΠ°ΠΊ ΠΊΠΎΠ΄. ΠΠΎΠΌΠΎΠ³Π°Π΅ΠΌ Π΅ΠΉ ΠΈ Π²ΠΈΠ΄ΠΈΠΌ ΡΠ°ΠΌ Π΄ΡΡΠ³ΡΡ ΠΊΠΎΠ½ΡΡΡΡΠΊΡΠΈΡ:
ΠΠ½ΡΡΡΡΠΊΡΠΈΠΈ ΠΏΠΎΡΠ»Π΅ BLX Π²ΡΠ³Π»ΡΠ΄ΡΡ Π½Π΅ ΠΎΡΠ΅Π½Ρ ΠΎΡΠΌΡΡΠ»Π΅Π½Π½ΡΠΌΠΈ, ΡΡΠΎ Π±ΠΎΠ»ΡΡΠ΅ ΠΏΠΎΡ
ΠΎΠΆΠ΅ Π½Π° ΠΊΠ°ΠΊΠΎΠ΅-ΡΠΎ ΡΠΌΠ΅ΡΠ΅Π½ΠΈΠ΅. Π‘ΠΌΠΎΡΡΠΈΠΌ Π² sub_4964:
Π Π΄Π΅ΠΉΡΡΠ²ΠΈΡΠ΅Π»ΡΠ½ΠΎ, ΡΡΡ Π±Π΅ΡΡΡΡΡ dword ΠΏΠΎ Π°Π΄ΡΠ΅ΡΡ, Π»Π΅ΠΆΠ°ΡΠ΅ΠΌΡ Π² LR, ΠΏΡΠΈΠ±Π°Π²Π»ΡΠ΅ΡΡΡ ΠΊ ΡΡΠΎΠΌΡ Π°Π΄ΡΠ΅ΡΡ, ΠΏΠΎΡΠ»Π΅ ΡΠ΅Π³ΠΎ Π±Π΅ΡΡΡΡΡ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ ΠΏΠΎ ΠΏΠΎΠ»ΡΡΠ΅Π½Π½ΠΎΠΌΡ Π°Π΄ΡΠ΅ΡΡ ΠΈ ΠΊΠ»Π°Π΄ΡΡΡΡ Π² ΡΡΠ΅ΠΊ. Π’Π°ΠΊΠΆΠ΅ ΠΊ LR ΠΏΡΠΈΠ±Π°Π²Π»ΡΠ΅ΡΡΡ 4, ΡΡΠΎΠ±Ρ ΠΏΠΎΡΠ»Π΅ Π²ΠΎΠ·Π²ΡΠ°ΡΠ° ΠΈΠ· ΡΡΠ½ΠΊΡΠΈΠΈ ΠΏΠ΅ΡΠ΅ΡΠΊΠΎΡΠΈΡΡ ΡΡΠΎ ΡΠ°ΠΌΠΎΠ΅ ΡΠΌΠ΅ΡΠ΅Π½ΠΈΠ΅. ΠΠΎΡΠ»Π΅ ΡΠ΅Π³ΠΎ ΠΊΠΎΠΌΠ°Π½Π΄Π° POP {R1} Π΄ΠΎΡΡΠ°ΡΡ ΠΏΠΎΠ»ΡΡΠ΅Π½Π½ΠΎΠ΅ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ ΠΈΠ· ΡΡΠ΅ΠΊΠ°. ΠΡΠ»ΠΈ ΠΏΠΎΡΠΌΠΎΡΡΠ΅ΡΡ, ΡΡΠΎ Π½Π°Ρ
ΠΎΠ΄ΠΈΡΡΡ ΠΏΠΎ Π°Π΄ΡΠ΅ΡΡ 0xB4BA + 0xEA = 0xB5A4, ΡΠΎ ΠΌΠΎΠΆΠ½ΠΎ ΡΠ²ΠΈΠ΄Π΅ΡΡ Π½Π΅ΡΡΠΎ ΠΏΠΎΡ
ΠΎΠΆΠ΅Π΅ Π½Π° ΡΠ°Π±Π»ΠΈΡΡ Π°Π΄ΡΠ΅ΡΠΎΠ²:
Π§ΡΠΎΠ±Ρ ΠΏΡΠΎΠΏΠ°ΡΡΠΈΡΡ ΡΡΡ ΠΊΠΎΠ½ΡΡΡΡΠΊΡΠΈΡ, ΠΏΠΎΡΡΠ΅Π±ΡΠ΅ΡΡΡ ΠΏΠΎΠ»ΡΡΠΈΡΡ Π΄Π²Π° ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠ° ΠΈΠ· ΠΊΠΎΠ΄Π°: ΡΠΌΠ΅ΡΠ΅Π½ΠΈΠ΅ ΠΈ Π½ΠΎΠΌΠ΅Ρ ΡΠ΅Π³ΠΈΡΡΡΠ°, Π² ΠΊΠΎΡΠΎΡΡΠΉ Π½ΡΠΆΠ½ΠΎ ΠΏΠΎΠ»ΠΎΠΆΠΈΡΡ ΡΠ΅Π·ΡΠ»ΡΡΠ°Ρ. ΠΠ»Ρ ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΠ³ΠΎ ΡΠ΅Π³ΠΈΡΡΡΠ° ΠΏΡΠΈΠ΄ΡΡΡΡ Π·Π°ΡΠ°Π½Π΅Π΅ ΠΏΠΎΠ΄Π³ΠΎΡΠΎΠ²ΠΈΡΡ ΠΊΡΡΠΎΡΠ΅ΠΊ ΠΊΠΎΠ΄Π°.
patches = {}
patches[0] = (0x00, 0xbf, 0x01, 0x48, 0x00, 0x68, 0x02, 0xe0)
patches[1] = (0x00, 0xbf, 0x01, 0x49, 0x09, 0x68, 0x02, 0xe0)
patches[2] = (0x00, 0xbf, 0x01, 0x4a, 0x12, 0x68, 0x02, 0xe0)
patches[3] = (0x00, 0xbf, 0x01, 0x4b, 0x1b, 0x68, 0x02, 0xe0)
patches[4] = (0x00, 0xbf, 0x01, 0x4c, 0x24, 0x68, 0x02, 0xe0)
patches[5] = (0x00, 0xbf, 0x01, 0x4d, 0x2d, 0x68, 0x02, 0xe0)
patches[8] = (0x00, 0xbf, 0xdf, 0xf8, 0x06, 0x80, 0xd8, 0xf8, 0x00, 0x80, 0x01, 0xe0)
patches[9] = (0x00, 0xbf, 0xdf, 0xf8, 0x06, 0x90, 0xd9, 0xf8, 0x00, 0x90, 0x01, 0xe0)
patches[10] = (0x00, 0xbf, 0xdf, 0xf8, 0x06, 0xa0, 0xda, 0xf8, 0x00, 0xa0, 0x01, 0xe0)
patches[11] = (0x00, 0xbf, 0xdf, 0xf8, 0x06, 0xb0, 0xdb, 0xf8, 0x00, 0xb0, 0x01, 0xe0)
ea = here()
if (get_wide_word(ea) == 0xb082 #SUB SP, SP, #8
and get_wide_word(ea + 2) == 0xb503): #PUSH {R0,R1,LR}
if get_operand_type(ea + 4, 0) == 7:
pop = get_bytes(ea + 12, 4, 0)
if pop[1] == 'xbc':
register = -1
r = get_wide_byte(ea + 12)
for i in range(8):
if r == (1 << i):
register = i
break
if register == -1:
print "Unable to detect register"
else:
address = get_wide_dword(ea + 8) + ea + 8
for b in patches[register]:
patch_byte(ea, b)
ea += 1
if ea % 4 != 0:
ea += 2
patch_dword(ea, address)
elif pop[:3] == 'x5dxf8x04':
register = ord(pop[3]) >> 4
if register in patches:
address = get_wide_dword(ea + 8) + ea + 8
for b in patches[register]:
patch_byte(ea, b)
ea += 1
patch_dword(ea, address)
else:
print "POP instruction not found"
else:
print "Wrong operand type on +4:", get_operand_type(ea + 4, 0)
else:
print "Unable to detect first instructions"
Π‘ΡΠ°Π²ΠΈΠΌ ΠΊΡΡΡΠΎΡ Π½Π° Π½Π°ΡΠ°Π»ΠΎ ΠΊΠΎΠ½ΡΡΡΡΠΊΡΠΈΠΈ, ΠΊΠΎΡΠΎΡΡΡ Ρ ΠΎΡΠΈΠΌ Π·Π°ΠΌΠ΅Π½ΠΈΡΡ β 0xB4B2 β ΠΈ Π·Π°ΠΏΡΡΠΊΠ°Π΅ΠΌ ΡΠΊΡΠΈΠΏΡ:
ΠΠΎΠΌΠΈΠΌΠΎ ΡΠΆΠ΅ Π½Π°Π·Π²Π°Π½Π½ΡΡ
ΠΊΠΎΠ½ΡΡΡΡΠΊΡΠΈΠΉ Π² ΠΊΠΎΠ΄Π΅ ΡΠ°ΠΊΠΆΠ΅ ΠΏΠΎΠΏΠ°Π΄Π°ΡΡΡΡ Π²ΠΎΡ ΡΠ°ΠΊΠΈΠ΅:
ΠΠ°ΠΊ ΠΈ Π² ΠΏΡΠ΅Π΄ΡΠ΄ΡΡΠ΅ΠΌ ΡΠ»ΡΡΠ°Π΅, ΠΏΠΎΡΠ»Π΅ ΠΈΠ½ΡΡΡΡΠΊΡΠΈΠΈ BLX ΠΈΠ΄ΡΡ ΡΠΌΠ΅ΡΠ΅Π½ΠΈΠ΅:
ΠΠ΅ΡΡΠΌ ΡΠΌΠ΅ΡΠ΅Π½ΠΈΠ΅ ΠΏΠΎ Π°Π΄ΡΠ΅ΡΡ ΠΈΠ· LR, ΠΏΡΠΈΠ±Π°Π²Π»ΡΠ΅ΠΌ Π΅Π³ΠΎ ΠΊ LR ΠΈ ΠΏΠ΅ΡΠ΅Ρ
ΠΎΠ΄ΠΈΠΌ ΡΡΠ΄Π°. 0x72044 + 0xC = 0x72050. Π‘ΠΊΡΠΈΠΏΡ Π΄Π»Ρ ΡΡΠΎΠΉ ΠΊΠΎΠ½ΡΡΡΡΠΊΡΠΈΠΈ ΡΠΎΠ²ΡΠ΅ΠΌ ΠΏΡΠΎΡΡΠΎΠΉ:
def put_unconditional_branch(source, destination):
offset = (destination - source - 4) >> 1
if offset > 2097151 or offset < -2097152:
raise RuntimeError("Invalid offset")
if offset > 1023 or offset < -1024:
instruction1 = 0xf000 | ((offset >> 11) & 0x7ff)
instruction2 = 0xb800 | (offset & 0x7ff)
patch_word(source, instruction1)
patch_word(source + 2, instruction2)
else:
instruction = 0xe000 | (offset & 0x7ff)
patch_word(source, instruction)
ea = here()
if get_wide_word(ea) == 0xb503: #PUSH {R0,R1,LR}
ea1 = ea + 6
if get_wide_word(ea + 2) == 0xbf00: #NOP
ea1 += 2
offset = get_wide_dword(ea1)
put_unconditional_branch(ea, (ea1 + offset) & 0xffffffff)
else:
print "Unable to detect first instruction"
Π Π΅Π·ΡΠ»ΡΡΠ°Ρ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΡ ΡΠΊΡΠΈΠΏΡΠ°:
ΠΠΎΡΠ»Π΅ ΡΠΎΠ³ΠΎ ΠΊΠ°ΠΊ Π² ΡΡΠ½ΠΊΡΠΈΠΈ Π²ΡΡ ΠΏΡΠΎΠΏΠ°ΡΡΠ΅Π½ΠΎ, ΠΌΠΎΠΆΠ½ΠΎ ΡΠΊΠ°Π·Π°ΡΡ IDA Π½Π° Π΅Ρ Π½Π°ΡΡΠΎΡΡΠ΅Π΅ Π½Π°ΡΠ°Π»ΠΎ. ΠΠ½Π° ΡΠΎΠ±Π΅ΡΡΡ Π²Π΅ΡΡ ΠΊΠΎΠ΄ ΡΡΠ½ΠΊΡΠΈΠΈ ΠΏΠΎ ΠΊΡΡΠΎΡΠΊΠ°ΠΌ, ΠΈ Π΅Π³ΠΎ ΠΌΠΎΠΆΠ½ΠΎ Π±ΡΠ΄Π΅Ρ Π΄Π΅ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡΠΎΠ²Π°ΡΡ Ρ ΠΏΠΎΠΌΠΎΡΡΡ HexRays.
Π Π°ΡΡΠΈΡΡΠΎΠ²ΠΊΠ° ΡΡΡΠΎΠΊ
ΠΡ Π½Π°ΡΡΠΈΠ»ΠΈΡΡ Π±ΠΎΡΠΎΡΡΡΡ Ρ ΠΎΠ±ΡΡΡΠΊΠ°ΡΠΈΠ΅ΠΉ ΠΌΠ°ΡΠΈΠ½Π½ΠΎΠ³ΠΎ ΠΊΠΎΠ΄Π° Π² Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠ΅ libsgmainso-6.4.36.so ΠΈΠ· UC Browser ΠΈ ΠΏΠΎΠ»ΡΡΠΈΠ»ΠΈ ΠΊΠΎΠ΄ ΡΡΠ½ΠΊΡΠΈΠΈ JNI_OnLoad.
int __fastcall real_JNI_OnLoad(JavaVM *vm)
{
int result; // r0
jclass clazz; // r0 MAPDST
int v4; // r0
JNIEnv *env; // r4
int v6; // [sp-40h] [bp-5Ch]
int v7; // [sp+Ch] [bp-10h]
v7 = *(_DWORD *)off_8AC00;
if ( !vm )
goto LABEL_39;
sub_7C4F4();
env = (JNIEnv *)sub_7C5B0(0);
if ( !env )
goto LABEL_39;
v4 = sub_72CCC();
sub_73634(v4);
sub_73E24(&unk_83EA6, &v6, 49);
clazz = (jclass)((int (__fastcall *)(JNIEnv *, int *))(*env)->FindClass)(env, &v6);
if ( clazz
&& (sub_9EE4(),
sub_71D68(env),
sub_E7DC(env) >= 0
&& sub_69D68(env) >= 0
&& sub_197B4(env, clazz) >= 0
&& sub_E240(env, clazz) >= 0
&& sub_B8B0(env, clazz) >= 0
&& sub_5F0F4(env, clazz) >= 0
&& sub_70640(env, clazz) >= 0
&& sub_11F3C(env) >= 0
&& sub_21C3C(env, clazz) >= 0
&& sub_2148C(env, clazz) >= 0
&& sub_210E0(env, clazz) >= 0
&& sub_41B58(env, clazz) >= 0
&& sub_27920(env, clazz) >= 0
&& sub_293E8(env, clazz) >= 0
&& sub_208F4(env, clazz) >= 0) )
{
result = (sub_B7B0(env, clazz) >> 31) | 0x10004;
}
else
{
LABEL_39:
result = -1;
}
return result;
}
Π Π°ΡΡΠΌΠΎΡΡΠΈΠΌ Π²Π½ΠΈΠΌΠ°ΡΠ΅Π»ΡΠ½Π΅Π΅ ΡΠ»Π΅Π΄ΡΡΡΠΈΠ΅ ΡΡΡΠΎΡΠΊΠΈ:
sub_73E24(&unk_83EA6, &v6, 49);
clazz = (jclass)((int (__fastcall *)(JNIEnv *, int *))(*env)->FindClass)(env, &v6);
Π ΡΡΠ½ΠΊΡΠΈΠΈ sub_73E24 ΡΠ²Π½ΠΎ ΠΏΡΠΎΠΈΡΡ ΠΎΠ΄ΠΈΡ ΡΠ°ΡΡΠΈΡΡΠΎΠ²ΠΊΠ° ΠΈΠΌΠ΅Π½ΠΈ ΠΊΠ»Π°ΡΡΠ°. Π ΠΊΠ°ΡΠ΅ΡΡΠ²Π΅ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠΎΠ² ΡΡΠΎΠΉ ΡΡΠ½ΠΊΡΠΈΠΈ ΠΏΠ΅ΡΠ΅Π΄Π°ΡΡΡΡ ΡΠΊΠ°Π·Π°ΡΠ΅Π»Ρ Π½Π° Π΄Π°Π½Π½ΡΠ΅, ΠΏΠΎΡ ΠΎΠΆΠΈΠ΅ Π½Π° Π·Π°ΡΠΈΡΡΠΎΠ²Π°Π½Π½ΡΠ΅, Π½Π΅ΠΊΠΈΠΉ Π±ΡΡΠ΅Ρ ΠΈ ΡΠΈΡΠ»ΠΎ. ΠΡΠ΅Π²ΠΈΠ΄Π½ΠΎ, ΡΡΠΎ ΠΏΠΎΡΠ»Π΅ Π²ΡΠ·ΠΎΠ²Π° ΡΡΠ½ΠΊΡΠΈΠΈ Π² Π±ΡΡΠ΅ΡΠ΅ Π±ΡΠ΄Π΅Ρ ΡΠ°ΡΡΠΈΡΡΠΎΠ²Π°Π½Π½Π°Ρ ΡΡΡΠΎΡΠΊΠ°, Ρ. ΠΊ. ΠΎΠ½ ΠΏΠ΅ΡΠ΅Π΄Π°ΡΡΡΡ ΡΡΠ½ΠΊΡΠΈΠΈ FindClass, ΠΊΠΎΡΠΎΡΠ°Ρ ΠΏΡΠΈΠ½ΠΈΠΌΠ°Π΅Ρ Π²ΡΠΎΡΡΠΌ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠΎΠΌ ΠΈΠΌΡ ΠΊΠ»Π°ΡΡΠ°. Π‘ΡΠ°Π»ΠΎ Π±ΡΡΡ, ΡΠΈΡΠ»ΠΎ β ΡΡΠΎ ΡΠ°Π·ΠΌΠ΅Ρ Π±ΡΡΠ΅ΡΠ° ΠΈΠ»ΠΈ Π΄Π»ΠΈΠ½Π° ΡΡΡΠΎΠΊΠΈ. ΠΠΎΠΏΡΠΎΠ±ΡΠ΅ΠΌ ΡΠ°ΡΡΠΈΡΡΠΎΠ²Π°ΡΡ ΠΈΠΌΡ ΠΊΠ»Π°ΡΡΠ°, ΠΎΠ½ΠΎ Π΄ΠΎΠ»ΠΆΠ½ΠΎ ΡΠΊΠ°Π·Π°ΡΡ Π½Π°ΠΌ, Π² ΠΏΡΠ°Π²ΠΈΠ»ΡΠ½ΠΎΠΌ Π»ΠΈ Π½Π°ΠΏΡΠ°Π²Π»Π΅Π½ΠΈΠΈ ΠΌΡ ΠΈΠ΄ΡΠΌ. Π Π°ΡΡΠΌΠΎΡΡΠΈΠΌ ΠΏΠΎΠ΄ΡΠΎΠ±Π½Π΅Π΅, ΡΡΠΎ ΠΏΡΠΎΠΈΡΡ ΠΎΠ΄ΠΈΡ Π² sub_73E24.
int __fastcall sub_73E56(unsigned __int8 *in, unsigned __int8 *out, size_t size)
{
int v4; // r6
int v7; // r11
int v8; // r9
int v9; // r4
size_t v10; // r5
int v11; // r0
struc_1 v13; // [sp+0h] [bp-30h]
int v14; // [sp+1Ch] [bp-14h]
int v15; // [sp+20h] [bp-10h]
v4 = 0;
v15 = *(_DWORD *)off_8AC00;
v14 = 0;
v7 = sub_7AF78(17);
v8 = sub_7AF78(size);
if ( !v7 )
{
v9 = 0;
goto LABEL_12;
}
(*(void (__fastcall **)(int, const char *, int))(v7 + 12))(v7, "DcO/lcK+h?m3c*q@", 16);
if ( !v8 )
{
LABEL_9:
v4 = 0;
goto LABEL_10;
}
v4 = 0;
if ( !in )
{
LABEL_10:
v9 = 0;
goto LABEL_11;
}
v9 = 0;
if ( out )
{
memset(out, 0, size);
v10 = size - 1;
(*(void (__fastcall **)(int, unsigned __int8 *, size_t))(v8 + 12))(v8, in, v10);
memset(&v13, 0, 0x14u);
v13.field_4 = 3;
v13.field_10 = v7;
v13.field_14 = v8;
v11 = sub_6115C(&v13, &v14);
v9 = v11;
if ( v11 )
{
if ( *(_DWORD *)(v11 + 4) == v10 )
{
qmemcpy(out, *(const void **)v11, v10);
v4 = *(_DWORD *)(v9 + 4);
}
else
{
v4 = 0;
}
goto LABEL_11;
}
goto LABEL_9;
}
LABEL_11:
sub_7B148(v7);
LABEL_12:
if ( v8 )
sub_7B148(v8);
if ( v9 )
sub_7B148(v9);
return v4;
}
Π€ΡΠ½ΠΊΡΠΈΡ sub_7AF78 ΡΠΎΠ·Π΄Π°ΡΡ ΡΠΊΠ·Π΅ΠΌΠΏΠ»ΡΡ ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅ΡΠ° Π΄Π»Ρ Π±Π°ΠΉΡΠΎΠ²ΡΡ ΠΌΠ°ΡΡΠΈΠ²ΠΎΠ² ΡΠΊΠ°Π·Π°Π½Π½ΠΎΠ³ΠΎ ΡΠ°Π·ΠΌΠ΅ΡΠ° (Π½Π΅ Π±ΡΠ΄Π΅ΠΌ ΠΏΠΎΠ΄ΡΠΎΠ±Π½ΠΎ ΠΎΡΡΠ°Π½Π°Π²Π»ΠΈΠ²Π°ΡΡΡΡ Π½Π° ΡΡΠΈΡ ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅ΡΠ°Ρ ). Π’ΡΡ ΡΠΎΠ·Π΄Π°ΡΡΡΡ Π΄Π²Π° ΡΠ°ΠΊΠΈΡ ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅ΡΠ°: Π² ΠΎΠ΄ΠΈΠ½ ΠΏΠΎΠΌΠ΅ΡΠ°Π΅ΡΡΡ ΡΡΡΠΎΡΠΊΠ° Β«DcO/lcK+h?m3c*q@Β» (Π½Π΅ΡΡΡΠ΄Π½ΠΎ Π΄ΠΎΠ³Π°Π΄Π°ΡΡΡΡ, ΡΡΠΎ ΡΡΠΎ ΠΊΠ»ΡΡ), Π² Π΄ΡΡΠ³ΠΎΠΉ β Π·Π°ΡΠΈΡΡΠΎΠ²Π°Π½Π½ΡΠ΅ Π΄Π°Π½Π½ΡΠ΅. ΠΠ°Π»Π΅Π΅ ΠΎΠ±Π° ΠΎΠ±ΡΠ΅ΠΊΡΠ° ΠΏΠΎΠΌΠ΅ΡΠ°ΡΡΡΡ Π² Π½Π΅ΠΊΡΡ ΡΡΡΡΠΊΡΡΡΡ, ΠΊΠΎΡΠΎΡΠ°Ρ ΠΏΠ΅ΡΠ΅Π΄Π°ΡΡΡΡ ΡΡΠ½ΠΊΡΠΈΠΈ sub_6115C. Π’Π°ΠΊΠΆΠ΅ ΠΎΡΠΌΠ΅ΡΠΈΠΌ Π² ΡΡΠΎΠΉ ΡΡΡΡΠΊΡΡΡΠ΅ ΠΏΠΎΠ»Π΅ ΡΠΎ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ΠΌ 3. ΠΠΎΡΠΌΠΎΡΡΠΈΠΌ, ΡΡΠΎ ΠΏΡΠΎΠΈΡΡ ΠΎΠ΄ΠΈΡ Ρ ΡΡΠΎΠΉ ΡΡΡΡΠΊΡΡΡΠΎΠΉ Π΄Π°Π»ΡΡΠ΅.
int __fastcall sub_611B4(struc_1 *a1, _DWORD *a2)
{
int v3; // lr
unsigned int v4; // r1
int v5; // r0
int v6; // r1
int result; // r0
int v8; // r0
*a2 = 820000;
if ( a1 )
{
v3 = a1->field_14;
if ( v3 )
{
v4 = a1->field_4;
if ( v4 < 0x19 )
{
switch ( v4 )
{
case 0u:
v8 = sub_6419C(a1->field_0, a1->field_10, v3);
goto LABEL_17;
case 3u:
v8 = sub_6364C(a1->field_0, a1->field_10, v3);
goto LABEL_17;
case 0x10u:
case 0x11u:
case 0x12u:
v8 = sub_612F4(
a1->field_0,
v4,
*(_QWORD *)&a1->field_8,
*(_QWORD *)&a1->field_8 >> 32,
a1->field_10,
v3,
a2);
goto LABEL_17;
case 0x14u:
v8 = sub_63A28(a1->field_0, v3);
goto LABEL_17;
case 0x15u:
sub_61A60(a1->field_0, v3, a2);
return result;
case 0x16u:
v8 = sub_62440(a1->field_14);
goto LABEL_17;
case 0x17u:
v8 = sub_6226C(a1->field_10, v3);
goto LABEL_17;
case 0x18u:
v8 = sub_63530(a1->field_14);
LABEL_17:
v6 = 0;
if ( v8 )
{
*a2 = 0;
v6 = v8;
}
return v6;
default:
LOWORD(v5) = 28032;
goto LABEL_5;
}
}
}
}
LOWORD(v5) = -27504;
LABEL_5:
HIWORD(v5) = 13;
v6 = 0;
*a2 = v5;
return v6;
}
Π ΠΊΠ°ΡΠ΅ΡΡΠ²Π΅ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠ° switch ΠΏΠ΅ΡΠ΅Π΄Π°ΡΡΡΡ ΠΏΠΎΠ»Π΅ ΡΡΡΡΠΊΡΡΡΡ, ΠΊΠΎΡΠΎΡΠΎΠΌΡ ΡΠ°Π½Π΅Π΅ Π±ΡΠ»ΠΎ ΠΏΡΠΈΡΠ²ΠΎΠ΅Π½ΠΎ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ 3. Π‘ΠΌΠΎΡΡΠΈΠΌ case 3: Π² ΡΡΠ½ΠΊΡΠΈΡ sub_6364C ΠΏΠ΅ΡΠ΅Π΄Π°ΡΡΡΡ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΡ ΠΈΠ· ΡΡΡΡΠΊΡΡΡΡ, ΠΊΠΎΡΠΎΡΡΠ΅ Π±ΡΠ»ΠΈ ΡΠ»ΠΎΠΆΠ΅Π½Ρ ΡΡΠ΄Π° Π² ΠΏΡΠ΅Π΄ΡΠ΄ΡΡΠ΅ΠΉ ΡΡΠ½ΠΊΡΠΈΠΈ, Ρ. Π΅. ΠΊΠ»ΡΡ ΠΈ Π·Π°ΡΠΈΡΡΠΎΠ²Π°Π½Π½ΡΠ΅ Π΄Π°Π½Π½ΡΠ΅. ΠΡΠ»ΠΈ Π²Π½ΠΈΠΌΠ°ΡΠ΅Π»ΡΠ½ΠΎ ΠΏΠΎΡΠΌΠΎΡΡΠ΅ΡΡ Π½Π° sub_6364C, ΠΌΠΎΠΆΠ½ΠΎ ΡΠ·Π½Π°ΡΡ Π² Π½Π΅ΠΉ Π°Π»Π³ΠΎΡΠΈΡΠΌ RC4.
Π£ Π½Π°Ρ Π΅ΡΡΡ Π°Π»Π³ΠΎΡΠΈΡΠΌ ΠΈ ΠΊΠ»ΡΡ. ΠΠΎΠΏΡΠΎΠ±ΡΠ΅ΠΌ ΡΠ°ΡΡΠΈΡΡΠΎΠ²Π°ΡΡ ΠΈΠΌΡ ΠΊΠ»Π°ΡΡΠ°. ΠΠΎΡ ΡΡΠΎ ΠΏΠΎΠ»ΡΡΠΈΠ»ΠΎΡΡ: com/taobao/wireless/security/adapter/JNICLibrary. ΠΡΠ»ΠΈΡΠ½ΠΎ! ΠΡ Π½Π° ΠΏΡΠ°Π²ΠΈΠ»ΡΠ½ΠΎΠΌ ΠΏΡΡΠΈ.
ΠΠ΅ΡΠ΅Π²ΠΎ ΠΊΠΎΠΌΠ°Π½Π΄
Π’Π΅ΠΏΠ΅ΡΡ Π½ΡΠΆΠ½ΠΎ Π½Π°ΠΉΡΠΈ Π²ΡΠ·ΠΎΠ² RegisterNatives, ΠΊΠΎΡΠΎΡΡΠΉ ΡΠΊΠ°ΠΆΠ΅Ρ Π½Π°ΠΌ Π½Π° ΡΡΠ½ΠΊΡΠΈΡ doCommandNative. ΠΡΠΎΡΠΌΠ°ΡΡΠΈΠ²Π°Π΅ΠΌ ΡΡΠ½ΠΊΡΠΈΠΈ, Π²ΡΠ·ΡΠ²Π°Π΅ΠΌΡΠ΅ ΠΈΠ· JNI_OnLoad, ΠΈ Π½Π°Ρ ΠΎΠ΄ΠΈΠΌ Π΅Π³ΠΎ Π² sub_B7B0:
int __fastcall sub_B7F6(JNIEnv *env, jclass clazz)
{
char signature[41]; // [sp+7h] [bp-55h]
char name[16]; // [sp+30h] [bp-2Ch]
JNINativeMethod method; // [sp+40h] [bp-1Ch]
int v8; // [sp+4Ch] [bp-10h]
v8 = *(_DWORD *)off_8AC00;
decryptString((unsigned __int8 *)&unk_83ED9, (unsigned __int8 *)name, 0x10u);// doCommandNative
decryptString((unsigned __int8 *)&unk_83EEA, (unsigned __int8 *)signature, 0x29u);// (I[Ljava/lang/Object;)Ljava/lang/Object;
method.name = name;
method.signature = signature;
method.fnPtr = sub_B69C;
return ((int (__fastcall *)(JNIEnv *, jclass, JNINativeMethod *, int))(*env)->RegisterNatives)(env, clazz, &method, 1) >> 31;
}
Π Π΄Π΅ΠΉΡΡΠ²ΠΈΡΠ΅Π»ΡΠ½ΠΎ, ΡΡΡ ΡΠ΅Π³ΠΈΡΡΡΠΈΡΡΠ΅ΡΡΡ Π½Π°ΡΠΈΠ²Π½ΡΠΉ ΠΌΠ΅ΡΠΎΠ΄ Ρ ΠΈΠΌΠ΅Π½Π΅ΠΌ doCommandNative. Π’Π΅ΠΏΠ΅ΡΡ ΠΌΡ Π·Π½Π°Π΅ΠΌ Π΅Π³ΠΎ Π°Π΄ΡΠ΅Ρ. ΠΠΎΡΠΌΠΎΡΡΠΈΠΌ, ΡΡΠΎ ΠΎΠ½ Π΄Π΅Π»Π°Π΅Ρ.
int __fastcall doCommandNative(JNIEnv *env, jobject obj, int command, jarray args)
{
int v5; // r5
struc_2 *a5; // r6
int v9; // r1
int v11; // [sp+Ch] [bp-14h]
int v12; // [sp+10h] [bp-10h]
v5 = 0;
v12 = *(_DWORD *)off_8AC00;
v11 = 0;
a5 = (struc_2 *)malloc(0x14u);
if ( a5 )
{
a5->field_0 = 0;
a5->field_4 = 0;
a5->field_8 = 0;
a5->field_C = 0;
v9 = command % 10000 / 100;
a5->field_0 = command / 10000;
a5->field_4 = v9;
a5->field_8 = command % 100;
a5->field_C = env;
a5->field_10 = args;
v5 = sub_9D60(command / 10000, v9, command % 100, 1, (int)a5, &v11);
}
free(a5);
if ( !v5 && v11 )
sub_7CF34(env, v11, &byte_83ED7);
return v5;
}
ΠΠΎ Π½Π°Π·Π²Π°Π½ΠΈΡ ΠΌΠΎΠΆΠ½ΠΎ Π΄ΠΎΠ³Π°Π΄Π°ΡΡΡΡ, ΡΡΠΎ Π·Π΄Π΅ΡΡ Π½Π°Ρ ΠΎΠ΄ΠΈΡΡΡ ΡΠΎΡΠΊΠ° Π²Ρ ΠΎΠ΄Π° Π²ΡΠ΅Ρ ΡΡΠ½ΠΊΡΠΈΠΉ, ΠΊΠΎΡΠΎΡΡΠ΅ ΡΠ°Π·ΡΠ°Π±ΠΎΡΡΠΈΠΊΠΈ ΡΠ΅ΡΠΈΠ»ΠΈ ΠΏΠ΅ΡΠ΅Π½Π΅ΡΡΠΈ Π² Π½Π°ΡΠΈΠ²Π½ΡΡ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΡ. ΠΠ°Ρ ΠΈΠ½ΡΠ΅ΡΠ΅ΡΡΠ΅Ρ ΡΡΠ½ΠΊΡΠΈΡ Ρ Π½ΠΎΠΌΠ΅ΡΠΎΠΌ 10601.
ΠΠΎ ΠΊΠΎΠ΄Ρ ΠΌΠΎΠΆΠ½ΠΎ ΡΠ²ΠΈΠ΄Π΅ΡΡ, ΡΡΠΎ ΠΈΠ· Π½ΠΎΠΌΠ΅ΡΠ° ΠΊΠΎΠΌΠ°Π½Π΄Ρ ΠΏΠΎΠ»ΡΡΠ°Π΅ΡΡΡ ΡΡΠΈ ΡΠΈΡΠ»Π°: command / 10000, command % 10000 / 100 ΠΈ command % 10, Ρ. Π΅., Π² Π½Π°ΡΠ΅ΠΌ ΡΠ»ΡΡΠ°Π΅, 1, 6 ΠΈ 1. ΠΡΠΈ ΡΡΠΈ ΡΠΈΡΠ»Π°, Π° ΡΠ°ΠΊΠΆΠ΅ ΡΠΊΠ°Π·Π°ΡΠ΅Π»Ρ Π½Π° JNIEnv ΠΈ Π°ΡΠ³ΡΠΌΠ΅Π½ΡΡ, ΠΏΠ΅ΡΠ΅Π΄Π°Π½Π½ΡΠ΅ ΡΡΠ½ΠΊΡΠΈΠΈ, ΡΠΊΠ»Π°Π΄ΡΠ²Π°ΡΡΡΡ Π² ΡΡΡΡΠΊΡΡΡΡ ΠΈ ΠΏΠ΅ΡΠ΅Π΄Π°ΡΡΡΡ Π΄Π°Π»ΡΡΠ΅. Π‘ ΠΏΠΎΠΌΠΎΡΡΡ ΠΏΠΎΠ»ΡΡΠ΅Π½Π½ΡΡ ΡΡΡΡ ΡΠΈΡΠ΅Π» (ΠΎΠ±ΠΎΠ·Π½Π°ΡΠΈΠΌ ΠΈΡ N1, N2 ΠΈ N3) ΡΡΡΠΎΠΈΡΡΡ Π΄Π΅ΡΠ΅Π²ΠΎ ΠΊΠΎΠΌΠ°Π½Π΄.
ΠΡΠΈΠΌΠ΅ΡΠ½ΠΎ ΡΠ°ΠΊΠΎΠ΅:
ΠΠ΅ΡΠ΅Π²ΠΎ Π·Π°ΠΏΠΎΠ»Π½ΡΠ΅ΡΡΡ Π΄ΠΈΠ½Π°ΠΌΠΈΡΠ΅ΡΠΊΠΈ Π² JNI_OnLoad.
Π’ΡΠΈ ΡΠΈΡΠ»Π° ΠΊΠΎΠ΄ΠΈΡΡΡΡ ΠΏΡΡΡ Π² Π΄Π΅ΡΠ΅Π²Π΅. ΠΠ°ΠΆΠ΄ΡΠΉ Π»ΠΈΡΡ Π΄Π΅ΡΠ΅Π²Π° ΡΠΎΠ΄Π΅ΡΠΆΠΈΡ ΠΏΠΎΠΊΡΠΎΡΠ΅Π½Π½ΡΠΉ Π°Π΄ΡΠ΅Ρ ΡΠΎΠΎΡΠ²Π΅ΡΡΡΠ²ΡΡΡΠ΅ΠΉ ΡΡΠ½ΠΊΡΠΈΠΈ. ΠΠ»ΡΡ β Π² ΡΠΎΠ΄ΠΈΡΠ΅Π»ΡΡΠΊΠΎΠΌ ΡΠ·Π»Π΅. ΠΠ°ΠΉΡΠΈ ΠΌΠ΅ΡΡΠΎ Π² ΠΊΠΎΠ΄Π΅, Π³Π΄Π΅ Π² Π΄Π΅ΡΠ΅Π²ΠΎ Π΄ΠΎΠ±Π°Π²Π»ΡΠ΅ΡΡΡ Π½ΡΠΆΠ½Π°Ρ Π½Π°ΠΌ ΡΡΠ½ΠΊΡΠΈΡ, Π½Π΅ ΡΠΎΡΡΠ°Π²Π»ΡΠ΅Ρ Π±ΠΎΠ»ΡΡΠΎΠ³ΠΎ ΡΡΡΠ΄Π°, Π΅ΡΠ»ΠΈ ΡΠ°Π·ΠΎΠ±ΡΠ°ΡΡΡΡ Π²ΠΎ Π²ΡΠ΅Ρ
ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΠΌΡΡ
ΡΡΡΡΠΊΡΡΡΠ°Ρ
(ΠΈΡ
ΠΎΠΏΠΈΡΠ°Π½ΠΈΠ΅ Π½Π΅ ΠΏΡΠΈΠ²ΠΎΠ΄ΠΈΠΌ, ΡΡΠΎΠ±Ρ Π½Π΅ ΡΠ°Π·Π΄ΡΠ²Π°ΡΡ ΠΈ Π±Π΅Π· ΡΠΎΠ³ΠΎ Π½Π΅ΠΌΠ°Π»Π΅Π½ΡΠΊΡΡ ΡΡΠ°ΡΡΡ).
ΠΡΡ ΠΎΠ±ΡΡΡΠΊΠ°ΡΠΈΡ
ΠΡ ΠΏΠΎΠ»ΡΡΠΈΠ»ΠΈ Π°Π΄ΡΠ΅Ρ ΡΡΠ½ΠΊΡΠΈΠΈ, ΠΊΠΎΡΠΎΡΠ°Ρ Π΄ΠΎΠ»ΠΆΠ½Π° ΡΠ°ΡΡΠΈΡΡΠΎΠ²ΡΠ²Π°ΡΡ ΡΡΠ°ΡΠΈΠΊ: 0x5F1AC. ΠΠΎ ΡΠ°Π΄ΠΎΠ²Π°ΡΡΡΡ ΠΏΠΎΠΊΠ° ΡΠ°Π½ΠΎ: ΡΠ°Π·ΡΠ°Π±ΠΎΡΡΠΈΠΊΠΈ UC Browser ΠΏΡΠΈΠ³ΠΎΡΠΎΠ²ΠΈΠ»ΠΈ Π΄Π»Ρ Π½Π°Ρ Π΅ΡΡ ΠΎΠ΄ΠΈΠ½ ΡΡΡΠΏΡΠΈΠ·.
ΠΠΎΡΠ»Π΅ ΠΏΠΎΠ»ΡΡΠ΅Π½ΠΈΡ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠΎΠ² ΠΈΠ· ΠΌΠ°ΡΡΠΈΠ²Π°, ΠΊΠΎΡΠΎΡΡΠΉ Π±ΡΠ» ΡΡΠΎΡΠΌΠΈΡΠΎΠ²Π°Π½ Π² Java-ΠΊΠΎΠ΄Π΅, ΠΏΠΎΠΏΠ°Π΄Π°Π΅ΠΌ
Π² ΡΡΠ½ΠΊΡΠΈΡ ΠΏΠΎ Π°Π΄ΡΠ΅ΡΡ 0x4D070. Π ΡΡΡ Π½Π°Ρ ΠΆΠ΄ΡΡ Π΅ΡΡ ΠΎΠ΄ΠΈΠ½ Π²ΠΈΠ΄ ΠΎΠ±ΡΡΡΠΊΠ°ΡΠΈΠΈ ΠΊΠΎΠ΄Π°.
ΠΠ»Π°Π΄ΡΠΌ Π² R7 ΠΈ R4 Π΄Π²Π° ΠΈΠ½Π΄Π΅ΠΊΡΠ°:
ΠΠ΅ΡΠ΅ΠΊΠ»Π°Π΄ΡΠ²Π°Π΅ΠΌ ΠΏΠ΅ΡΠ²ΡΠΉ ΠΈΠ½Π΄Π΅ΠΊΡ Π² R11:
Π§ΡΠΎΠ±Ρ ΠΏΠΎΠ»ΡΡΠΈΡΡ Π°Π΄ΡΠ΅Ρ ΠΈΠ· ΡΠ°Π±Π»ΠΈΡΡ, ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΠΌ ΠΈΠ½Π΄Π΅ΠΊΡ:
ΠΠΎΡΠ»Π΅ ΠΏΠ΅ΡΠ΅Ρ
ΠΎΠ΄Π° ΠΏΠΎ ΠΏΠ΅ΡΠ²ΠΎΠΌΡ Π°Π΄ΡΠ΅ΡΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΡΡ Π²ΡΠΎΡΠΎΠΉ ΠΈΠ½Π΄Π΅ΠΊΡ, ΠΊΠΎΡΠΎΡΡΠΉ Π² R4. Π ΡΠ°Π±Π»ΠΈΡΠ΅ 230 ΡΠ»Π΅ΠΌΠ΅Π½ΡΠΎΠ².
Π§ΡΠΎ Ρ ΡΡΠΈΠΌ Π΄Π΅Π»Π°ΡΡ? ΠΠΎΠΆΠ½ΠΎ ΡΠΊΠ°Π·Π°ΡΡ IDA, ΡΡΠΎ ΡΡΠΎ ΡΠ°ΠΊΠΎΠΉ switch: Edit -> Other -> Specify switch idiom.
ΠΠΎΠ»ΡΡΠΈΠ²ΡΠΈΠΉΡΡ ΠΊΠΎΠ΄ ΡΡΡΠ°ΡΠ΅Π½. ΠΠΎ, ΠΏΡΠΎΠ±ΠΈΡΠ°ΡΡΡ ΡΠ΅ΡΠ΅Π· Π΅Π³ΠΎ Π΄Π΅Π±ΡΠΈ, ΠΌΠΎΠΆΠ½ΠΎ Π·Π°ΠΌΠ΅ΡΠΈΡΡ Π²ΡΠ·ΠΎΠ² ΡΠΆΠ΅ Π·Π½Π°ΠΊΠΎΠΌΠΎΠΉ Π½Π°ΠΌ ΡΡΠ½ΠΊΡΠΈΠΈ sub_6115C:
Π’Π°ΠΌ Π±ΡΠ» switch, Π² ΠΊΠΎΡΠΎΡΠΎΠΌ Π² case 3 Π½Π°Ρ
ΠΎΠ΄ΠΈΠ»Π°ΡΡ ΡΠ°ΡΡΠΈΡΡΠΎΠ²ΠΊΠ° Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ΠΌ Π°Π»Π³ΠΎΡΠΈΡΠΌΠ° RC4. Π Π² ΡΡΠΎΠΌ ΡΠ»ΡΡΠ°Π΅ ΠΏΠ΅ΡΠ΅Π΄Π°Π²Π°Π΅ΠΌΠ°Ρ Π² ΡΡΠ½ΠΊΡΠΈΡ ΡΡΡΡΠΊΡΡΡΠ° Π·Π°ΠΏΠΎΠ»Π½ΡΠ΅ΡΡΡ ΠΈΠ· ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠΎΠ², ΠΏΠ΅ΡΠ΅Π΄Π°Π½Π½ΡΡ
Π² doCommandNative. ΠΡΠΏΠΎΠΌΠΈΠ½Π°Π΅ΠΌ, ΡΡΠΎ Ρ Π½Π°Ρ ΡΠ°ΠΌ Π±ΡΠ» magicInt ΡΠΎ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ΠΌ 16. Π‘ΠΌΠΎΡΡΠΈΠΌ ΡΠΎΠΎΡΠ²Π΅ΡΡΡΠ²ΡΡΡΠΈΠΉ case β ΠΈ ΠΏΠΎΡΠ»Π΅ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΈΡ
ΠΏΠ΅ΡΠ΅Ρ
ΠΎΠ΄ΠΎΠ² Π½Π°Ρ
ΠΎΠ΄ΠΈΠΌ ΠΊΠΎΠ΄, ΠΏΠΎ ΠΊΠΎΡΠΎΡΠΎΠΌΡ ΠΌΠΎΠΆΠ½ΠΎ ΠΎΠΏΠΎΠ·Π½Π°ΡΡ Π°Π»Π³ΠΎΡΠΈΡΠΌ.
ΠΡΠΎ AES!
ΠΠ»Π³ΠΎΡΠΈΡΠΌ Π΅ΡΡΡ, ΠΎΡΡΠ°Π»ΠΎΡΡ ΠΏΠΎΠ»ΡΡΠΈΡΡ Π΅Π³ΠΎ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΡ: ΡΠ΅ΠΆΠΈΠΌ, ΠΊΠ»ΡΡ ΠΈ, Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ, Π²Π΅ΠΊΡΠΎΡ ΠΈΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·Π°ΡΠΈΠΈ (Π΅Π³ΠΎ Π½Π°Π»ΠΈΡΠΈΠ΅ Π·Π°Π²ΠΈΡΠΈΡ ΠΎΡ ΡΠ΅ΠΆΠΈΠΌΠ° ΡΠ°Π±ΠΎΡΡ Π°Π»Π³ΠΎΡΠΈΡΠΌΠ° AES). Π‘ΡΡΡΠΊΡΡΡΠ° Ρ Π½ΠΈΠΌΠΈ Π΄ΠΎΠ»ΠΆΠ½Π° ΡΠΎΡΠΌΠΈΡΠΎΠ²Π°ΡΡΡΡ Π³Π΄Π΅-ΡΠΎ ΠΏΠ΅ΡΠ΅Π΄ Π²ΡΠ·ΠΎΠ²ΠΎΠΌ ΡΡΠ½ΠΊΡΠΈΠΈ sub_6115C, Π½ΠΎ ΡΡΠ° ΡΠ°ΡΡΡ ΠΊΠΎΠ΄Π° ΠΎΠ±ΡΡΡΡΠΈΡΠΎΠ²Π°Π½Π° ΠΎΡΠΎΠ±Π΅Π½Π½ΠΎ Ρ ΠΎΡΠΎΡΠΎ, ΠΏΠΎΡΡΠΎΠΌΡ Π²ΠΎΠ·Π½ΠΈΠΊΠ°Π΅Ρ ΠΈΠ΄Π΅Ρ ΠΏΡΠΎΠΏΠ°ΡΡΠΈΡΡ ΠΊΠΎΠ΄, ΡΡΠΎΠ±Ρ Π²ΡΠ΅ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΡ ΡΡΠ½ΠΊΡΠΈΠΈ ΡΠ°ΡΡΠΈΡΡΠΎΠ²ΠΊΠΈ Π΄Π°ΠΌΠΏΠΈΠ»ΠΈΡΡ Π² ΡΠ°ΠΉΠ».
ΠΠ°ΡΡ
Π§ΡΠΎΠ±Ρ Π½Π΅ ΠΏΠΈΡΠ°ΡΡ Π²Π΅ΡΡ ΠΊΠΎΠ΄ ΠΏΠ°ΡΡΠ° Π½Π° ΡΠ·ΡΠΊΠ΅ Π°ΡΡΠ΅ΠΌΠ±Π»Π΅ΡΠ° Π²ΡΡΡΠ½ΡΡ, ΠΌΠΎΠΆΠ½ΠΎ Π·Π°ΠΏΡΡΡΠΈΡΡ Android Studio, Π½Π°ΠΏΠΈΡΠ°ΡΡ ΡΠ°ΠΌ ΡΡΠ½ΠΊΡΠΈΡ, ΠΊΠΎΡΠΎΡΠ°Ρ ΠΏΠΎΠ»ΡΡΠ°Π΅Ρ Π½Π° Π²Ρ ΠΎΠ΄ ΡΠ°ΠΊΠΈΠ΅ ΠΆΠ΅ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΡ, ΠΊΠ°ΠΊ Ρ Π½Π°ΡΠ΅ΠΉ ΡΡΠ½ΠΊΡΠΈΠΈ ΡΠ°ΡΡΠΈΡΡΠΎΠ²ΠΊΠΈ, ΠΈ ΠΏΠΈΡΠ΅Ρ Π² ΡΠ°ΠΉΠ», ΠΏΠΎΡΠ»Π΅ ΡΠ΅Π³ΠΎ ΡΠΊΠΎΠΏΠΈΠΏΠ°ΡΡΠΈΡΡ ΠΊΠΎΠ΄, ΠΊΠΎΡΠΎΡΡΠΉ ΡΠ³Π΅Π½Π΅ΡΠΈΡΡΠ΅Ρ ΠΊΠΎΠΌΠΏΠΈΠ»ΡΡΠΎΡ.
ΠΠ± ΡΠ΄ΠΎΠ±ΡΡΠ²Π΅ Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΡ ΠΊΠΎΠ΄Π° Π½Π°ΡΠΈ Π΄ΡΡΠ·ΡΡ ΠΈΠ· ΠΊΠΎΠΌΠ°Π½Π΄Ρ UC Browser ΡΠΎΠΆΠ΅ Β«ΠΏΠΎΠ·Π°Π±ΠΎΡΠΈΠ»ΠΈΡΡΒ». ΠΡΠΏΠΎΠΌΠΈΠ½Π°Π΅ΠΌ, ΡΡΠΎ Π² Π½Π°ΡΠ°Π»Π΅ ΠΊΠ°ΠΆΠ΄ΠΎΠΉ ΡΡΠ½ΠΊΡΠΈΠΈ Ρ Π½Π°Ρ ΠΌΡΡΠΎΡΠ½ΡΠΉ ΠΊΠΎΠ΄, ΠΊΠΎΡΠΎΡΡΠΉ Π»Π΅Π³ΠΊΠΎ ΠΌΠΎΠΆΠ½ΠΎ Π·Π°ΠΌΠ΅Π½ΠΈΡΡ Π½Π° Π»ΡΠ±ΠΎΠΉ Π΄ΡΡΠ³ΠΎΠΉ. ΠΡΠ΅Π½Ρ ΡΠ΄ΠΎΠ±Π½ΠΎ π ΠΡΠ°Π²Π΄Π°, Π² Π½Π°ΡΠ°Π»Π΅ ΡΠ΅Π»Π΅Π²ΠΎΠΉ ΡΡΠ½ΠΊΡΠΈΠΈ ΠΌΠ΅ΡΡΠ° Π΄Π»Ρ ΠΊΠΎΠ΄Π°, ΠΊΠΎΡΠΎΡΡΠΉ ΡΠΎΡ ΡΠ°Π½ΡΠ΅Ρ Π²ΡΠ΅ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΡ Π² ΡΠ°ΠΉΠ», ΠΌΠ°Π»ΠΎΠ²Π°ΡΠΎ. ΠΡΠΈΡΠ»ΠΎΡΡ ΡΠ°Π·Π΄Π΅Π»ΠΈΡΡ Π΅Π³ΠΎ Π½Π° ΡΠ°ΡΡΠΈ ΠΈ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ ΠΌΡΡΠΎΡΠ½ΡΠ΅ Π±Π»ΠΎΠΊΠΈ ΡΠΎΡΠ΅Π΄Π½ΠΈΡ ΡΡΠ½ΠΊΡΠΈΠΉ. ΠΡΠ΅Π³ΠΎ ΠΏΠΎΠ»ΡΡΠΈΠ»ΠΎΡΡ ΡΠ΅ΡΡΡΠ΅ ΡΠ°ΡΡΠΈ.
ΠΠ΅ΡΠ²Π°Ρ ΡΠ°ΡΡΡ:
Π Π°ΡΡ
ΠΈΡΠ΅ΠΊΡΡΡΠ΅ ARM ΠΏΠ΅ΡΠ²ΡΠ΅ ΡΠ΅ΡΡΡΠ΅ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠ° ΡΡΠ½ΠΊΡΠΈΠΈ ΠΏΠ΅ΡΠ΅Π΄Π°ΡΡΡΡ ΡΠ΅ΡΠ΅Π· ΡΠ΅Π³ΠΈΡΡΡΡ R0-R3, ΠΎΡΡΠ°Π»ΡΠ½ΡΠ΅, Π΅ΡΠ»ΠΈ ΠΎΠ½ΠΈ Π΅ΡΡΡ β ΡΠ΅ΡΠ΅Π· ΡΡΠ΅ΠΊ. Π ΡΠ΅Π³ΠΈΡΡΡΠ΅ LR ΠΏΠ΅ΡΠ΅Π΄Π°ΡΡΡΡ Π°Π΄ΡΠ΅Ρ Π²ΠΎΠ·Π²ΡΠ°ΡΠ°. ΠΡΡ ΡΡΠΎ Π½ΡΠΆΠ½ΠΎ ΡΠΎΡ
ΡΠ°Π½ΠΈΡΡ Π΄Π»Ρ ΡΠΎΠ³ΠΎ, ΡΡΠΎΠ±Ρ ΡΡΠ½ΠΊΡΠΈΡ ΠΌΠΎΠ³Π»Π° ΠΎΡΡΠ°Π±ΠΎΡΠ°ΡΡ ΠΏΠΎΡΠ»Π΅ ΡΠΎΠ³ΠΎ, ΠΊΠ°ΠΊ ΠΌΡ ΡΠ΄Π°ΠΌΠΏΠΈΠΌ Π΅Ρ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΡ. Π’Π°ΠΊΠΆΠ΅ Π½ΡΠΆΠ½ΠΎ ΡΠΎΡ
ΡΠ°Π½ΠΈΡΡ Π²ΡΠ΅ ΡΠ΅Π³ΠΈΡΡΡΡ, ΠΊΠΎΡΠΎΡΡΠ΅ ΠΌΡ Π±ΡΠ΄Π΅ΠΌ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ Π² ΠΏΡΠΎΡΠ΅ΡΡΠ΅, ΠΏΠΎΡΡΠΎΠΌΡ Π΄Π΅Π»Π°Π΅ΠΌ PUSH.W {R0-R10,LR}. Π R7 Ρ Π½Π°Ρ ΠΏΠΎΠ»ΡΡΠ°Π΅ΡΡΡ Π°Π΄ΡΠ΅Ρ ΡΠΏΠΈΡΠΊΠ° ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠΎΠ², ΠΏΠ΅ΡΠ΅Π΄Π°Π½Π½ΡΡ
ΡΡΠ½ΠΊΡΠΈΠΈ ΡΠ΅ΡΠ΅Π· ΡΡΠ΅ΠΊ.
Π‘ ΠΏΠΎΠΌΠΎΡΡΡ ΡΡΠ½ΠΊΡΠΈΠΈ fopen ΠΎΡΠΊΡΠΎΠ΅ΠΌ ΡΠ°ΠΉΠ» /data/local/tmp/aes Π² ΡΠ΅ΠΆΠΈΠΌΠ΅ Β«abΒ»,
Ρ. Π΅. Π½Π° Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΠ΅. Π R0 Π·Π°Π³ΡΡΠΆΠ°Π΅ΠΌ Π°Π΄ΡΠ΅Ρ ΠΈΠΌΠ΅Π½ΠΈ ΡΠ°ΠΉΠ»Π°, Π² R1 β Π°Π΄ΡΠ΅Ρ ΡΡΡΠΎΠΊΠΈ Ρ ΡΠΊΠ°Π·Π°Π½ΠΈΠ΅ΠΌ ΡΠ΅ΠΆΠΈΠΌΠ°. Π ΡΡΡ ΠΌΡΡΠΎΡΠ½ΡΠΉ ΠΊΠΎΠ΄ Π·Π°ΠΊΠ°Π½ΡΠΈΠ²Π°Π΅ΡΡΡ, ΠΏΠΎΡΡΠΎΠΌΡ ΠΏΠ΅ΡΠ΅Ρ
ΠΎΠ΄ΠΈΠΌ Π² ΡΠ»Π΅Π΄ΡΡΡΡΡ ΡΡΠ½ΠΊΡΠΈΡ. Π§ΡΠΎΠ±Ρ ΠΎΠ½Π° ΠΏΡΠΎΠ΄ΠΎΠ»ΠΆΠ°Π»Π° ΡΠ°Π±ΠΎΡΠ°ΡΡ, ΡΡΠ°Π²ΠΈΠΌ Π² Π½Π°ΡΠ°Π»ΠΎ ΠΏΠ΅ΡΠ΅Ρ
ΠΎΠ΄ Π½Π° Π½Π°ΡΡΠΎΡΡΠΈΠΉ ΠΊΠΎΠ΄ ΡΡΠ½ΠΊΡΠΈΠΈ Π² ΠΎΠ±Ρ
ΠΎΠ΄ ΠΌΡΡΠΎΡΠ°, Π° Π²ΠΌΠ΅ΡΡΠΎ ΠΌΡΡΠΎΡΠ° Π΄ΠΎΠ±Π°Π²Π»ΡΠ΅ΠΌ ΠΏΡΠΎΠ΄ΠΎΠ»ΠΆΠ΅Π½ΠΈΠ΅ ΠΏΠ°ΡΡΠ°.
ΠΡΠ·ΡΠ²Π°Π΅ΠΌ fopen.
ΠΠ΅ΡΠ²ΡΠ΅ ΡΡΠΈ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠ° ΡΡΠ½ΠΊΡΠΈΠΈ aes ΠΈΠΌΠ΅ΡΡ ΡΠΈΠΏ int. Π’Π°ΠΊ ΠΊΠ°ΠΊ ΠΌΡ Π² Π½Π°ΡΠ°Π»Π΅ ΡΠΎΡ ΡΠ°Π½ΠΈΠ»ΠΈ ΡΠ΅Π³ΠΈΡΡΡΡ Π² ΡΡΠ΅ΠΊ, ΠΌΠΎΠΆΠ½ΠΎ ΠΏΡΠΎΡΡΠΎ ΠΏΠ΅ΡΠ΅Π΄Π°ΡΡ ΡΡΠ½ΠΊΡΠΈΠΈ fwrite ΠΈΡ Π°Π΄ΡΠ΅ΡΠ° Π² ΡΡΠ΅ΠΊΠ΅.
ΠΠ°Π»ΡΡΠ΅ Ρ Π½Π°Ρ Π΅ΡΡΡ ΡΡΠΈ ΡΡΡΡΠΊΡΡΡΡ, ΠΊΠΎΡΠΎΡΡΠ΅ ΡΠΎΠ΄Π΅ΡΠΆΠ°Ρ ΡΠ°Π·ΠΌΠ΅Ρ Π΄Π°Π½Π½ΡΡ
ΠΈ ΡΠΊΠ°Π·Π°ΡΠ΅Π»Ρ Π½Π° Π΄Π°Π½Π½ΡΠ΅ Π΄Π»Ρ ΠΊΠ»ΡΡΠ°, Π²Π΅ΠΊΡΠΎΡΠ° ΠΈΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·Π°ΡΠΈΠΈ ΠΈ Π·Π°ΡΠΈΡΡΠΎΠ²Π°Π½Π½ΡΡ
Π΄Π°Π½Π½ΡΡ
.
Π ΠΊΠΎΠ½ΡΠ΅ Π·Π°ΠΊΡΡΠ²Π°Π΅ΠΌ ΡΠ°ΠΉΠ», Π²ΠΎΡΡΡΠ°Π½Π°Π²Π»ΠΈΠ²Π°Π΅ΠΌ ΡΠ΅Π³ΠΈΡΡΡΡ ΠΈ ΠΏΠ΅ΡΠ΅Π΄Π°ΡΠΌ ΡΠΏΡΠ°Π²Π»Π΅Π½ΠΈΠ΅ Π½Π°ΡΡΠΎΡΡΠ΅ΠΉ ΡΡΠ½ΠΊΡΠΈΠΈ aes.
Π‘ΠΎΠ±ΠΈΡΠ°Π΅ΠΌ APK Ρ ΠΏΡΠΎΠΏΠ°ΡΡΠ΅Π½Π½ΠΎΠΉ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠΎΠΉ, ΠΏΠΎΠ΄ΠΏΠΈΡΡΠ²Π°Π΅ΠΌ, Π·Π°ΠΊΠΈΠ΄ΡΠ²Π°Π΅ΠΌ Π½Π° ΡΡΡΡΠΎΠΉΡΡΠ²ΠΎ/ΡΠΌΡΠ»ΡΡΠΎΡ, Π·Π°ΠΏΡΡΠΊΠ°Π΅ΠΌ. ΠΠΈΠ΄ΠΈΠΌ, ΡΡΠΎ Π½Π°Ρ Π΄Π°ΠΌΠΏ ΡΠΎΠ·Π΄Π°ΡΡΡΡ, ΠΈ ΡΡΠ΄Π° ΠΏΠΈΡΠ΅ΡΡΡ ΠΌΠ½ΠΎΠ³ΠΎ Π΄Π°Π½Π½ΡΡ . ΠΡΠ°ΡΠ·Π΅Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅Ρ ΡΠΈΡΡΠΎΠ²Π°Π½ΠΈΠ΅ Π½Π΅ ΡΠΎΠ»ΡΠΊΠΎ Π΄Π»Ρ ΡΡΠ°ΡΠΈΠΊΠ°, ΠΈ Π²ΡΡ ΡΠΈΡΡΠΎΠ²Π°Π½ΠΈΠ΅ ΠΈΠ΄ΡΡ ΡΠ΅ΡΠ΅Π· ΡΠ°ΡΡΠΌΠ°ΡΡΠΈΠ²Π°Π΅ΠΌΡΡ ΡΡΠ½ΠΊΡΠΈΡ. Π Π½ΡΠΆΠ½ΡΡ Π΄Π°Π½Π½ΡΡ ΠΏΠΎΡΠ΅ΠΌΡ-ΡΠΎ Π½Π΅Ρ, ΠΈ Π² ΡΡΠ°ΡΠΈΠΊΠ΅ Π½Π΅ Π²ΠΈΠ΄Π½ΠΎ Π½ΡΠΆΠ½ΠΎΠ³ΠΎ Π·Π°ΠΏΡΠΎΡΠ°. Π§ΡΠΎΠ±Ρ Π½Π΅ ΠΆΠ΄Π°ΡΡ, ΠΏΠΎΠΊΠ° UC Browser ΡΠΎΠΈΠ·Π²ΠΎΠ»ΠΈΡ ΡΠ΄Π΅Π»Π°ΡΡ Π½ΡΠΆΠ½ΡΠΉ Π·Π°ΠΏΡΠΎΡ, Π²ΠΎΠ·ΡΠΌΡΠΌ Π·Π°ΡΠΈΡΡΠΎΠ²Π°Π½Π½ΡΠΉ ΠΎΡΠ²Π΅Ρ ΠΎΡ ΡΠ΅ΡΠ²Π΅ΡΠ°, ΠΏΠΎΠ»ΡΡΠ΅Π½Π½ΡΠΉ ΡΠ°Π½Π΅Π΅, ΠΈ ΠΏΡΠΎΠΏΠ°ΡΡΠΈΠΌ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Π΅ΡΡ ΡΠ°Π·: Π΄ΠΎΠ±Π°Π²ΠΈΠΌ ΡΠ°ΡΡΠΈΡΡΠΎΠ²ΠΊΡ Π² onCreate Π³Π»Π°Π²Π½ΠΎΠΉ Π°ΠΊΡΠΈΠ²ΠΈΡΠΈ.
const/16 v1, 0x62
new-array v1, v1, [B
fill-array-data v1, :encrypted_data
const/16 v0, 0x1f
invoke-static {v0, v1}, Lcom/uc/browser/core/d/c/g;->j(I[B)[B
move-result-object v1
array-length v2, v1
invoke-static {v2}, Ljava/lang/String;->valueOf(I)Ljava/lang/String;
move-result-object v2
const-string v0, "ololo"
invoke-static {v0, v2}, Landroid/util/Log;->d(Ljava/lang/String;Ljava/lang/String;)I
Π‘ΠΎΠ±ΠΈΡΠ°Π΅ΠΌ, ΠΏΠΎΠ΄ΠΏΠΈΡΡΠ²Π°Π΅ΠΌ, ΡΡΡΠ°Π½Π°Π²Π»ΠΈΠ²Π°Π΅ΠΌ, Π·Π°ΠΏΡΡΠΊΠ°Π΅ΠΌ. ΠΠΎΠ»ΡΡΠ°Π΅ΠΌ NullPointerException, Ρ. ΠΊ. ΠΌΠ΅ΡΠΎΠ΄ Π²Π΅ΡΠ½ΡΠ» null.
Π Ρ ΠΎΠ΄Π΅ Π΄Π°Π»ΡΠ½Π΅ΠΉΡΠ΅Π³ΠΎ Π°Π½Π°Π»ΠΈΠ·Π° ΠΊΠΎΠ΄Π° Π±ΡΠ»Π° ΠΎΠ±Π½Π°ΡΡΠΆΠ΅Π½Π° ΡΡΠ½ΠΊΡΠΈΡ, Π² ΠΊΠΎΡΠΎΡΠΎΠΉ ΡΠ°ΡΡΠΈΡΡΠΎΠ²ΡΠ²Π°ΡΡΡΡ ΠΈΠ½ΡΠ΅ΡΠ΅ΡΠ½ΡΠ΅ ΡΡΡΠΎΡΠΊΠΈ: Β«META-INF/Β» ΠΈ «.RSA». ΠΠΎΡ ΠΎΠΆΠ΅, ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ ΠΏΡΠΎΠ²Π΅ΡΡΠ΅Ρ ΡΠ²ΠΎΠΉ ΡΠ΅ΡΡΠΈΡΠΈΠΊΠ°Ρ. ΠΠ»ΠΈ Π΄Π°ΠΆΠ΅ Π³Π΅Π½Π΅ΡΠΈΡΡΠ΅Ρ ΠΊΠ»ΡΡΠΈ ΠΈΠ· Π½Π΅Π³ΠΎ. Π Π°Π·Π±ΠΈΡΠ°ΡΡΡΡ Ρ ΡΠ΅ΠΌ, ΡΡΠΎ ΠΏΡΠΎΠΈΡΡ ΠΎΠ΄ΠΈΡ Ρ ΡΠ΅ΡΡΠΈΡΠΈΠΊΠ°ΡΠΎΠΌ, ΡΠΎΠ²ΡΠ΅ΠΌ Π½Π΅ Ρ ΠΎΡΠ΅ΡΡΡ, ΠΏΠΎΡΡΠΎΠΌΡ ΠΏΡΠΎΡΡΠΎ ΠΏΠΎΠ΄ΡΡΠ½Π΅ΠΌ Π΅ΠΌΡ ΠΏΡΠ°Π²ΠΈΠ»ΡΠ½ΡΠΉ ΡΠ΅ΡΡΠΈΡΠΈΠΊΠ°Ρ. ΠΡΠΎΠΏΠ°ΡΡΠΈΠΌ Π·Π°ΡΠΈΡΡΠΎΠ²Π°Π½Π½ΡΡ ΡΡΡΠΎΡΠΊΡ ΡΠ°ΠΊΠΈΠΌ ΠΎΠ±ΡΠ°Π·ΠΎΠΌ, ΡΡΠΎΠ±Ρ Π²ΠΌΠ΅ΡΡΠΎ Β«META-INF/Β» ΠΏΠΎΠ»ΡΡΠΈΠ»ΠΎΡΡ Β«BLABLINF/Β», ΡΠΎΠ·Π΄Π°Π΄ΠΈΠΌ ΠΏΠ°ΠΏΠΊΡ Ρ ΡΠ°ΠΊΠΈΠΌ ΠΈΠΌΠ΅Π½Π΅ΠΌ Π² APK ΠΈ ΠΏΠΎΠ΄ΠΊΠΈΠ½Π΅ΠΌ ΡΡΠ΄Π° ΡΠ΅ΡΡΠΈΡΠΈΠΊΠ°Ρ Π±Π΅Π»ΠΊΠΎΠ±ΡΠ°ΡΠ·Π΅ΡΠ°.
Π‘ΠΎΠ±ΠΈΡΠ°Π΅ΠΌ, ΠΏΠΎΠ΄ΠΏΠΈΡΡΠ²Π°Π΅ΠΌ, ΡΡΡΠ°Π½Π°Π²Π»ΠΈΠ²Π°Π΅ΠΌ, Π·Π°ΠΏΡΡΠΊΠ°Π΅ΠΌ. ΠΠΈΠ½Π³ΠΎ! ΠΠ»ΡΡ Ρ Π½Π°Ρ!
MitM
ΠΡ ΠΏΠΎΠ»ΡΡΠΈΠ»ΠΈ ΠΊΠ»ΡΡ ΠΈ Π²Π΅ΠΊΡΠΎΡ ΠΈΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·Π°ΡΠΈΠΈ, ΡΠ°Π²Π½ΡΠΉ ΠΊΠ»ΡΡΡ. ΠΠΎΠΏΡΠΎΠ±ΡΠ΅ΠΌ ΡΠ°ΡΡΠΈΡΡΠΎΠ²Π°ΡΡ ΠΎΡΠ²Π΅Ρ ΡΠ΅ΡΠ²Π΅ΡΠ° Π² ΡΠ΅ΠΆΠΈΠΌΠ΅ CBC.
ΠΠΈΠ΄ΠΈΠΌ URL Π°ΡΡ
ΠΈΠ²Π°, ΡΡΠΎ-ΡΠΎ ΠΏΠΎΡ
ΠΎΠΆΠ΅Π΅ Π½Π° MD5, Β«extract_unzipsizeΒ» ΠΈ ΡΠΈΡΠ»ΠΎ. ΠΡΠΎΠ²Π΅ΡΡΠ΅ΠΌ: MD5 Π°ΡΡ
ΠΈΠ²Π° ΡΠΎΠ²ΠΏΠ°Π΄Π°Π΅Ρ, ΡΠ°Π·ΠΌΠ΅Ρ ΡΠ°ΡΠΏΠ°ΠΊΠΎΠ²Π°Π½Π½ΠΎΠΉ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠΈ ΡΠΎΠ²ΠΏΠ°Π΄Π°Π΅Ρ. ΠΡΠΎΠ±ΡΠ΅ΠΌ ΠΏΡΠΎΠΏΠ°ΡΡΠΈΡΡ ΡΡΡ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΡ ΠΈ ΠΎΡΠ΄Π°ΡΡ Π΅Ρ Π±ΡΠ°ΡΠ·Π΅ΡΡ. Π§ΡΠΎΠ±Ρ ΠΏΠΎΠΊΠ°Π·Π°ΡΡ, ΡΡΠΎ Π½Π°ΡΠ° ΠΏΡΠΎΠΏΠ°ΡΡΠ΅Π½Π½Π°Ρ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠ° Π·Π°Π³ΡΡΠ·ΠΈΠ»Π°ΡΡ, Π±ΡΠ΄Π΅ΠΌ Π·Π°ΠΏΡΡΠΊΠ°ΡΡ Intent Π½Π° ΡΠΎΠ·Π΄Π°Π½ΠΈΠ΅ Π‘ΠΠ‘ Ρ ΡΠ΅ΠΊΡΡΠΎΠΌ Β«PWNED!Β». ΠΠΎΠ΄ΠΌΠ΅Π½ΡΡΡ Π±ΡΠ΄Π΅ΠΌ Π΄Π²Π° ΠΎΡΠ²Π΅ΡΠ° ΠΎΡ ΡΠ΅ΡΠ²Π΅ΡΠ°:
ΠΡΠ°ΡΠ·Π΅Ρ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΎ ΡΠ°Π· ΠΏΡΡΠ°Π΅ΡΡΡ ΡΠΊΠ°ΡΠ°ΡΡ Π°ΡΡ
ΠΈΠ², ΠΏΠΎΡΠ»Π΅ ΡΠ΅Π³ΠΎ Π²ΡΠ΄Π°ΡΡ ΠΎΡΠΈΠ±ΠΊΡ. ΠΠΈΠ΄ΠΈΠΌΠΎ, ΡΡΠΎ-ΡΠΎ
Π΅ΠΌΡ Π½Π΅ Π½ΡΠ°Π²ΠΈΡΡΡ. Π ΡΠ΅Π·ΡΠ»ΡΡΠ°ΡΠ΅ Π°Π½Π°Π»ΠΈΠ·Π° ΡΡΠΎΠ³ΠΎ ΠΌΡΡΠ½ΠΎΠ³ΠΎ ΡΠΎΡΠΌΠ°ΡΠ° Π²ΡΡΡΠ½ΠΈΠ»ΠΎΡΡ, ΡΡΠΎ ΡΠ΅ΡΠ²Π΅Ρ ΠΏΠ΅ΡΠ΅Π΄Π°ΡΡ Π΅ΡΡ ΡΠ°Π·ΠΌΠ΅Ρ Π°ΡΡ
ΠΈΠ²Π°:
ΠΠ½ Π·Π°ΠΊΠΎΠ΄ΠΈΡΠΎΠ²Π°Π½ Π² LEB128. ΠΠΎΡΠ»Π΅ ΠΏΠ°ΡΡΠ° ΡΠ°Π·ΠΌΠ΅Ρ Π°ΡΡ
ΠΈΠ²Π° Ρ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠΎΠΉ Π½Π΅ΠΌΠ½ΠΎΠ³ΠΎ ΠΈΠ·ΠΌΠ΅Π½ΠΈΠ»ΡΡ, ΠΏΠΎΡΡΠΎΠΌΡ Π±ΡΠ°ΡΠ·Π΅Ρ ΠΏΠΎΡΡΠΈΡΠ°Π», ΡΡΠΎ Π°ΡΡ
ΠΈΠ² ΡΠΊΠ°ΡΠ°Π»ΡΡ ΠΊΡΠΈΠ²ΠΎ, ΠΈ ΠΏΠΎΡΠ»Π΅ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΈΡ
ΠΏΠΎΠΏΡΡΠΎΠΊ Π²ΡΠ΄Π°Π» ΠΎΡΠΈΠ±ΠΊΡ.
ΠΡΠ°Π²ΠΈΠΌ ΡΠ°Π·ΠΌΠ΅Ρ Π°ΡΡ ΠΈΠ²Π°β¦ Π β ΠΏΠΎΠ±Π΅Π΄Π°! π Π Π΅Π·ΡΠ»ΡΡΠ°Ρ Π½Π° Π²ΠΈΠ΄Π΅ΠΎ.
ΠΠΎΡΠ»Π΅Π΄ΡΡΠ²ΠΈΡ ΠΈ ΡΠ΅Π°ΠΊΡΠΈΡ ΡΠ°Π·ΡΠ°Π±ΠΎΡΡΠΈΠΊΠ°
Π’ΠΎΡΠ½ΠΎ ΡΠ°ΠΊΠΈΠΌ ΠΆΠ΅ ΠΎΠ±ΡΠ°Π·ΠΎΠΌ Ρ Π°ΠΊΠ΅ΡΡ ΠΌΠΎΠ³Π»ΠΈ Π±Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ Π½Π΅Π±Π΅Π·ΠΎΠΏΠ°ΡΠ½ΡΡ ΡΡΠ½ΠΊΡΠΈΡ UC Browser, ΡΡΠΎΠ±Ρ ΡΠ°ΡΠΏΡΠΎΡΡΡΠ°Π½ΡΡΡ ΠΈ Π·Π°ΠΏΡΡΠΊΠ°ΡΡ Π²ΡΠ΅Π΄ΠΎΠ½ΠΎΡΠ½ΡΠ΅ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠΈ. ΠΡΠΈ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠΈ Π±ΡΠ΄ΡΡ ΡΠ°Π±ΠΎΡΠ°ΡΡ Π² ΠΊΠΎΠ½ΡΠ΅ΠΊΡΡΠ΅ Π±ΡΠ°ΡΠ·Π΅ΡΠ°, ΠΏΠΎΡΡΠΎΠΌΡ ΠΏΠΎΠ»ΡΡΠ°Ρ Π²ΡΠ΅ Π΅Π³ΠΎ ΡΠΈΡΡΠ΅ΠΌΠ½ΡΠ΅ ΡΠ°Π·ΡΠ΅ΡΠ΅Π½ΠΈΡ. ΠΠ°ΠΊ ΡΠ»Π΅Π΄ΡΡΠ²ΠΈΠ΅ β Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΡ ΠΏΠΎΠΊΠ°Π·ΡΠ²Π°ΡΡ ΡΠΈΡΠΈΠ½Π³ΠΎΠ²ΡΠ΅ ΠΎΠΊΠ½Π°, Π° ΡΠ°ΠΊΠΆΠ΅ Π΄ΠΎΡΡΡΠΏ ΠΊ ΡΠ°Π±ΠΎΡΠΈΠΌ ΡΠ°ΠΉΠ»Π°ΠΌ ΠΎΡΠ°Π½ΠΆΠ΅Π²ΠΎΠΉ ΠΊΠΈΡΠ°ΠΉΡΠΊΠΎΠΉ Π±Π΅Π»ΠΊΠΈ, Π²ΠΊΠ»ΡΡΠ°Ρ Ρ ΡΠ°Π½ΡΡΠΈΠ΅ΡΡ Π² Π±Π°Π·Π΅ Π΄Π°Π½Π½ΡΡ Π»ΠΎΠ³ΠΈΠ½Ρ, ΠΏΠ°ΡΠΎΠ»ΠΈ ΠΈ ΠΊΡΠΊΠΈ.
ΠΡ ΡΠ²ΡΠ·ΡΠ²Π°Π»ΠΈΡΡ Ρ ΡΠ°Π·ΡΠ°Π±ΠΎΡΡΠΈΠΊΠ°ΠΌΠΈ UC Browser ΠΈ ΡΠΎΠΎΠ±ΡΠ°Π»ΠΈ ΠΈΠΌ ΠΎ Π½Π°ΠΉΠ΄Π΅Π½Π½ΠΎΠΉ ΠΏΡΠΎΠ±Π»Π΅ΠΌΠ΅, ΠΏΡΡΠ°Π»ΠΈΡΡ ΡΠΊΠ°Π·Π°ΡΡ Π½Π° ΡΡΠ·Π²ΠΈΠΌΠΎΡΡΡ ΠΈ Π΅Ρ ΠΎΠΏΠ°ΡΠ½ΠΎΡΡΡ, Π½ΠΎ ΠΎΠ±ΡΡΠΆΠ΄Π°ΡΡ ΡΡΠΎ-Π»ΠΈΠ±ΠΎ Ρ Π½Π°ΠΌΠΈ ΠΎΠ½ΠΈ Π½Π΅ ΡΡΠ°Π»ΠΈ. Π ΡΠ΅ΠΌ Π²ΡΠ΅ΠΌΠ΅Π½Π΅ΠΌ Π±ΡΠ°ΡΠ·Π΅Ρ ΠΏΡΠΎΠ΄ΠΎΠ»ΠΆΠ°Π» ΡΠ΅Π³ΠΎΠ»ΡΡΡ Ρ ΠΎΠΏΠ°ΡΠ½ΠΎΠΉ ΡΡΠ½ΠΊΡΠΈΠ΅ΠΉ Ρ Π²ΡΠ΅Ρ
Π½Π° Π²ΠΈΠ΄Ρ. ΠΠΎ ΠΊΠ°ΠΊ ΡΠΎΠ»ΡΠΊΠΎ ΠΌΡ ΡΠ°ΡΠΊΡΡΠ»ΠΈ Π΄Π΅ΡΠ°Π»ΠΈ ΡΡΠ·Π²ΠΈΠΌΠΎΡΡΠΈ, ΠΈΠ³Π½ΠΎΡΠΈΡΠΎΠ²Π°ΡΡ ΡΡΠΎ, ΠΊΠ°ΠΊ ΡΠ°Π½ΡΡΠ΅, ΡΠΆΠ΅ Π±ΡΠ»ΠΎ Π½Π΅Π»ΡΠ·Ρ. 27 ΠΌΠ°ΡΡΠ° Π±ΡΠ»Π°
Π²ΡΠΏΡΡΠ΅Π½Π° Π½ΠΎΠ²Π°Ρ Π²Π΅ΡΡΠΈΡ UC Browser 12.10.9.1193, ΠΊΠΎΡΠΎΡΠ°Ρ ΠΎΠ±ΡΠ°ΡΠ°Π»Π°ΡΡ ΠΊ ΡΠ΅ΡΠ²Π΅ΡΡ ΠΏΠΎ HTTPS:
ΠΡΠΎΠΌΠ΅ ΡΠΎΠ³ΠΎ, ΠΏΠΎΡΠ»Π΅ Β«ΠΈΡΠΏΡΠ°Π²Π»Π΅Π½ΠΈΡΒ» ΠΈ Π΄ΠΎ ΠΌΠΎΠΌΠ΅Π½ΡΠ° Π½Π°ΠΏΠΈΡΠ°Π½ΠΈΡ ΡΡΠ°ΡΡΠΈ ΠΏΠΎΠΏΡΡΠΊΠ° ΠΎΡΠΊΡΡΡΡ Π² Π±ΡΠ°ΡΠ·Π΅ΡΠ΅ PDF ΠΏΡΠΈΠ²ΠΎΠ΄ΠΈΠ»Π° ΠΊ ΠΏΠΎΡΠ²Π»Π΅Π½ΠΈΡ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΡ ΠΎΠ± ΠΎΡΠΈΠ±ΠΊΠ΅ Ρ ΡΠ΅ΠΊΡΡΠΎΠΌ Β«Π£ΠΏΡ, ΡΡΠΎ-ΡΠΎ ΠΏΠΎΡΠ»ΠΎ Π½Π΅ ΡΠ°ΠΊ!Β». ΠΠ°ΠΏΡΠΎΡ ΠΊ ΡΠ΅ΡΠ²Π΅ΡΡ ΠΏΡΠΈ ΠΏΠΎΠΏΡΡΠΊΠ΅ ΠΎΡΠΊΡΡΡΡ PDF Π½Π΅ Π²ΡΠΏΠΎΠ»Π½ΡΠ»ΡΡ, Π½ΠΎ Π²ΡΠΏΠΎΠ»Π½ΡΠ»ΡΡ Π·Π°ΠΏΡΠΎΡ ΠΏΡΠΈ Π·Π°ΠΏΡΡΠΊΠ΅ Π±ΡΠ°ΡΠ·Π΅ΡΠ°, ΡΡΠΎ Π½Π°ΠΌΠ΅ΠΊΠ°Π΅Ρ Π½Π° ΡΠΎΡ
ΡΠ°Π½ΠΈΠ²ΡΡΡΡΡ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΡ Π·Π°Π³ΡΡΠΆΠ°ΡΡ ΠΈΡΠΏΠΎΠ»Π½ΡΠ΅ΠΌΡΠΉ ΠΊΠΎΠ΄ Π² Π½Π°ΡΡΡΠ΅Π½ΠΈΠ΅ ΠΏΡΠ°Π²ΠΈΠ» Google Play.
ΠΡΡΠΎΡΠ½ΠΈΠΊ: habr.com