ืืงืืื
ืืื ืื ืกืืฃ ืคืื ืืึทืจืฅ ืืืจ
ืขืืืขืืข ืืึธื ืฆืืจืืง, UC ืืจืึทืืืขืจ ืืื ืืขืืืขื ืึทืืืืขืจืืืืื ืืื ืคืื ืื ืืขืจืืขืืืืื ืืืืขืจ ืึทืืจืขืกืืื: ืขืก ืืื ืืขืืืขื ืืื ืกืืึทืืืจื ืืืืฃ ืืืืขืจื 'ืืืืืืืกืึทื ื ืืฆื ืืึทืืืืึทืจืข, ืคืื ืื ืืขืจืืขืืืืื ืคึฟืื ืคืึทืจืฉืืื ืืืืืืขื ืืื ืืขืจ ืื ืืืื ืคืื ืืืืืขื ืืขืงืขืก (ื"ื ืืืืขืจื ืืขืืึทื ืง ืืื ืืขื ืขื ืืึทืื ืืึธืืืื ื, ืืืฉื, ืึท ืคึผืึธืจื ืืืืืขื, ืึธืืขืจ ืึทื ืฉืืึธื ืึท ืึทืคึผืง ืืื ืืขื ืืืขืืขืจืขืจ), ืืขืืืืื ื ืกืงืขืจื ืืึทื ืขืจื ืืื ืึทืจืืืงืืขื ืึทื ืืขืจ ืืืขืืขืจืขืจ ืืื ืึทืืืืืืืื, ืฉืคึผืืจืขืืืืืง, ืืื ืึทืืื ืืืืฃ. ืืื ืืขืจ ืืึทืึทืืืขืจ UC ืืจืึทืืืขืจ ืืจืืคึผืข ืืืืฃ VK ืขืก ืืื
ืืื ืืขืจ ืฆืืื ืคืื ืฉืจืืืื, UC ืืจืึทืืืขืจ ืืื ืืืืขืจ 500 ืื ืกืืึทืืืืฉืึทื ื ืืืืฃ Google ืคึผืืืึท. ืืึธืก ืืื ืืืคึผืจืขืกืืื - ืืืืื Google ืงืจืึธืื ืืื ืืขืจ. ืฆืืืืฉื ืื ืืืจืืืื ืืืจ ืงืขื ืขื ืืขื ืึท ืคึผืืึทืฅ ืคืื ืืขื ืืช ืืืขืื ืืึทื ืฆืข ืืื ืจืืืขืจืขืงืฅ ืฆื ืขืืืขืืข ืึทืคึผืืึทืงืืืฉืึทื ื ืืืืฃ Google ืคึผืืืึท. ืืึธืก ืืื ืืขืืืขื ืื ืกืืื ืคึฟืึทืจ ืืื ืืืขืจ ืคืึธืจืฉืื ื: ืืืจ ืืึทืฉืืึธืกื ืฆื ืืขื ืืืื UC Browser ืืื ืืื ืขืคึผืขืก ืฉืืขืื. ืืื ืขืก ืืึธื ืืื ืึทืจืืืกืืขืืืืื ืึทื ืขืจ ืืื!
ืืื ืื ืึทืคึผืืึทืงืืืฉืึทื ืงืึธื, ืื ืคืืืืงืืื ืฆื ืึธืคึผืืึธืืืจื ืืื ืืืืคื ืขืงืกืขืงืืืึทืืืข ืงืึธื ืืื ืืืกืงืึทืืืขืจื,
ืึทืืฅ ืืืึธืก ืืื ืืขืฉืจืืื ืืื ืื ืืื ืืึทืืืึทืืืง ืคึฟืึทืจ ืื ืืืขืจืกืืข ืคืื โโโโUC ืืจืึทืืืขืจ ืืืึธืก ืืื ืืขืืืขื ืืืจืขืืืืื ืืืืฃ Google ืคึผืืืึท ืืื ืืขืจ ืฆืืื ืคืื ืืขื ืืขืจื ืขื:
package: com.UCMobile.intl
versionName: 12.10.8.1172
versionCode: 10598
sha1 APK-ัะฐะนะปะฐ: f5edb2243413c777172f6362876041eb0c3a928c
ืืึทืคืึทืื ืืืขืงืืึธืจ
ืืื ืื UC ืืจืึทืืืขืจ ืืึทืฉืืึทืืคึผืขืจืืขื ืืืจ ืงืขื ืขื ืืขืคึฟืื ืขื ืึท ืืื ืกื ืืื ืึท ืืื-ืืงืกืคึผืืึทื ืึทืืึธืจื ื ืึธืืขื com.uc.deployment.UpgradeDeployService.
<service android_exported="false" android_name="com.uc.deployment.UpgradeDeployService" android_process=":deploy" />
ืืืขื ืืขืจ ืืื ืกื ืกืืึทืจืฅ, ืืขืจ ืืืขืืขืจืขืจ ืืืื ืึท POST ืืขืื ืฆื
ืึทืืื, ืืืขื ืึท ืืึทื ืืฆืขืจ ืืืื ืฆื ืขืคึฟืขื ืขื ืึท ืคึผืืฃ ืืืืื ืืื ืืขื ืืืขืืขืจืขืจ, โโืื ืคืืืืขื ืืข ืจืืงืืืขืก ืงืขื ืขื ืืืื ืืขืืขื ืืื ืื ืคืึทืจืงืขืจ:
ืขืจืฉืืขืจ ืขืก ืืื ืึท POST ืืขืื ืฆื
ืึทื ืึทืจืงืืืื ืืื ืึท ืืืืืืึธืืขืง ืคึฟืึทืจ ืืืืืื ื ืคึผืืฃ ืืื ืึธืคืืก ืคึฟืึธืจืืึทืืืจืื ืืขื ืืื ืืึทืื ืืึธืืืื. ืขืก ืืื ืืึทืืืฉืืงืึทื ืฆื ืืืขืจื ืขืืขื ืึทื ืืขืจ ืขืจืฉืืขืจ ืืขืื ืืจืึทื ืกืืืื ืืื ืคึฟืึธืจืืึทืฆืืข ืืืขืื ืื ืกืืกืืขื (ืืืึท ืืื ืืกืืขืจ ืื ืึทืจืงืึทืืขืงืืฉืขืจ ืฆื ืฆืืฉืืขืื ืื ืคืืจืืื ืื ืืืืืืึธืืขืง), ืืื ืืื ืขื ืืคืขืจ ืฆื ืขืก ืืขืจ ืืืขืืขืจืขืจ ื ืขืื ืขืืืขืืข ืืื ืคึฟืึธืจืืึทืฆืืข ืืืขืื ืื ืืืืืืึธืืขืง ืืืึธืก ืืึทืจืฃ ืืืื ืืึทืื ืืึธืืืื: ืื ืึทืืจืขืก ืืื, ืขืคืฉืขืจ. , ืขืคึผืขืก ืึทื ืืขืจืฉ. ืื ืคึผืจืึธืืืขื ืืื ืึทื ืื ืืงืฉื ืืื ืื ืงืจืืคึผืืื.
ืืขืื ืคืจืึทืืืขื ื
ืขื ืืคืขืจ ืคืจืึทืืืขื ื
ืื ืืืืืืึธืืขืง ืืื ืืื ืคึผืึทืงืืืืฉื ืืื ืคืึทืจืฉืืขืกืืขื ืืื ืืื ื ืืฉื ืื ืงืจืืคึผืืื.
ืืืื ืคึฟืึทืจ ืคืึทืจืงืขืจ ืืขืงืจืืคึผืืืึธื ืงืึธื
ืืื ืก ืคึผืจืืืืจื ืฆื ืืืกืืืคืขืจ ืื ืกืขืจืืืขืจ ืขื ืืคืขืจ. ืืื ืก ืงืืง ืืื ืื ืงืืึทืก ืงืึธื com.uc.deployment.UpgradeDeployService: ืคืื ืฉืืื onStartCommand ืืื ืฆื com.uc.deployment.bx, ืืื ืคืื ืืื ืฆื com.uc.browser.core.dcfe:
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", ืคึฟืึทืจ ืืืึทืฉืคึผืื), ืึท ืืืคึฟื ืืึธื ืืืื ืืขืจืืคึฟื ืืึธ ืืืึธืก ืืืขื ืืขืงืจืืคึผื ืื ืกืขืจืืืขืจ ืก ืขื ืืคืขืจ.
ืืืืืจ ืืืื ืืืืืืขืจ ืฆืื ืฉืืื gj. ืืึทืืขืจืงืื ื ืึทื ืืขืจ ืขืจืฉืืขืจ ืึทืจืืืืขื ื ืืื ืื ืืืืข ืืื ืคืึธืืึธ 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, ืืืึธืก ืืื ื ืืฉื ืคืืงืืืฉ ืึท .ืึทืืื, ืึธืืขืจ ืึท .ืืืฉืึทืจ. ืืขืจ ืืืคึฟื ืืืึธืก ืืืจ ืืขื ืขื ืืื ืืขืจืขืกืืจื ืืื ืืื ืืืคึผืืึทืืขื ืึทื ืืื ืืืื:
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.ืกืืคืขืจ. ืืื ืึทืืข ืืขื ืืื ืืจืึทื ืกืคืขืจื ืฆื ืึท ืืืืขืจ ืจืึทืืืขืจ ืืื ืื ื ืืืขืจ 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 ืืื ืืึทืงืืืขื ืึท ืืื ืื ืคืื ืืืึทืืึธื ืืึธืงืกืขืก ืืื ืขืจืจืึธืจืก. ืื ืคึผืจืึธืืืขื ืืื ืึทื ืื ืึธืคึผืืืืืื ื ืืขืืขืจ ืืืฉ ืืื ืคืึทืจืงืจืืคึผืื. ืืึธืก ืืื ืืขืืื ืืื ืฆืื ืฆื ืงืึธืืคึผืืืฆืืจื ืื ืึทื ืึทืืืกืืก.
ืืืขืจ ืขืก ืืื ื ืื ืืืจืฃ: ืฆื ืจืืืืืง ืืึธืื ืึทื ELF ืืขืงืข ืืื ืึทื ืึทืืืื ืขืก, ืึท ืคึผืจืึธืืจืึทื ืืขืืขืจ ืืืฉ ืืื ืืขื ืื. ืืขืจืืืขืจ, ืืืจ ืคืฉืื ืืืกืืขืงื ืื ืึธืคึผืืืืืื ื ืืืฉ, ื ืื ืื ืงืึธืจืึทืกืคึผืึทื ืืื ื ืคืขืืืขืจ ืืื ืื ืืขืืขืจ.
ืขืคึฟืขื ืขื ืื ืืขืงืข ืืื IDA ืืืืืขืจ.
ืขืก ืืขื ืขื ืฆืืืื ืืืขืื ืฆื ืืึธืื ืื Java ืืืืจืืืึทื ืืึทืฉืื ืืื ืคึผืื ืงื ืืื ืืขืจ ืืขืืืืจื ืืืืืืึธืืขืง ืื ืืืคึผืืึทืืขื ืืืืฉืึทื ืคืื ืึท ืืืคึฟื ืืขืจืงืืขืจื ืืื Java ืงืึธื ืืื ืืขืืืืจื ืืื ืืืื. ืืขืจ ืขืจืฉืืขืจ ืืื ืฆื ืืขืื ืขืก ืึท ืืื ืื ื ืึธืืขื Java_package_name_ClassName_MethodName.
ืื ืจืืข ืืื ืฆื ืคืึทืจืฉืจืืึทืื ืขืก ืืืขื ืืึธืืืื ื ืื ืืืืืืึธืืขืง (ืืื ืื ืคึฟืื ืงืฆืืข JNI_OnLoad)
ื ืืฆื ืึท ืคึฟืื ืงืฆืืข ืจืืคื RegisterNatives.
ืืื ืืื ืืืขืจ ืคืึทื, ืืืื ืืืจ ื ืืฆื ืืขืจ ืขืจืฉืืขืจ ืืืคึฟื, ืืขืจ ื ืึธืืขื ืืึธื ืืืื ืืื ืืึธืก: Java_com_taobao_wireless_security_adapter_JNICLibrary_doCommandNative.
ืขืก ืืื ื ืื ืึทืืึท ืคืื ืงืฆืืข ืฆืืืืฉื ืื ืืงืกืคึผืึธืจืืึทื ืคืึทื ืืงืฉืึทื ื, ืืืึธืก ืืืื ืืืจ ืืึทืจืคึฟื ืฆื ืงืืงื ืคึฟืึทืจ ืึท ืจืืคื RegisterNatives.
ืืื ืก ืืืื ืฆื ืื ืคึฟืื ืงืฆืืข JNI_OnLoad ืืื ืืืจ ืืขื ืืขื ืืืื:
ืืืืก ืืืื ืื ืคืืจ? ืืื ืขืจืฉืืขืจ ืืืืง, ืืขืจ ืึธื ืืืื ืืื ืกืืฃ ืคืื ืื ืคืื ืงืฆืืข ืืขื ืขื ืืืคึผืืฉ ืคึฟืึทืจ ARM ืึทืจืงืึทืืขืงืืฉืขืจ. ืืขืจ ืขืจืฉืืขืจ ืืืืขื ืืืืฃ ืืขื ืึธื ืืืืื ืกืืึธืจื ืื ืืื ืืึทืื ืคืื ืื ืจืขืืืฉืืกืืขืจื ืืืึธืก ืื ืคึฟืื ืงืฆืืข ืืืขื ื ืืฆื ืืื ืืืื ืึธืคึผืขืจืึทืฆืืข (ืืื ืืขื ืคืึทื, R0, R1 ืืื R2), ืืื ืืขืืื ื ืืื ืื ืืื ืืึทืื ืคืื ืื LR ืจืขืืืกืืจืืจื, ืืืึธืก ืึผืืื ืื ืฆืืจืืงืงืืืขื ืึทืืจืขืก ืคืื ืื ืคึฟืื ืงืฆืืข. . ืื ืืขืฆืืข ืืืืขื ืจืืกืืึธืจื ืื ืืขืจืืืขืืืขื ืจืขืืืฉืืกืืขืจื, ืืื ืื ืฆืืจืืงืงืืืขื ืึทืืจืขืก ืืื ืืื ืืขืฉืืขืื ืืื ืื ืคึผืืกื ืจืขืืืกืืจืืจื - ืึทืืื ืฆืืจืืงืงืืืขื ืคืื ืื ืคืื ืงืฆืืข. ืึธืืขืจ ืืืื ืืืจ ืงืืง ืขื ื, ืืืจ ืืืขื ืืึทืืขืจืงื ืึทื ืื ืคึผืขื ืึทืืืึทืืึทื ืืืืขื ืขื ืืขืจืื ืืขื ืื ืฆืืจืืงืงืืืขื ืึทืืจืขืก ืกืืึธืจื ืืืืฃ ืื ืึธื ืืืืื. ืืืืืจ ืืืืกืจืขืืขื ืขื ืืืืก ืขืก ืืืขื ืืืื ื ืืืืขื
ืงืึธื ืืืจืืคืืจืื ื. ื ืืืืขืจ ืึทืืจืขืก 1ืงืกื0 ืืื ืืึธืืืื ืืื ืจ130, 5 ืืื ืกืึทืืืจืึทืงืืื ืคืื ืขืก, ืืขืืึธืื ืขืก ืืื ืืจืึทื ืกืคืขืจื ืฆื ืจ0 ืืื 0ืงืก10 ืืื ืืืกืืฃ ืฆื ืขืก. ืขืก ืืืจื ืก ืืืืก 0xB13B. ืืืื, IDA ืืืื ื ืึทื ืื ืืขืฆืืข ืืืืขื ืืื ืึท ื ืึธืจืืึทื ืคืื ืงืฆืืข ืฆืืจืืงืงืืืขื, ืึธืืขืจ ืืื ืคืึทืงื ืขืก ืืื ืืขืืื ืืขื ืฆื ืื ืงืึทืืงืืึทืืืืืื ืึทืืจืขืก 0xB13B.
ืขืก ืืื ืืืขืจื ืฆื ืืขืจืืึธื ืขื ืืึธ ืึทื ARM ืคึผืจืึทืกืขืกืขืจื ืืึธืื ืฆืืืื ืืึธืืขืก ืืื ืฆืืืื ืฉืืขืื ืคืื ืื ืกืืจืึทืงืฉืึทื ื: ARM ืืื Thumb. ืืขืจ ืงืืขื ืกืืขืจ ืืึทืืืืืืง ืืืกื ืคืื ืื ืึทืืจืขืก ืืขืจืฆืืืื ืื ืคึผืจืึทืกืขืกืขืจ ืืืึธืก ืืืืขื ืฉืืขืื ืืื ืืขื ืืฆื. ืืึธืก ืืื, ืื ืึทืืจืขืก ืืื ืึทืงืฉืื 0xB13A, ืืื ืืืื ืขืจ ืืื ืืขืจ ืงืืขื ืกืืขืจ ืืึทืืืืืืง ืืืกื ืื ืืืงืืืฅ ืื ืืจืึธืืขืจ ืคืื ืืขืจ ืืึธืืข.
ื ืขื ืืขื "ืึทืืึทืคึผืืขืจ" ืืื ืฆืืืขืืขืื ืฆื ืื ืึธื ืืืื ืคืื ืืขืืขืจ ืคืื ืงืฆืืข ืืื ืืขื ืืืืืืึธืืขืง ืืื
ืืืกื ืงืึธื. ืืืจ ืืืขืื ื ืืฉื ืืืืื ืขื ืืืืฃ ืืื ืืื ืืขืืึทื ืืืืึทืืขืจ - ืืืจ ื ืึธืจ ืืขืืขื ืงืขื
ืึทื ืืขืจ ืขืืขืก ืึธื ืืืื ืคืื ืึผืืขื ืึทืืข ืคืึทื ืืงืฉืึทื ื ืืื ืึท ืืืกื ืืืืึทืืขืจ ืึทืืืขืง.
ืืื ื ืื ืงืึธื ืืื ื ืืฉื ืืคืืจืืฉ ืฉืคึผืจืื ื ืฆื 0xB13A, IDA ืืื ืืื ื ืืฉื ืืขืจืงืขื ืขื ืึทื ืื ืงืึธื ืืื ืืืื ืืื ืืขื ืึธืจื. ืคึฟืึทืจ ืืขืจ ืืขืืืืงืขืจ ืกืืื, ืขืก ืงืขื ื ืืฉื ืืขืจืงืขื ืขื ืจืืึฟ ืคืื ืื ืงืึธื ืืื ืืขืจ ืืืืืืึธืืขืง ืืื ืงืึธื, ืืืึธืก ืืืื ืึทื ืึทืืืกืืก ืขืคึผืขืก ืฉืืืขืจ. ืืืจ ืืึธืื IDA ืึทื ืืึธืก ืืื ืืขืจ ืงืึธื, ืืื ืืึธืก ืืื ืืืึธืก ืืึทืคึผืึทื ื:
ืืขืจ ืืืฉ ืกืืึทืจืฅ ืงืืืจ ืืื 0xB144. ืืืึธืก ืืื ืืื ืกืื_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 ืืึธื ื ืื ืืืกืงืืืขื ืฆื ืืึทืื ืคืื ืืื ืขื, ืขืก ืืื ืืขืจ ืืื ืึท ืืื ืคืื ืืืกืคึผืืืืกืืึทื ื. ืืึธืืืจ ืงืืงื ืืื ืกืื_4964:
ืืื ืืืงืข ืื ื ืขืื ืืขื ื ืืืืขืจื ืืืืคื ืืืจืขืก ืืืืก ืืืื ืืื ื"ืจ, ืืืกืืฃ ืฆื ืืขื ืืืจืขืก, ื ืืืืขื ื ืขืื ืืขื ืื ืืืขืจื ืคืื ืื ืจืืืึทืืืื ื ืืืจืขืก ืืื ืืืืื ืขืก ืืืืคื ืฉืืืง. ืืืื, 4 ืืื ืืืกืืฃ ืฆื LR ืึทืืื ืึทื ื ืึธื ืฆืืจืืงืงืืืขื ืคืื ืื ืคึฟืื ืงืฆืืข, ืืขืจ ืืขืืืืงืขืจ ืคืึธืืึธ ืืื ืกืงืืคึผื. ื ืึธื ืืืึธืก ืื 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 ืฆื ืืืื ืคืึทืงืืืฉ ืึธื ืืืื. ืขืก ืืืขื ืฆืื ืืืคืฉืืขืื ืึทืืข ืื ืคืื ืงืฆืืข ืงืึธื, ืืื ืขืก ืงืขื ืขื ืืืื ืืืงืึทืืคึผืืืื ืืื ืืขืงืกืจืืึทืก.
ืืืงืึธืืืื ื ืกืืจืื ืืก
ืืืจ ืืึธืื ืืขืืขืจื ื ืฆื ืืึทื ืืืขื ืืื ืึทืืคืึทืกืงืืืฉืึทื ืคืื ืืึทืฉืื ืงืึธื ืืื ืืขืจ ืืืืืืึธืืขืง libsgmainso-6.4.36.so ืคึฟืื UC ืืจืึทืืืขืจ ืืื ืืืงืืืขื ืื ืคืื ืงืฆืืข ืงืึธื 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);
ืืื ืคึฟืื ืงืฆืืข ืกืื_73E24 ืืขืจ ืงืืึทืก ื ืึธืืขื ืืื ืงืืืจ ืืขืงืจืืคึผืืื. ืืื ืคึผืึทืจืึทืืขืืขืจืก ืฆื ืืขื ืคึฟืื ืงืฆืืข, ืึท ืืืึทืื ืฆื ืืึทืื ืขื ืืขื ืฆื ืื ืงืจืืคึผืืื ืืึทืื, ืึท ืืืืขืจ ืืึทืคืขืจ ืืื ืึท ื ืืืขืจ ืืขื ืขื ืืืจืืืขืืื ืืขื. ืืึธื, ื ืึธื ืจืืคื ืื ืคึฟืื ืงืฆืืข, ืขืก ืืืขื ืืืื ืึท ืืขืงืจืืคึผืืขื ืฉืืจื ืืื ืื ืืึทืคืขืจ, ืืืืึทื ืขืก ืืื ืืืจืืืขืืื ืืขื ืฆื ืื ืคึฟืื ืงืฆืืข FindClass, ืืืึธืก ื ืขืื ืื ืงืืึทืก ื ืึธืืขื ืืื ืื ืจืืข ืคึผืึทืจืึทืืขืืขืจ. ืืขืจืืืขืจ, ืื ื ืืืขืจ ืืื ืื ืืจืืืก ืคืื ืื ืืึทืคืขืจ ืึธืืขืจ ืื ืืขื ื ืคืื ืื ืฉืืจื. ืืึธืืืจ ืคึผืจืึผืืื ืฆื ืืขืฉืืคืขืจื ืืขื ืงืืึทืก ื ืึธืืขื, ืขืก ืืึธื ืืื ืื ืืึธืื ืฆื ืืืจ ืืืืขื ืืื ืื ืจืขืื ืจืืืืื ื. ืืื ืก ื ืขืืขื ืึท ื ืขืขื ืืขืจ ืงืืง ืืื ืืืึธืก ืืึทืคึผืึทื ื ืืื ืกืื_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 ืงืจืืืืฅ ืึท ืืืึทืฉืคึผืื ืคืื ืึท ืงืึทื ืืืื ืขืจ ืคึฟืึทืจ ืืืื ืขืจืืื ืคืื ืื ืกืคึผืขืกืืคืืขื ืืจืืืก (ืืืจ ืืืขืื ื ืืฉื ืืืืื ืขื ืืืืฃ ืื ืงืึทื ืืืื ืขืจื ืืื ืืขืืึทื). ืืึธ ืืขื ืขื ืืืฉืืคื ืฆืืืื ืึทืืึท ืงืึทื ืืืื ืขืจื: ืืืื ืขืจ ืึผืืื ืื ืฉืืจื "ืืงืึธ/ืืงืง+ื?ื3ืง*ืง@" (ืขืก ืืื ืืจืื ื ืฆื ืืจืขืคื ืึทื ืืึธืก ืืื ืึท ืฉืืืกื), ืื ืื ืืขืจืข ืึผืืื ืื ืงืจืืคึผืืื ืืึทืื. ืืืืึทืืขืจ, ืืืืืข ืึทืืืืฉืขืงืฅ ืืขื ืขื ืืขืฉืืขืื ืืื ืึท ืืืืขืจ ืกืืจืืงืืืจ, ืืืึธืก ืืื ืืืจืืืขืืื ืืขื ืฆื ืื ืคึฟืื ืงืฆืืข ืกืื_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;
}
ืืขืจ ืืึทืฉืืืืขื ืคึผืึทืจืึทืืขืืขืจ ืืื ืึท ืกืืจืืงืืืจ ืคืขืื ืืืึธืก ืืื ืืขืืืขื ืคืจืืขืจ ืึทืกืืื ื ืื ืืืขืจื 3. ืงืืง ืืืึท ืคืึทื 3: ืฆื ืื ืคึฟืื ืงืฆืืข ืกืื_6364C ืคึผืึทืจืึทืืขืืขืจืก ืืขื ืขื ืืืจืืืขืืื ืืขื ืคืื ืื ืกืืจืืงืืืจ ืืืึธืก ืืขื ืขื ืฆืืืขืืขืื ืืื ืื ืคืจืืขืจืืืงืข ืคึฟืื ืงืฆืืข, ื"ื ืื ืฉืืืกื ืืื ืื ืงืจืืคึผืืื ืืึทืื. ืืืื ืืืจ ืงืืง ืขื ื ืืื ืกืื_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.
ืืืจ ืงืขื ืขื ืืขื ืคืื ืื ืงืึธื ืึทื ืื ืืึทืคึฟืขื ื ืืืขืจ ืืจืืื ืืจืื ื ืืืขืจื: ืืึทืคึฟืขื / 10000, ืืึทืคึฟืขื% 10000 / 100 ะธ ืืึทืคึฟืขื % 10, ื.ื., ืืื ืืื ืืืขืจ ืคืึทื, 1, 6 ืืื 1. ืื ืืจืืึท ื ืืืขืจื, ืืื ืืืื ืึท ืึธื ืืืืึทื ืฆื JNIEnv ืืื ืื ืึทืจืืืืขื ืื ืืืจืืืขืืื ืืขื ืฆื ืื ืคึฟืื ืงืฆืืข ืืขื ืขื ืฆืืืขืืขืื ืฆื ืึท ืกืืจืืงืืืจ ืืื ืืืจืืืขืืื ืืขื ืืืืฃ. ื ืืฆื ืื ืืจืื ื ืืืขืจื ืืืงืืืขื (ืืืืืจ ืืืฆืืืืขื ืขื ืืื N1, N2 ืืื N3), ืืื ืืขืืืื ืึท ืืึทืคึฟืขื ืืืื.
ืขืคึผืขืก ืืื ืืึธืก:
ืืขืจ ืืืื ืืื ืึธื ืืขืคืืื ืืื ืึทืืืงืึทืืื ืืื JNI_OnLoad.
ืืจืื ื ืืืขืจื ืขื ืงืึธืื ืื ืืจื ืืื ืืขื ืืืื. ืืขืืขืจ ืืืึทื ืคืื ืืขื ืืืื ืึผืืื ืื ืคึผืึทืงื ืึทืืจืขืก ืคืื ืื ืงืึธืจืึทืกืคึผืึทื ืืื ื ืคืื ืงืฆืืข. ืืขืจ ืฉืืืกื ืืื ืืื ืื ืคืึธืืขืจ ื ืึธืืข. ืืขืคึฟืื ืขื ืืขื ืึธืจื ืืื ืืขื ืงืึธื ืืื ืื ืคืื ืงืฆืืข ืืืจ ืืึทืจืคึฟื ืืื ืืืกืืฃ ืฆื ืืขื ืืืื ืืื ื ืืฉื ืฉืืืขืจ ืืืื ืืืจ ืคึฟืึทืจืฉืืืื ืึทืืข ืื ืกืืจืึทืงืืฉืขืจื ืืขื ืืฆื (ืืืจ ืืึธื ื ืื ืืึทืฉืจืืึทืื ืืื ืึทืืื ื ืืฉื ืฆื ืืืึธืื ืึท ืฉืืื ืืึทื ืฅ ืืจืืืก ืึทืจืืืงื).
ืืขืจ ืฆืขืืืฉืื ื
ืืืจ ืืืงืืืขื ืื ืึทืืจืขืก ืคืื ืื ืคึฟืื ืงืฆืืข ืืืึธืก ืืึธื ืืขืงืจืืคึผื ืคืึทืจืงืขืจ: 0x5F1AC. ืึธืืขืจ ืขืก ืืื ืฆื ืคืจื ืฆื ืคืจืืืขื: ืื ืืขืืืขืืึธืคึผืขืจืก ืคืื UC ืืจืึทืืืขืจ ืืึธืื ืฆืืืขืืจืืื ืื ืื ืืขืจ ืืืขืจืจืึทืฉื ืคึฟืึทืจ ืืื ืื.
ื ืึธื ืืืงืืืขื ืื ืคึผืึทืจืึทืืขืืขืจืก ืคืื ืื ืืขื ืืข ืืืึธืก ืืื ืืขืฉืืคื ืืื ืื Java ืงืึธื, ืืืจ ืืึทืงืืืขื
ืฆื ืื ืคืื ืงืฆืืข ืืื ืึทืืจืขืก 0x4D070. ืืื ืืึธ ืึทืืืืืฅ ืืื ืื ืื ืื ืืขืจ ืืืคึผ ืคืื ืงืึธื ืึทืืคืึทืกืงืืืฉืึทื.
ืืืจ ืฉืืขืื ืฆืืืื ืื ืืืกืื ืืื R7 ืืื R4:
ืืืจ ืืืขืจืจืืง ืืขืจ ืขืจืฉืืขืจ ืืื ืืขืงืก ืฆื R11:
ืฆื ืืึทืงืืืขื ืึทื ืึทืืจืขืก ืคืื ืึท ืืืฉ, ื ืืฆื ืึทื ืืื ืืขืงืก:
ื ืึธื ืืืื ืฆื ืืขืจ ืขืจืฉืืขืจ ืึทืืจืขืก, ืื ืจืืข ืืื ืืขืงืก ืืื ืืขื ืืฆื, ืืืึธืก ืืื ืืื R4. ืขืก ืืขื ืขื 230 ืขืืขืืขื ืื ืืื ืื ืืืฉ.
ืืืึธืก ืฆื ืืึธื ืืืขืื ืืื? ืืืจ ืงืขื ืขื ืืึธืื IDA ืึทื ืืึธืก ืืื ืึท ืืึทืฉืืืืขื: ืจืขืืึทืืืจื -> ืื ืืขืจืข -> ืกืคึผืขืฆืืคืืฆืืจื ืืึทืฉืืืืขื ืืืืึธื.
ืื ืจืืืึทืืืื ื ืงืึธื ืืื ืกืงืขืจื. ืึธืืขืจ ืืืขื ืืืจ ืืึทืื ืืืื ืืืขื ืืืจื ืื ืืืฉืึทื ืืืึทื, ืืืจ ืงืขื ื ืืึทืืขืจืงื ืึท ืจืืฃ ืฆื ืึท ืคืื ืงืฆืืข ืืืึธืก ืืื ืฉืืื ืืึทืงืึทื ื ืฆื ืืื ืื ืกืื_6115C:
ืขืก ืืื ืืขืืืขื ืึท ืืึทืฉืืืืขื ืืื ืืืึธืก ืืื ืคืึทื 3 ืขืก ืืื ืืขืืืขื ืึท ืืขืงืจืืคึผืืืึธื ื ืืฆื ืื RC4 ืึทืืืขืจืืืึทื. ืืื ืืื ืืขื ืคืึทื, ืื ืกืืจืืงืืืจ ืืืจืืืขืืื ืืขื ืฆื ืื ืคึฟืื ืงืฆืืข ืืื ืึธื ืืขืคืืื ืคึฟืื ืื ืคึผืึทืจืึทืืขืืขืจืก ืืืจืืืขืืื ืืขื ืฆื doCommandNative. ืืึธืืืจ ืืขืืขื ืงืขื ืืืึธืก ืืืจ ืืึธืื ืืึธืจื MagicInt ืืื ืื ืืืขืจื 16. ืืืจ ืงืืงื ืืื ืื ืงืึธืจืึทืกืคึผืึทื ืืื ื ืคืึทื - ืืื ื ืึธื ืขืืืขืืข ืืจืึทื ืืืฉืึทื ื ืืืจ ืืขืคึฟืื ืขื ืื ืงืึธื ืืืจื ืืืึธืก ืื ืึทืืืขืจืืืึทื ืงืขื ืขื ืืืื ืืืืขื ืึทืคืืื.
ืืึธืก ืืื AES!
ืืขืจ ืึทืืืขืจืืืึทื ืืืืืกืฅ, ืึทืืข ืืืึธืก ืืืืืื ืืื ืฆื ืืึทืงืืืขื ืืืึทื ืคึผืึทืจืึทืืขืืขืจืก: ืืึธืืข, ืฉืืืกื ืืื, ืขืคืฉืขืจ, ืื ืื ืืืืึทืืืืึทืืืึธื ืืืขืงืืึธืจ (ืืืึทื ืืืึทืืืึทื ืืขืคึผืขื ืืก ืืืืฃ ืื ืึทืคึผืขืจืืืืื ื ืืึธืืข ืคืื โโืื AES ืึทืืืขืจืืืึทื). ืื ืกืืจืืงืืืจ ืืื ืืื ืืืื ืืืื ืืขืฉืืคื ืขืจืืขืฅ ืืืืืขืจ ืื ืคึฟืื ืงืฆืืข ืจืืคื ืกืื_6115C, ืึธืืขืจ ืืขืจ ืืืื ืคืื ืื ืงืึธื ืืื ืกืคึผืขืฆืืขื ืืขืืื ื ืึทืืคืืกืงืืืืื, ืึทืืื ืืขืจ ืืขืืึทื ืง ืขืจืืืืึทื ืฆื ืืึทืืข ืื ืงืึธื ืึทืืื ืึทื ืึทืืข ืคึผืึทืจืึทืืขืืขืจืก ืคืื ืื ืืขืงืจืืคึผืืืึธื ืคึฟืื ืงืฆืืข ืืขื ืขื ืืึทืืคึผื ืืื ืึท ืืขืงืข.
ืคึผืึทืืฉ
ืึผืื ื ืืฉื ืฆื ืฉืจืืึทืื ืึทืืข ืื ืืึทืืข ืงืึธื ืืื ืคึฟืึทืจืืึทืืืื ื ืฉืคึผืจืึทื ืืึทื ืืืึทืื, ืืืจ ืงืขื ืขื ืงืึทืืขืจ ืึทื ืืจืืื ืกืืืืืึธ, ืฉืจืืึทืื ืึท ืคึฟืื ืงืฆืืข ืืึธืจื ืืืึธืก ื ืขืื ืื ืืขืืืข ืึทืจืืึทื ืฉืจืืึทื ืคึผืึทืจืึทืืขืืขืจืก ืืื ืืื ืืืขืจ ืืขืงืจืืคึผืืืึธื ืคืื ืงืฆืืข ืืื ืฉืจืืึทืื ืฆื ืึท ืืขืงืข, ืืื ื ืึธืืืึทืื ืืื ืคึผืึทืคึผ ืื ืงืึธื ืืืึธืก ืืขืจ ืงืึทืืคึผืืืืขืจ ืืืขื. ืืืฉืขื ืขืจืืื.
ืืื ืืืขืจ ืคืจืขื ืื ืคืื ืื UC ืืจืึทืืืขืจ ืืึทื ืฉืึทืคึฟื ืืึธืื ืืืื ืืึธืจืื ืคึฟืึทืจ ืื ืงืึทื ืืืื ืืึทื ืก ืคืื ืึทืืื ื ืงืึธื. ืืึธืืืจ ืืขืืขื ืงืขื ืึทื ืืื ืื ืึธื ืืืื ืคืื ืืขืืขืจ ืคึฟืื ืงืฆืืข ืืืจ ืืึธืื ืืืกื ืงืึธื ืืืึธืก ืงืขื ืขื ืืืืื ืืืื ืจืืคึผืืืืกื ืืื ืงืืื ืื ืืขืจืข. ืืืืขืจ ืืึทืงืืืขื ๐ ืึธืืขืจ, ืืื ืื ืึธื ืืืื ืคืื ืื ืฆืื ืคืื ืงืฆืืข ืขืก ืืื ื ืืฉื ืืขื ืื ืคึผืืึทืฅ ืคึฟืึทืจ ืื ืงืึธื ืืืึธืก ืกืึทืืืขืก ืึทืืข ืื ืคึผืึทืจืึทืืขืืขืจืก ืฆื ืึท ืืขืงืข. ืืื ืืื ืฆื ืฉืคึผืึทืืื ืขืก ืืื ืคึผืึทืจืฅ ืืื ื ืืฆื ืืืกื ืืืึทืงืก ืคืื ืืจืืืืงืข ืคืึทื ืืงืฉืึทื ื. ืขืก ืืขื ืขื ืืขืืืขื ืคืืจ ืืืืื ืืื ืืึทื ืฅ.
ืืขืจ ืขืจืฉืืขืจ ืืืื:
ืืื ืื ARM ืึทืจืงืึทืืขืงืืฉืขืจ, ืื ืขืจืฉืืขืจ ืคืืจ ืคืื ืงืฆืืข ืคึผืึทืจืึทืืขืืขืจืก ืืขื ืขื ืืืจืืืขืืื ืืขื ืืืจื ืจืขืืืฉืืกืืขืจื R0-R3, ืื ืื ืืื, ืืืื ืขืก ืืื, ืืขื ืขื ืืืจืืืขืืื ืืขื ืืืจื ืื ืึธื ืืืืื. ืื LR ืจืขืืืกืืจืืจื ืงืึทืจืื ืื ืฆืืจืืงืงืืืขื ืึทืืจืขืก. ืึทืืข ืืขื ืืึทืจืฃ ืืืื ืืขืจืืืขืืืขื ืึทืืื ืึทื ืื ืคึฟืื ืงืฆืืข ืงืขื ืขื ืึทืจืืขืื ื ืึธื ืืืจ ืืึทืืคึผ ืืืึทื ืคึผืึทืจืึทืืขืืขืจืก. ืืืจ ืืืื ืืึทืจืคึฟื ืฆื ืจืึทืืขืืืขื ืึทืืข ืื ืจืขืืืฉืืกืืขืจืก ืืืึธืก ืืืจ ืืืขืื ื ืืฆื ืืื ืืขื ืคึผืจืึธืฆืขืก, ืึทืืื ืืืจ ืืึธื PUSH.W {R0-R10,LR}. ืืื R7 ืืืจ ืืึทืงืืืขื ืื ืึทืืจืขืก ืคืื ืืขืจ ืจืฉืืื ืคืื ืคึผืึทืจืึทืืขืืขืจืก ืืืจืืืขืืื ืืขื ืฆื ืื ืคืื ืงืฆืืข ืืืจื ืื ืึธื ืืืืื.
ื ืืฆื ืื ืคึฟืื ืงืฆืืข fopen ืืึธืืืจ ืขืคืขื ืขื ืื ืืขืงืข /data/local/tmp/aes ืืื "ืึทื" ืืึธืืข
ืืืก ืืืืกื ืคืืจ ืฆืืืื. ืืื R0 ืืืจ ืืึธืื ืื ืึทืืจืขืก ืคืื ืื ืืขืงืข ื ืึธืืขื, ืืื R1 - ืื ืึทืืจืขืก ืคืื ืื ืฉืืจื ืืืึธืก ืื ืืืงืืืฅ ืื ืืึธืืข. ืืื ืืึธ ืื ืืืกื ืงืึธื ืขื ืืก, ืึทืืื ืืืจ ืืึทื ืืืืฃ ืฆื ืืขืจ ืืืืึทืืขืจ ืคึฟืื ืงืฆืืข. ืึผืื ืขืก ืืึธื ืคืึธืจืืขืฆื ืฆื ืึทืจืืขืื, ืืืจ ืฉืืขืื ืืื ืื ืึธื ืืืื ืื ืืืขืจืืึทื ื ืฆื ืื ืคืึทืงืืืฉ ืงืึธื ืคืื ืื ืคึฟืื ืงืฆืืข, ืืืืคึผืึทืกืื ื ืื ืืืกื, ืืื ืึทื ืฉืืึธื ืคืื ืื ืืืกื ืืืจ ืืืืื ืึท ืงืึทื ืืื ืืืืืฉืึทื ืคืื ืื ืืึทืืข.
ืจืืคื fopen.
ืืขืจ ืขืจืฉืืขืจ ืืจืืึท ืคึผืึทืจืึทืืขืืขืจืก ืคืื ืื ืคึฟืื ืงืฆืืข ืึทืขืก ืืึธืื ืืืคึผ ืื ื. ืืื ื ืืืจ ืืขืจืืืขืืืขื ืื ืจืขืืืฉืืกืืขืจื ืฆื ืื ืึธื ืืืืื ืืื ืื ืึธื ืืืื, ืืืจ ืงืขื ืขื ืคืฉืื ืคืึธืจื ืื ืคึฟืื ืงืฆืืข ืฉืจืืื ืืืืขืจ ืึทืืจืขืกืขืก ืืืืฃ ืื ืึธื ืืืืื.
ืืืืึทืืขืจ ืืืจ ืืึธืื ืืจืื ืกืืจืึทืงืืฉืขืจื ืืืึธืก ืึทื ืืืึทืืื ืื ืืึทืื ืืจืืืก ืืื ืึท ืืืึทืื ืฆื ืื ืืึทืื ืคึฟืึทืจ ืื ืฉืืืกื, ืื ืืืืึทืืืืึทืืืึธื ืืืขืงืืึธืจ ืืื ืื ืงืจืืคึผืืื ืืึทืื.
ืืื ืื ืกืืฃ, ืคืึทืจืืึทืื ืื ืืขืงืข, ืืืงืขืจื ืื ืจืขืืืฉืืกืืขืจื ืืื ืึทืจืืืขืจืคืืจื ืงืึธื ืืจืึธื ืฆื ืื ืคืึทืงืืืฉ ืคืื ืงืฆืืข ืึทืขืก.
ืืืจ ืงืืืึทืื ืึท ืึทืคึผืง ืืื ืึท ืคึผืึทืืฉื ืืืืืืึธืืขืง, ืฆืืืื ืขืก, ืืคึผืืึธืึทื ืขืก ืฆื ืื ืืืื / ืขืืืืึทืืึธืจ ืืื ืงืึทืืขืจ ืขืก. ืืืจ ืืขื ืึทื ืืื ืืืขืจ ืืึทืืคึผ ืืื ืืืฉืืคื, ืืื ืึท ืคึผืืึทืฅ ืคืื ืืึทืื ืืขื ืขื ืืขืฉืจืืื ืืึธืจื. ืืขืจ ืืืขืืขืจืขืจ ื ืืฆื ืขื ืงืจืืคึผืฉืึทื ื ืื ืืืืื ืคึฟืึทืจ ืคืึทืจืงืขืจ, ืืื ืึทืืข ืขื ืงืจืืคึผืฉืึทื ืืืื ืืืจื ืื ืคึฟืื ืงืฆืืข ืืื ืงืฉืื. ืืืขืจ ืคึฟืึทืจ ืขืืืขืืข ืกืืื ืื ื ืืืืืง ืืึทืื ืืขื ืขื ื ืืฉื ืืึธืจื, ืืื ืื ืคืืจืืื ืื ืืขืื ืืื ื ืื ืงืขื ืืืง ืืื ืื ืคืึทืจืงืขืจ. ืึผืื ื ืืฉื ืฆื ืืืึทืจืื ืืื ืื UC ืืจืึทืืืขืจ ืืืืืื ืฆื ืืึทืื ืื ื ืืืืืง ืืขืื, ืืึธืื ืืื ืื ื ืขืืขื ืื ืื ืงืจืืคึผืืื ืขื ืืคืขืจ ืคืื ืื ืกืขืจืืืขืจ ืืืงืืืขื ืคืจืืขืจ ืืื ืืึทืืข ืื ืึทืคึผืืึทืงืืืฉืึทื ืืืืืขืจ: ืืืื ืื ืืขืงืจืืคึผืืืึธื ืฆื ืื ืืืืคึผื ืึทืงืืืืืืืขื ืืืืฃ ืฉืึทืคึฟื.
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 ืืืืึทื ืืขืจ ืืืคึฟื ืืืืืขืงืขืจื ื ืึทื.
ืืขืฉืึทืก ืืืืึทืืขืจ ืึทื ืึทืืืกืืก ืคืื ืื ืงืึธื, ืึท ืคึฟืื ืงืฆืืข ืืื ืืืกืงืึทืืืขืจื ืึทื ืืืกืืคืขืจื ืืฉืืงืึทืืืข ืฉืืจืืช: "META-INF/" ืืื ".ืจืกืึท". ืขืก ืงืืงื ืืื ืื ืึทืคึผืืึทืงืืืฉืึทื ืืื ืืืขืจืึทืคืืืื ื ืืืึทื ืืึทืืืืึทืื. ืึธืืขืจ ืืคืืื ืืืฉืขื ืขืจืืืฅ ืฉืืืกืืขื ืคืื ืขืก. ืืื ืืึธื ื ืื ืืึทืงืข ืืืืื ืฆื ืืึทื ืืืขื ืืื ืืืึธืก ืืื ืืขืฉืขืขื ืืฉ ืืื ืื ืืึทืืืืึทืื, ืึทืืื ืืืจ ืืืขืื ื ืึธืจ ืฆืขืื ืขืก ืื ืจืืืืืง ืืึทืืืืึทืื. ืืึธืืืจ ืืึทืืข ืื ืื ืงืจืืคึผืืื ืฉืืจื ืึทืืื ืึทื ืึทื ืฉืืึธื ืคืื "META-INF /" ืืืจ ืืึทืงืืืขื "BLABLINF /", ืฉืึทืคึฟื ืึท ืืขืงืข ืืื ืืขื ื ืึธืืขื ืืื ืื ืึทืคึผืง ืืื ืืืืื ืื ืืืขืืืขืจืงืข ืืืขืืขืจืขืจ ืืึทืืืืึทืื.
ืืืจ ืึทืกืขืืืึทื, ืฆืืืื, ืื ืกืืึทืืืจื, ืงืึทืืขืจ. ืืื ืืึธ! ืืืจ ืืึธืื ืืขื ืฉืืืกื!
ืืืื
ืืืจ ืืืงืืืขื ืึท ืฉืืืกื ืืื ืึทื ืื ืืืืึทืืืืึทืืืึธื ืืืขืงืืึธืจ ืืืืื ืฆื ืืขืจ ืฉืืืกื. ืืึธืืืจ ืคึผืจืืืืจื ืฆื ืืขืงืจืืคึผื ืื ืกืขืจืืืขืจ ืขื ืืคืขืจ ืืื CBC ืืึธืืข.
ืืืจ ืืขื ืื ืึทืจืงืืืื URL, ืขืคึผืขืก ืขื ืืขื ืฆื MD5, "extract_unzipsize" ืืื ืึท ื ืืืขืจ. ืืืจ ืงืึธื ืืจืึธืืืจื: ืื MD5 ืคืื ืื ืึทืจืงืืืื ืืื ืื ืืขืืืข, ืื ืืจืืืก ืคืื ืื ืึทื ืคึผืึทืงื ืืืืืืึธืืขืง ืืื ืื ืืขืืืข. ืืืจ ืืขื ืขื ืืจืืื ื ืฆื ืคึผืึทืืฉ ืืขื ืืืืืืึธืืขืง ืืื ืืขืื ืขืก ืฆื ืืขื ืืืขืืขืจืขืจ. ืฆื ืืืืึทืื ืึทื ืืื ืืืขืจ ืคึผืึทืืฉื ืืืืืืึธืืขืง ืืื ืืึธืืืื, ืืืจ ืืืขืื ืึธื ืืืืื ืึทื ืื ืืขื ื ืฆื ืฉืึทืคึฟื ืึท SMS ืืื ืืขื ืืขืงืกื "PWNED!" ืืืจ ืืืขืื ืคืึทืจืืืึทืื ืฆืืืื ืจืขืกืคึผืึธื ืกืขืก ืคืื ืื ืกืขืจืืืขืจ:
ืืขืจ ืืืขืืขืจืขืจ ืคืจืืืื ืฆื ืึธืคึผืืึธืืืจื ืื ืึทืจืงืืืื ืขืืืขืืข ืืึธื, ื ืึธื ืืืึธืก ืขืก ืืื ืึท ืืขืืช. ืืืืืจื ืขืคืขืก
ืขืจ ืืื ื ืืฉื ืืื. ืืื ืึท ืจืขืืืืืึทื ืคืื ืึทื ืึทืืืืืื ื ืืขื ืืขืจืงืืง ืคึฟืึธืจืืึทื, ืขืก ืคืืจืงืขืจื ืืืืก ืึทื ืืขืจ ืกืขืจืืืขืจ ืืืื ืืจืึทื ืกืืืื ืื ืืจืืืก ืคืื ืืขื ืึทืจืงืืืื:
ืขืก ืืื ืงืึธืืขื ืืื LEB128. ื ืึธื ืืขื ืคึผืึทืืฉ, ืื ืืจืืืก ืคืื ืืขื ืึทืจืงืืืื ืืื ืื ืืืืืืึธืืขืง ืืื ืึท ืืืกื ืืขืืืื, ืึทืืื ืืขืจ ืืืขืืขืจืขืจ ืืื ืืขืืืืื ืึทื ืืขืจ ืึทืจืงืืืื ืืื ืืึทืื ืืึธืืืื ืงืจืื, ืืื ื ืึธื ืขืืืขืืข ืคืจืืืื ืขืก ืืื ืึท ืืขืืช.
ืืืจ ืกืืจืืืขืจื ืื ืืจืืืก ืคืื ืืขื ืึทืจืงืืืื... ืืื โ ื ืฆืืื! ๐ ืืขืจ ืจืขืืืืืึทื ืืื ืืื ืื ืืืืืขื.
ืงืึธื ืกืขืงืืืขื ืกืขืก ืืื ืืขืืืขืืึธืคึผืขืจ ืึธืคึผืจืืฃ
ืืื ืืขืจ ืืขืืืืงืขืจ ืืืขื, ืืึทืงืขืจื ืงืขื ื ืืฆื ืื ืื ืกืึทืงืืขืจ ืฉืืจืื ืคืื UC ืืจืึทืืืขืจ ืฆื ืคืึทืจืฉืคึผืจืืืื ืืื ืืืืคื ืืืืืข ืืืืจืึทืจืืขืก. ืื ืืืืืจืขืจืื ืืืขื ืึทืจืืขืื ืืื ืืขื ืงืึธื ืืขืงืกื ืคืื ืืขื ืืืขืืขืจืขืจ, โโืึทืืื ืืื ืืืขืื ืืึทืงืืืขื ืึทืืข ืื ืกืืกืืขื ืคึผืขืจืืืฉืึทื ื. ืืื ืึท ืจืขืืืืืึทื, ืื ืคืืืืงืืื ืฆื ืืืืึทืื ืคืืฉืื ื ืคึฟืขื ืฆืืขืจ, ืืื ืืขืืื ื ืืื ืึทืงืกืขืก ืฆื ืื ืืจืืขืื ืืขืงืขืก ืคืื ืืึทืจืึทื ืฅ ืืื ืขืืืฉ ืืืขืืืขืจืงืข, ืึทืจืืึทื ืืขืจืขืื ื ืืึธืืื ืก, ืคึผืึทืกืืืขืจืื ืืื ืงืืืืขื ืกืืึธืจื ืืื ืื ืืึทืืึทืืืืก.
ืืืจ ืงืึธื ืืึทืงืืขื ืื ืืขืืืขืืึธืคึผืขืจืก ืคืื UC ืืจืึทืืืขืจ ืืื ืื ืคืึธืจืื ืืื ืืืขืื ืืขื ืคึผืจืึธืืืขื ืืืึธืก ืืืจ ืืขืคึฟืื ืขื, ืืขืคืจืืืื ืฆื ืคืื ื ืืืืก ืื ืืืึทืื ืขืจืึทืืืืืื ืืื ืืืึทื ืืขืคืึทืจ, ืึธืืขืจ ืืื ืืึธืื ื ืืฉื ืืืกืงืืืืจื ืขืคึผืขืก ืืื ืืื ืื. ืืขืจืืืืึทื, ืืขืจ ืืืขืืขืจืขืจ ืคืืจืืืืื ืฆื ืคืืึธื ื ืืืื ืืขืคืขืจืืขื ืฉืืจืื ืืื ืงืืึธืจ ืืขืจืืขื. ืืืขืจ ืึทืืึธื ืืืจ ืื ืืคืืขืงื ืื ืืขืืึทืืืก ืคืื ืื ืืืึทืื ืขืจืึทืืืืืื, ืขืก ืืื ื ืื ืืขืจ ืืขืืืขื ืฆื ืืืื ืึธืจืืจื ืขืก ืืื ืคืจืืขืจ. 27 ืืขืจืฅ ืืื ืืขืืืขื
ืึท ื ืืึทืข ืืืขืจืกืืข ืคืื โโโโUC Browser 12.10.9.1193 ืืื ืืืคืจืืื, ืืืึธืก ืึทืงืกืขืกื ืื ืกืขืจืืืขืจ ืืืจื ืืืืคึผืก:
ืืื ืึทืืืฉืึทื, ื ืึธื ืื "ืคืึทืจืจืืืื" ืืื ืืื ืื ืฆืืื ืคืื ืฉืจืืืื ืืขื ืึทืจืืืงื, ืืจืืื ื ืฆื ืขืคึฟืขื ืขื ืึท ืคึผืืฃ ืืื ืึท ืืืขืืขืจืขืจ ืจืืืึทืืืื ืืื ืึท ืืขืืช ืึธื ืืึธื ืืื ืื ืืขืงืกื "ืึธืึธืคึผืก, ืขืคึผืขืก ืืื ืคืึทืืฉ!" ื ืืงืฉื ืฆื ืื ืกืขืจืืืขืจ ืืื ื ืืฉื ืืขืืืื ืืืขื ืืจืืื ื ืฆื ืขืคึฟืขื ืขื ืึท ืคึผืืฃ, ืึธืืขืจ ืึท ืืงืฉื ืืื ืืขืืืขื ืืขืืืื ืืืขื ืืขืจ ืืืขืืขืจืขืจ ืืื ืืึธื ืืฉื, ืืืึธืก ืืื ืฅ ืืืืฃ ืื ืคืืจืืืืื ืคืืืืงืืื ืฆื ืึธืคึผืืึธืืืจื ืขืงืกืขืงืืืึทืืืข ืงืึธื ืืื ืืืืขื ืคืื Google ืคึผืืืึท ืึผืืืื.
ืืงืืจ: www.habr.com