áááá«ááºáž
áááºááá¯ááºááŸá¬ áá»áœááºáá±á¬áºááá¯
áááŒá¬áá±ážáá®á UC Browser ááᯠááŒá±á¬áºááŒá¬ááŒá®áž ááŒááºážááŒááºážáááºááẠááŒáá·áºáá±áá²á·áááº- áááºážááᯠá¡áá¯á¶ážááŒá¯áá°áá»á¬ážá á
ááºáá»á¬ážááœáẠmalware áá¯á¶ážááŒá®áž áá®áá®ááá¯ááá¯ááºáá»á¬áž áá±á¬ááºáá±á¬ááºáᬠáááºááá¯ááºá¡áá»áá¯ážáá»áá¯ážá០ááŒáá·áºáá±áá²á·ááẠ(á¥ááá¬á á¡áá¯á¶ážááŒá¯áá°áá»á¬ážááẠáááºážááá¯á·ááẠáááºážááá¯á·ááᯠáá±á«ááºážáá¯ááºááœá²áá±áááºáᯠáááºááŒááºáá±ááŒáá±á¬áºáááºážá áááºážá¡á
á¬áž á€ááá±á¬ááºáá¬ááŒáá·áº APK áá
áºáá¯ááᯠáááºáá¶áááŸááááº)á ááá±á¬ááºáá¬ááẠáá±ááºáá±á¬ááºáá»áá±ááŒá®á á¡á¬ážáááºážáá»ááºááŸáááŒá®áž ááá¯áá²á·ááá¯á·áá±á¬ á¡áá¬áá»á¬ážáá«ááá·áº ááŒá±á¬ááºá
áá¬ááá°ážá
ááºážáá»á¬ážááᯠá¡áá¯á¶ážááŒá¯áá¬ážáááºá VK ááŸáááá¬ážááẠUC Browser á¡á¯ááºá
á¯ááœááºááŸááááºá
áá±ážáá¬ážáá±á
ááºááœááºá UC Browser ááœáẠGoogle Play ááœáẠááá·áºááœááºážááŸá¯áá±á«ááºáž 500 áá»á±á¬áºááŸááááºá áá«á á¡áááºááŒá®ážá
áá¬áá«áá²á Google Chrome ááŸá¬áᬠááá¯ááŸááááºá áá¯á¶ážáááºáá»ááºáá»á¬ážáá²ááœáẠááŒá±á¬áºááŒá¬ááŸáá·áº Google Play ááŸá á¡ááá®áá±ážááŸááºážá¡áá»áá¯á·áᶠááŒááºááœáŸááºážááŸá¯áá»á¬ážááŸáá·áº áááºáááºá ááá¯ááºááŒá¬ážáá»ááºáá»á¬ážá
áœá¬ááᯠáááºááœá±á·ááŒááºááá¯ááºáá«áááºá á€áááºááŸá¬ áá»áœááºá¯ááºááá¯á·á áá¯áá±ááááŒá¯áááŒááºážá á¡ááŒá±á¬ááºážáááºážááŒá
áºáááº- UC Browser ááẠááá±á¬ááºážááŸá¯áá
áºáá¯áᯠáá¯ááºáá±á¬ááºáá±ááá¬ážáᯠáá¯á¶ážááŒááºáá²á·áááºá ááŒá®ážâáá±á¬á· áá°âáá¯ááºâáá¬âááŒá
áºâááœá¬ážâáááºá
á¡ááá®áá±ážááŸááºážáá¯ááºááœááºá áá±á«ááºážáá¯ááºáá¯ááºá áá¯ááºáá±á¬ááºááá¯ááºáá±á¬ áá¯ááºááᯠááŸá¬ááœá±ááœá±á·ááŸáááá¯ááºáááºá
á¡á±á¬ááºááœááºáá±ážáá¬ážááá·áºá¡áá¬á¡á¬ážáá¯á¶ážááẠáá±á·áá¬áá»áááºá¡ááœááºáž Google Play ááœááºáááŸáááá¯ááºáá±á¬ UC Browser áá¬ážááŸááºážá¡ááœáẠáááºááá¯ááºáááº-
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 áá±á¬ááºážááá¯áá»ááºáá
áºáá¯ááŒá¯áá¯ááºáááºá
ááá¯á·ááŒá±á¬áá·áºá á¡áá¯á¶ážááŒá¯áá°áá áºáŠážááẠbrowser ááœáẠPDF ááá¯ááá¯ááºááá¯ááºááœáá·áºááá¯áá±á¬á¡áá«á á¡á±á¬ááºáá«áá±á¬ááºážááá¯áá»ááºáá»á¬ážááᯠtraffic ááœááºááœá±á·ááá¯ááºáááº-
ááááŠážá
áœá¬ POST áá±á¬ááºážááá¯áá»ááºáá
áºáá¯ááŸááááºá
PDF ááŸáá·áº áá¯á¶ážáá±á¬áºáááºáá»á¬ážááᯠááŒáá·áºááŸá¯áááºá¡ááœáẠá
á¬ááŒáá·áºááá¯ááºáá
áºáá¯áá«ááŸááá±á¬ áá±á¬áºááœááºážááᯠáá±á«ááºážáá¯ááºáá¯ááºáá¬ážáááºá ááááá±á¬ááºážááá¯áá»ááºááẠá
áá
áºá¡ááŒá±á¬ááºáž á¡áá»ááºá¡ááẠ(á¡áááºážáá¯á¶áž ááá¯á¡ááºáá±á¬ á
á¬ááŒáá·áºááá¯ááºááᯠáá±ážáá±á¬ááºááẠáááá¯áá¬áááá¯áá¬) ááᯠáá±ážááá¯á·áááºáᯠáá°ááááŒá®áž áááºážááᯠáá¯á¶á·ááŒááºáááºá¡ááœáẠááá±á¬ááºáá¬ááẠáá±á«ááºážáá¯ááºáá¯ááºááẠááá¯á¡ááºááá·áº á
á¬ááŒáá·áºááá¯ááºááŸáá·áº áááºáááºáá±á¬ á¡áá»ááºá¡áááºá¡áá»áá¯á·ááᯠáááºáá¶áááŸááááº- ááááºá
á¬ááŸáá·áº ááŒá
áºááá¯ááºáááºá , á¡ááŒá¬ážáá
áºáá¯áá¯á ááŒá¿áá¬ááŸá¬ á€áá±á¬ááºážááá¯áá»ááºááᯠáá¯ááºááŸááºáá¬ážááŒááºážááŒá
áºáááºá
á¡ááá¯ááºážáá áºááá¯ááºážááᯠáá±á¬ááºážááá¯áá«á
á¡ááŒá±á¡ááá¯ááºážá¡á
á á¬ááŒáá·áºááá¯ááºááá¯ááºááá¯ááºá ZIP ááŸá¬ áá¯ááºááá¯ážáá¬ážááŒá®áž á á¬ááŸááºááá¬ážáá«á
áá¬ááºá¡ááœá¬ážá¡áᬠáá¯ááºááŸááºááŒááºážáá¯ááºááᯠááŸá¬ááœá±áá«á
áá¬áá¬áá¯á¶á·ááŒááºááŸá¯ááᯠáá¯á¶áá±á¬áºááŒáá·áºáá¡á±á¬ááºá á¡áááºážáá¯ááºááᯠááŒáá·áºáá¡á±á¬áẠ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 bytes array áá áºáᯠáááºáá®ážááŒááºážááŸáá·áº áááºážá ááŒáá·áºá áœááºááŒááºáž- 0x5F, 0, 0x1F, -50 (=0xCE) ááᯠá¡á¬áá¯á¶á áá¯ááºáá«áááºá á¡áááºáá±á¬áºááŒáá« áá±á¬ááºážááá¯áá»ááºááœáẠáá»áœááºá¯ááºááá¯á·ááœá±á·ááŒááºáááá·áºá¡áá¬ááŸáá·áº ááá¯ááºááá¯ááºáá«áááºá
áá°áá®áá±á¬á¡áááºážááœáẠá¡ááŒá¬ážá áááºáááºá á¬ážááœááºáááºážáááºážáá áºáá¯áá«ááŸááá±á¬ nested class ááᯠáááºááœá±á·ááá¯ááºáááº-
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");
}
}
áááºážáááºážááẠinput á¡ááŒá
Ạbytes á array áá
áºáá¯ááá¯áá°ááŒá®áž áá¯á byte ááẠ0x60 ááá¯á·ááá¯áẠáááá byte ááẠ0xD0 ááŒá
áºááŒá®ážá áá¯ááá byte ááẠ1á 11 ááá¯á·ááá¯áẠ0x1F ááŒá
áºáááºááᯠá
á
áºáá±ážáá«áááºá áá¬áá¬á០áá¯á¶á·ááŒááºááŸá¯ááᯠáá»áœááºá¯ááºááá¯á· ááŒáá·áºááŸá¯áááº- áá¯áááá¯ááºááẠ0x60á áá¯áááááẠ0x1Fá ááááááẠ0x60 ááŒá
áºáááºá áá«ááá¯á·ááá¯áááºááá¯. áá»ááºážááŒá±á¬ááºážáá»á¬ážááŒáá·áº á¡áá²ááŒááºááŒááºáž (á¥ááá¬á "up_decrypt"á áá¬áá¬á áá¯á¶á·ááŒááºááŸá¯ááᯠá
á¬ááŸááºáá±ážááá·áº áááºážáááºážááᯠá€áá±áá¬ááœáẠáá±á«áºááá·áºáá«áááºá
áááºážáááºážááᯠáááºááœá¬ážáá¡á±á¬áẠgj. áááá¡ááŒááºážá¡áá¯á¶ááẠoffset 2 ááœáẠbyte (á¥ááᬠ0x1F) ááŒá
áºááŒá®áž áá¯áááááŸá¬ áá¬áá¬áá¯á¶á·ááŒááºááŸá¯áááŸááá²á
ááá 16 bytes á
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 ááŸáá·áº áá®áá±á¬ case ááẠááŒá
áºááá¯ááºááá·áº ááœá±ážáá»ááºá
áᬠáá¯á¶ážáá¯áá²á០áá
áºáá¯ááᯠáááºááœáŸááºážáááºá
áá»áœááºá¯ááºááá¯á·ááẠáá¯ááºááᯠáááºáááºááœá²ááŒááºážá áááºááŒá¬áááºá ááŸá áºááŒáááºáá¯ááºááŒá®ážáá±á¬áẠáá»áœááºá¯ááºááá¯á·ááẠááááááá¯ááºááᯠááŸááºážááŒááá·áºá¡áááºááŒáá·áº áááºážáááºážáá áºáá¯ááœáẠáá»áœááºá¯ááºááá¯á·ááᯠááœá±á·ááŸáááááºá 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 interface com.alibaba.wireless.security.open.staticdataencrypt.IStaticDataEncryptComponentá á€á¡ááºáá¬áá±á·á áºááá¯á¡áá±á¬ááºá¡áááºáá±á¬áºááá·áº áááºáá¡ááá®áá±ážááŸááºážáá¯ááºááœáẠá¡áááºážáá»á¬ážáááŸááá«á ááá¯ááºáá²ááŸá¬ áá®ááá¯áá»áá¯áž class áá áºáá¯ááŸááááºá lib/armeabi-v7a/libsgmain.soááááºáá±á¬á· a .so, but a .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. á€á¡áá¬á¡á¬ážáá¯á¶ážááᯠ10601 áá¶áá«ááºááŸááá±á¬ Router ááá¯á·ááœáŸá²ááŒá±á¬ááºážááẠ- áááºážáááºá¡áááá·áºáá¶áá«ááºááŒá
áºáááºá
áá±á¬ááºá¡áá°ážá¡ááŒá±á¬ááºážááœá±áá²á· ááœááºážáááºááœá±áá±á¬ááºááŸá¬ á¡ááºáá¬áá±á·á áºááᯠá¡áá±á¬ááºá¡áááºáá±á¬áºáá²á· á¡áááºážáá áºáá¯ááᯠááŸá¬ááœá±á·áá«áááºá IRouter á¡á áááºá¡ááá¯ááºáž ááŸáá·áºáááºážáááºáž 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 virtual machine ááá¯ááŒá±á¬ááŒááẠáááºážáááºážááŸá áºáá¯ááŸááááºá ááááá áºáá¯á áá»áá¯ážá áááºá¡áááºáá áºáá¯áá±ážááááºá Java_package_name_ClassName_MethodName.
áá¯áááá¡áá»ááºááŸá¬ á
á¬ááŒáá·áºááá¯ááºááᯠáááºááá·áºá¡áá« ááŸááºáá¯á¶áááºáááºááŒá
áºááẠ(áá¯ááºáá±á¬ááºáá»ááºááœáẠJNI_OnLoad)
function call ááᯠá¡áá¯á¶ážááŒá¯ á
á¬áááºážááœááºážáá°áá»á¬áž.
áá»áœááºá¯ááºááá¯á·áá¡ááŒá±á¡áá±ááœááºá áá»áœááºá¯ááºááá¯á·ááẠááááááºážáááºážááá¯á¡áá¯á¶ážááŒá¯áá«áá á¡áááºááẠá€áá²á·ááá¯á·ááŒá áºááá·áºáááº- Java_com_taobao_wireless_security_adapter_JNICLibrary_doCommandNative.
áááºááá¯á·áá¬ážáá±á¬ áá¯ááºáá±á¬ááºáá»ááºáá»á¬ážááŒá¬ážááœáẠááá¯áá²á·ááá¯á·áá±á¬ áá¯ááºáá±á¬ááºáá»ááºáá»áá¯áž áááŸááá«á ááá¯ááá¯áááºááŸá¬ áááºááẠáá±á«áºááá¯ááŸá¯ááᯠááŸá¬ááœá±ááẠááá¯á¡ááºáááºá á
á¬áááºážááœááºážáá°áá»á¬áž.
Function ááᯠááœá¬ážááŒáá·áºáá¡á±á¬áẠJNI_OnLoad ááŒá®ážáá±á¬á· áá®áá¯á¶ááᯠáá«ááá¯á·ááŒááºááááº
áá®ááŸá¬áá¬ááœá±ááŒá
áºáá±áá¬áá²? ááááá
áºáá»ááºááœááºá áá¯ááºáá±á¬ááºáá»ááºáá¡á
ááŸáá·áºá¡áá¯á¶ážááẠARM áááá¯áá¬á¡ááœááºáá¯á¶ááŸááºááŒá
áºáááºá stack áá±á«áºááŸá áááááœáŸááºááŒá¬ážáá»ááºááẠáááºážááá¯ááºáááºážáááºáááºááŸá¯ááœáẠá¡áá¯á¶ážááŒá¯ááá·áº ááŸááºáá¯á¶áááºááŒááºážá¡ááŒá±á¬ááºážá¡áá¬áá»á¬áž (á€ááá
á¹á
ááœááºá R0á R1 ááŸáá·áº R2) ááŸáá·áº function á០return address áá«ááŸááá±á¬ LR register á á¡ááŒá±á¬ááºážá¡áá¬áá»á¬ážááᯠááááºážáááºážáá¬ážáááºá . áá±á¬ááºáá¯á¶ážááœáŸááºááŒá¬ážáá»ááºááẠááááºážáááºážáá¬ážáá±á¬ ááŸááºáá¯á¶áááºáá»ááºáá»á¬ážááᯠááŒááºáááºááá°ááŒá®áž ááŒááºááá¯á·ááá·áºááááºá
á¬ááᯠPC ááŸááºáá¯á¶áááºááŒááºážááœáẠáá»ááºáá»ááºážááá·áºááœááºážáá¬ážááẠ- ááá¯á·ááŒá±á¬áá·áº áá¯ááºáá±á¬ááºáá»ááºá០ááŒááºááœááºáá¬áááºá ááá¯á·áá±á¬áº á¡áá®ážáááºááŒáá·áºáá»áŸáẠá¡áá¯á¶ážá
áœááºááœáŸááºááŒá¬ážáá»ááºááẠstack ááœááºááááºážáááºážáá¬ážáá±á¬ return address ááá¯ááŒá±á¬ááºážáá²ááœá¬ážáááºááᯠáááááŒá¯áááá«áááá·áºáááºá ááŒá®ážááẠáááºááá¯ááŒá
áºááá² ááœááºááŒáá·áºáá¡á±á¬ááº
áá¯áẠá¡áá±á¬ááºá¡áááºáá±á¬áºááŸá¯á á¡áá»áá¯á·áá±á¬ááááºá
á¬ááᯠ1xB0 ááᯠR130 ááœáẠáááºáá¬ážááŒá®ážá 5 ááᯠáááºážá០áá¯ááºááŒá®áž R0 ááá¯á· ááœáŸá²ááŒá±á¬ááºážááŒá®áž 0x10 ááᯠáááºážááœáẠáá±á«ááºážááá·áºáááºá 0xB13B ááœááºáá¬áááºá ááá¯á·ááŒá±á¬áá·áºá IDA ááẠáá±á¬ááºáá¯á¶ážááœáŸááºááŒá¬ážáá»ááºááẠáá¯á¶ááŸááºáá¯ááºáá±á¬ááºááŸá¯ááŒááºáá¬ááŒááºážááŒá
áºáááºáᯠáá°ááá±á¬áºáááºáž á¡ááŸááºááááºááœáẠáááºážááẠááœááºáá»ááºáá¬ážáá±á¬ááááºá
ᬠ0xB13B ááá¯á·ááœá¬ážáá±áááºá
ARM áááá¯áááºáá¬áá»á¬ážááœáẠáá¯ááºááŸá áºáá¯ááŸáá·áº ááœáŸááºááŒá¬ážáá»ááºááŸá áºáá¯áá«ááŸááááº- ARM ááŸáá·áº Thumb ááá¯á·ááᯠá€áá±áá¬ááœáẠááááááá·áºáááºá ááááºá á¬á áááá¬áááºááŸá¬ážáá±á¬áááºážáááºážááẠáááºááá·áº instruction set ááá¯á¡áá¯á¶ážááŒá¯áá±ááá·áº áááá¯áááºáá¬á¡á¬áž ááŒá±á¬ááŒáááºá ááá¯ááá¯áááºááŸá¬á ááááºá á¬ááẠá¡ááŸááºáááẠ0xB13A ááŒá áºááŒá®ážá áááá¬áááºááŸá¬ážáá±á¬ á¡áááºážá¡áá»á¬ážáá²á០áá áºáá¯ááẠThumb áá¯ááºááᯠááœáŸááºááŒáááºá
á¡áá¬ážáá° âáááºááá¬â ááᯠá€á
á¬ááŒáá·áºááá¯ááºááŸá áá¯ááºáá±á¬ááºáá»ááºáá
áºáá¯á
á®áá¡á
ááœáẠááá·áºááœááºážáá¬ážáááºá
á¡ááŸáá¯ááºáá¯ááºá áá»áœááºá¯ááºááá¯á·ááẠáááºážááá¯á·á¡áá±á«áºááœáẠáá±á¬ááºáááºá¡áá±ážá
áááºáá»áá±áááºááá¯áẠ- áá»áœááºá¯ááºááá¯á·áᬠááŸááºáááá«áááºá
áá¯ááºáá±á¬ááºáá»ááºá¡á¬ážáá¯á¶ážáá®ážáá«ážá áááá·áºá¡á
ááẠá¡áááºážáááºáá±ážááœá¬áááºá
áá¯ááºááẠ0xB13A ááá¯á· ááŒááºáá¬ážá áœá¬ ááá¯ááºáá±á¬ááŒá±á¬áá·áºá IDA ááá¯ááºááá¯ááºá áá¯ááºááẠá€áá±áá¬ááœáẠáááºááŸáááŒá±á¬ááºáž á¡ááá¡ááŸááºáááŒá¯áá«á áá°áá®áá±á¬á¡ááŒá±á¬ááºážááŒá±á¬áá·áºá áááºážááẠááœá²ááŒááºážá áááºááŒá¬ááŸá¯á¡áááºáááºáááºáá²á á±ááá·áº á á¬ááŒáá·áºááá¯ááºááŸááá¯ááºá¡áá»á¬ážá á¯ááᯠáá¯ááºá¡ááŒá Ạá¡ááá¡ááŸááºáááŒá¯áá«á á€á¡áá¬ááẠáá¯ááºááŒá áºááŒá±á¬ááºáž IDA ááá¯á· áá»áœááºá¯ááºááá¯á·ááŒá±á¬áá¬ážááŒá®ážá áááºážááẠá¡áááºá¡áá¬ááŒá áºááááºážá
ááá¬ážááẠ0xB144 á០á
áááºááẠá sub_494C ááŸá¬ áá¬áá«áá²á
LR ááŸááºáá¯á¶áááºááŒááºážááœáẠá€áá¯ááºáá±á¬ááºáá»ááºááᯠáá±á«áºáá±á¬á¡áá«á áá»áœááºá¯ááºááá¯á·ááẠááááºá áá±á¬áºááŒáá¬ážáá±á¬ááá¬áž (0xB144) áááááºá
á¬ááᯠáááŸááá«áááºá R0 ááœáẠ- á€ááá¬ážááŸá á¡ááœáŸááºážá ááá¯ááá¯áááºááŸá¬á áááºááá¯ážááá¯ááá¬ážááŸáá°áááºá LR ááá¯á·ááá·áºáááºá ááááºááŒá
áºáááºá
ááœá¬ážáááá·áºááááºá
á¬á á¡á²áá«ááᯠááœááºááŒáá·áºáá¡á±á¬ááº- 0xB144 + [0xB144 + 8* 4] = 0xB144 + 0x120 = 0xB264á áá»áœááºá¯ááºááá¯á·áááºáá¶áááŸááá¬ážáá±á¬ááááºá
á¬ááá¯á·ááœá¬ážáᬠá¡áá¯á¶ážáááºáá±á¬áááºážááœáŸááºáá»ááºá¡áá»áá¯á·ááá¯ááŒáá·áºáá«á 0xB140 ááá¯á· áááºáá¶ááœá¬ážáá«á
ááá¯á¡áá« ááá¬ážá០á¡ááœáŸááºáž 0x20 ááŒáá·áº á¡á±á¬á·ááºáááºááœáẠá¡ááœááºáá°ážááŒá±á¬ááºážááŸá¯áá
áºáᯠááŸááá«áááºá
ááá¬ážá á¡ááœááºá¡á á¬ážááŒáá·áº á¡áá²ááŒááºáá«áá áá¯ááºááœáẠá¡ááŒá±á¬ááºážá¡áá²áá»á¬ážá áœá¬ ááŸááááá·áºáááºá ááááºá á¬áá»á¬ážááᯠááá¯ááºááá¯ááºáááœááºáá»ááºáá² áááºážááᯠáá áºáááºážáááºážááŒáá·áº á¡ááá¯á¡áá»á±á¬áẠááá¯ááºááœááºááŒá±ááŸááºážááẠááŒá áºááá¯ááºáááŒá Ạáá±ážááœááºážáá±á«áºáá¬áááºá ááŸáá·áº script áá»á¬ážááŸáá·áº IDA ááœáẠpatch áá¯ááºáá¯ááºááá¯ááºá áœááºážááá¯á·ááẠáá»áœááºá¯ááºááá¯á·áá¡áá°á¡áá®ááá¯á· áá±á¬ááºáá¬áááº-
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 ááœáẠáááºááŸááá±ááá·áº ááááºá
á¬ááœáẠáá°áá±á¬ááºááœá¬ážááŒá®ážá ááá¯á·áá±á¬áẠááááºááááºá
á¬á០áááºááá¯ážááᯠáá°áᬠstack áá±á«áºááœáẠáááºááá¯ááºáá«áááºá ááá¯á·á¡ááŒááºá 4 ááᯠLR ááœáẠáá±á«ááºážááá·áºáá¬ážáá±á¬ááŒá±á¬áá·áº áá¯ááºáá±á¬ááºáá»ááºááŸááŒááºáá¬ááŒá®ážáá±á¬ááºá á€áá°áá®áá±á¬ offset ááᯠáá»á±á¬áºááœá¬ážáááºááŒá
áºáááºá ááá¯á·áá±á¬áẠPOP {R1} á¡áááá·áºááẠstack á០ááááºáááºááá¯ážááᯠáá°áááºá ááááºá
ᬠ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"
Script áá¯ááºáá±á¬ááºááŒááºážáááááº-
áá¯ááºáá±á¬ááºáá»ááºááœáẠá¡áá¬á¡á¬ážáá¯á¶ážááᯠáá¬áá±ážááŒá®ážáááºááŸáá·áºá áááºááẠ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 á¡áááºážá¡áááºááᯠááŸááºážáááºážá áœá¬ áá¯ááºááŸááºáá¬ážáááºá á€áá¯ááºáá±á¬ááºáá»ááºá¡ááœáẠááá·áºáááºáá»ááºáá»á¬ážá¡áá±ááŒáá·áºá áá¯ááºááŸááºáá¬ážáá±á¬áá±áá¬ááŸáá·áº áááºáá°áá±á¬ áá±áá¬áá®ááá¯á· ááœáŸááºááŒáá»ááºáá áºáá¯á á¡áá»áá¯á·áá±á¬ ááŒá¬ážáá¶áá áºáá¯ááŸáá·áº áá¶áá«ááºáá áºáá¯ááᯠáá»á±á¬áºááœá¬ážáá«áááºá áá¯ááºáá±á¬ááºáá»ááºááᯠáá±á«áºááá¯ááŒá®ážáá±á¬ááºá áááºážááẠáá¯ááºáá±á¬ááºáá»ááºááá¯á· áá±ážááá¯á·ááœá¬ážáá±á¬ááŒá±á¬áá·áº ááŒá¬ážáá¶ááœáẠáá¯ááºááŸááºáá¬ážáá±á¬ ááá¯ááºážáá áºáᯠááŸááá±áááºááŸá¬ áááºááŸá¬ážáá«áááºá FindClassclass name ááᯠáá¯ááá parameter á¡ááŒá Ạáá°áá«áááºá ááá¯á·ááŒá±á¬áá·áºá áá¶áá«ááºááẠááŒá¬ážáá¶á¡ááœááºá¡á á¬áž ááá¯á·ááá¯áẠááá¯ááºážáá¡ááŸááºááŒá áºáááºá á¡áááºážá¡áááºááᯠáá¯á¶áá±á¬áºááŒáá·áºáá¡á±á¬ááºá áá«ááá¯á·á áááºážááŒá±á¬ááºážááŸááºáá±á«áºáá±á¬ááºáá±áá¬áá¬ážááá¯áᬠááŒá±á¬ááŒááá·áºáááºá áá¬ááœá±ááŒá áºáá»ááºáá±áá²ááá¯áá¬ááᯠá¡áá®ážáááºáá±á·áá¬ááŒáá·áºáá¡á±á¬áẠ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 áááºááŸááºáá¬ážáá±á¬á¡ááœááºá¡á á¬ážááŸá byte á¡áááºážá¡áá»ááºážáá»á¬ážá¡ááœáẠááœááºááááºáá¬áá áºáá¯á á¥ááá¬áá áºáá¯ááᯠáááºáá®ážááẠ(á¡áá±ážá áááºá¡á¬ážááŒáá·áº á€ááœááºááááºáá¬áá»á¬ážááœáẠáá»áœááºá¯ááºááá¯á·áá±áááºááá¯ááºáá«)á á€áá±áá¬ááœáẠááá¯ááœááºááááºáá¬ááŸá áºáá¯ááᯠáááºáá®ážáá¬ážáááº- áá áºáá¯ááŸá¬ ááá¯ááºážáá«ááŸááááºá "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 parameter ááẠááááºá value 3 ááᯠáááºááŸááºáá±ážáá¬ážááá·áº ááœá²á·á ááºážáá¯á¶á¡ááœááºáá áºáá¯ááŒá áºáááºá case 3 ááá¯ááŒáá·áºáá«- function ááá¯ááŒáá·áºáá«á sub_6364C ááááºáá¯ááºáá±á¬ááºááŸá¯ááœáẠááá·áºááœááºážáá¬ážáá±á¬ ááá·áºáááºáá»ááºáá»á¬ážá ááá¯ááá¯áááºááŸá¬ áá±á¬á·ááŸáá·áº áá¯ááºááŸááºáá¬ážáá±á¬ áá±áá¬áá»á¬ážáá¶á០ááŒááºáááºážááœá¬ážáá«áááºá á¡áá®ážáááºááŒáá·áºááẠsub_6364CáááºážááœáẠRC4 algorithm ááᯠááẠááŸááºááááá¯ááºáááºá
áá»áœááºá¯ááºááá¯á·ááœáẠalgorithm ááŸáá·áº áá±á¬á·áá áºáá¯ááŸááááºá á¡áááºážá¡áááºááᯠáá¯á¶áá±á¬áºááŒáá·áºáá¡á±á¬ááºá á€ááœááºááŒá áºáá»ááºáá²á·áááº- com/taobao/wireless/security/adapter/JNICLibrary. ááá¯ááºáááº! áá«ááá¯á·á áááºážááŒá±á¬ááºážááŸááºáá±á«áºáá±á¬ááºáá±ááŒá®á
á¡áááá·áºáá±ážáá áºáááº
ááᯠáá»áœááºá¯ááºááá¯á·ááẠá áááºáá±á«áºááŸá¯ááᯠááŸá¬ááœá±ááẠááá¯á¡ááºáá«áááºá á á¬áááºážááœááºážáá°áá»á¬ážáá¯ááºáá±á¬ááºáá»ááºááᯠááœáŸááºááŒáááá·áºáááºá 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á¥ááá¬á áá»áœááºá¯ááºááá¯á·ááá á¹á ááœááºá áá á ááŸáá·áº áá á€ááááºážáá¯á¶ážáá¯á¶ážá¡ááŒáẠááœáŸááºááŒáá»ááºáá áºáá¯á JNIEnv ááŸáá·áº function ááá¯á·áá±ážááá¯á·áá±á¬ arguments áá»á¬ážááᯠááœá²á·á ááºážáá¯á¶áá áºáá¯ááá¯á· áá±á«ááºážááá·áºáᬠáá±ážááá¯á·áááºá áááŸááá±á¬ áá¶áá«ááºáá¯á¶ážáá¯ááᯠá¡áá¯á¶ážááŒá¯á (áááºážááá¯á·ááᯠN1á N2 ááŸáá·áº N3) ááá¯á¡áá¯á¶ážááŒá¯á command tree ááá¯áááºáá±á¬ááºáá¬ážáááºá
á€áá²á·ááá¯á·áá±á¬ áá áºáá¯áá¯-
áá
áºáááºááẠá¡ááºááá¯ááºá¡á¬ážááá¯áẠááŒáá·áºááŸááºáá±áááºá JNI_OnLoad.
áá
áºáááºááŸá áááºážááŒá±á¬ááºážááᯠááááºážáá¯á¶ážáá¯á¶ážááŒáá·áº áá¯ááºáá¯ááºáá«á áá
áºáááºá á¡ááœááºáá
áºáá¯á
á®ááœáẠáááºááá¯ááºáá¬áá¯ááºáá±á¬ááºáá»ááºá áá±á«ááºáá±á«ááºááááºá
á¬áá«ááŸááááºá áá±á¬á·ááẠparent node ááœááºááŒá
áºáááºá áá
áºáááºááœááºáá»áœááºá¯ááºááá¯á·ááá¯á¡ááºáá±á¬áá¯ááºáá±á¬ááºáá»ááºááá¯ááá·áºááœááºážááá·áºáá¯ááºááŸááá±áá¬á¡á¬ážááŸá¬ááœá±áá¬ááœááºá¡áá¯á¶ážááŒá¯áá¬ážáá±á¬ááœá²á·á
ááºážáá¯á¶á¡á¬ážáá¯á¶ážááá¯áá¬ážáááºáá«áááááºáá²áá« (áá»áœááºá¯ááºááá¯á·áááºáá»ááºááŒáá·áºááŒá®ážáá±á¬áá±á¬ááºážáá«ážááá¯áááŒáá·áºááœá¬ážá
á±áááºáááºážááá¯á·ááá¯ááá±á¬áºááŒáá«)á
ááá¯ááá¯ááŸá¯ááºááœá±ážá á±áá«áááºá
0x5F1AC á¡ááœá¬ážá¡áá¬ááᯠáá¯ááºááŸááºááá·áºáá±á¬ áá¯ááºáá±á¬ááºáá»ááºá ááááºá á¬ááᯠáá»áœááºá¯ááºááá¯á· áááºáá¶áááŸááá²á·áá«áááºá áá«áá±ááá·áº áááºážááŒá±á¬ááºááá¯á·á á±á¬ááœááºážáá«áááº- UC Browser á developer áá»á¬ážááẠáá»áœááºá¯ááºááá¯á·á¡ááœáẠáá±á¬ááºááẠá¡á¶á·á¡á¬ážááá·áºá áá¬ááᯠááŒááºáááºáá±ážáá¬ážáá«áááºá
Java code ááœááºááœá²á·á
ááºážáá¬ážáá±á¬ array á០parameters áá»á¬ážááá¯áááºáá¶áááŸáááŒá®ážáá±á¬ááºá
ááááºá
ᬠ0x4D070 ááœáẠáá¯ááºáá±á¬ááºáááºá á€áá±áá¬ááœáẠá¡ááŒá¬ážáá±á¬ áá¯ááºááᯠááŸá¯ááºááœá±ážá
á±áá±á¬ á¡áá»áá¯ážá¡á
á¬ážá áá»áœááºá¯ááºááá¯á·ááᯠá
á±á¬áá·áºááŒáá¯áá±áá«áááºá
áá»áœááºá¯ááºááá¯á·ááẠR7 ááŸáá·áº R4 ááœáẠá¡ááœáŸááºážááááºážááŸá áºáá¯ááᯠááá·áºáá¬ážáááºá
áá»áœááºá¯ááºááá¯á·ááẠáááá¡ááœáŸááºážááᯠR11 ááá¯á·ááŒá±á¬ááºážáááº-
ááá¬ážáá
áºáá¯ááŸááááºá
á¬áá
áºáá¯ááá°áááºá á¡ááœáŸááºážáá
áºáá¯ááᯠá¡áá¯á¶ážááŒá¯áá«-
áááááááºá
á¬ááá¯á·ááœá¬ážááŒá®ážáá±á¬ááºá áá¯áááá¡ááœáŸááºážááᯠR4 ááœááºá¡áá¯á¶ážááŒá¯áááºá ááá¬ážááœááºááŒááºá
áẠ230 ááŸááááºá
á¡á²áá«áá²á·áááºáááºááŒá®áž áá¬áá¯ááºáááá²á áááºážááẠááá¯ááºáá áºáá¯ááŒá áºááŒá±á¬ááºáž IDA á¡á¬áž áááºááŒá±á¬ááŒááá¯ááºáááº- áááºážááŒááºááŒááºáž -> á¡ááŒá¬áž -> ááá¯ááºááᯠáááºááŸááºáá« á
ááááºáá¯ááºá ááŒá±á¬ááºá
áá¬áá±á¬ááºážáááºá ááá¯á·áá±á¬áº áááºážá áá±á¬á¡á¯ááºááᯠááŒááºáá»áŸá±á¬ááºáá¬ááœáẠáá»áœááºá¯ááºááá¯á·ááŸáá·áº áááºážááŸá®ážááŒá®ážáá¬áž áá¯ááºáá±á¬ááºáá»ááºáá
áºáá¯ááá¯á· áá±á«áºááá¯ááŸá¯ááᯠáááááŒá¯ááááá¯ááºáááºá sub_6115C:
case 3 ááœáẠRC4 algorithm ááá¯á¡áá¯á¶ážááŒá¯á á
á¬ááŸááºá
áá
áºáá
áºáá¯ááŸááá±ááá·áºááá¯ááºáá
áºáá¯ááŸááááºá á€ááá
á¹á
ááœááºá function ááá¯á·áá±ážááá¯á·áá±á¬ááœá²á·á
ááºážáá¯á¶áááºáá¶ááá¯á·áá±ážááá¯á·áá±á¬ parameters áá»á¬ážááŸááŒáá·áºáááºá doCommandNative. áá«ááá¯á·á¡á²áá®ááŸá¬ááŸááá²á·áá¬ááœá±ááᯠááááááŒáá¡á±á¬áẠmagicInt áááºááá¯áž 16 ááŸáá·áº áááºááá¯ááºáá±á¬ ááá
á¹á
áááºááᯠáá»áœááºá¯ááºááá¯á· ááŒáá·áºááŸá¯ááẠ- áá»á¬ážá
áœá¬áá±á¬ á¡ááœááºáá°ážááŒá±á¬ááºážááŸá¯áá»á¬ážááŒá®ážáá±á¬áẠalgorithm ááᯠáá±á¬áºáá¯ááºááá¯ááºááá·áº áá¯ááºááᯠááŸá¬ááœá±á·áááºá
áá«á AES áá«á
á¡ááºáááá¯áá®ááẠáááºááŸáááŒá®áž áá»ááºá¡áá¬á¡á¬ážáá¯á¶ážááẠáááºážá ááá·áºáááºáá±á¬ááºáá»á¬ážááᯠááá°áááºááŒá áºáááº- áá¯ááºá áá±á¬á·ááŸáá·áº ááŒá áºááá¯ááºááŒá±ááŸááá±á¬ áááŠážáá¯ááºáá±á¬ááºááŸá¯ á¡á¬ážáááºážáá»áẠ(áááºážááááºááŸáááŸá¯ááẠAES á¡ááºáááá¯áá®áááºá áááºáááºááŸá¯áá¯ááºáá±á«áºááœáẠáá°áááºáááº)á áááºážááá¯á·ááŸáá·áºá¡áá° ááœá²á·á ááºážáááºáá±á¬ááºáá¯á¶á¡á¬áž áá¯ááºáá±á¬ááºáá»ááºáá±á«áºááá¯ááŸá¯áááá¯ááºáá®áá áºáá±áá¬á ááœá²á·á ááºážááááºááŒá áºáááºá sub_6115Cááá¯á·áá±á¬áº áá¯ááºá á€á¡ááá¯ááºážááẠá¡áá°ážá¡á¬ážááŒáá·áº ááŸá¯ááºááœá±ážáá±áá±á¬ááŒá±á¬áá·áº áá¯ááºááᯠáá¬áá±ážááẠá áááºáá°ážáá±á«áºáá¬ááŒá®áž áá¯ááºááŒáá·áº á á¬ááŸááºááŒááºáž áá¯ááºáá±á¬ááºááŸá¯á ááá·áºáááºáá»ááºá¡á¬ážáá¯á¶ážááᯠááá¯ááºáá áºáá¯áá²ááá¯á· á áœáá·áºáá áºááœá¬ážá á±ááẠááŒá áºáááºá
Patch
assembly language ááœáẠpatch code á¡á¬ážáá¯á¶ážááᯠááá¯ááºááá¯ááºááá±ážááá¯ááºá á±áááºá áááºááẠAndroid Studio ááá¯ááœáá·áºááá¯ááºááŒá®ážá áá»áœááºá¯ááºááá¯á·á decryption function áá²á·ááá¯á·áá°áá®áá±á¬ input parameters áá»á¬ážááá¯áááŸáááá·áº function ááá¯áá±ážááŒá®áž ááá¯ááºáá áºáá¯ááá¯á· á á¬áá±ážáá«á ááá¯á·áá±á¬áẠcompiler áá±ážááá·áºáá¯ááºááᯠáá±á¬áºáá®áá°ážááá·áºáá«á generate
UC Browser á¡ááœá²á·á០áá»áœááºá¯ááºááá¯á·ááá°áááºáá»ááºážáá»á¬ážááẠáá¯ááºááá·áºáá¬ááœáẠá¡áááºááŒá±á á±ááẠááá¯á áá¯ááºáá«áááºá áá¯ááºáá±á¬ááºáá»ááºáá áºáá¯á á®áá¡á ááœáẠá¡ááŒá¬ážáááºááá·áºá¡áá¬ááŸáá·áºáááᯠá¡ááœááºááá°á¡á á¬ážááá¯ážááá¯ááºáá±á¬ á¡ááŸáá¯ááºáá¯ááºááŸááááºááᯠááááááŒáá«á áá¯á·á á¡ááœááºá¡áááºááŒá± ð ááá¯á·áá±á¬áºá áá áºááŸááºáá¯ááºáá±á¬ááºáá»ááºáá¡á ááœáẠááá¯ááºáá áºáá¯ááá¯á· ááá·áºáááºáá±á¬ááºáá»á¬ážá¡á¬ážáá¯á¶ážááᯠááááºážáááºážááá·áº áá¯ááºá¡ááœáẠáá±áá¬á¡áá¯á¶á¡áá±á¬ááºáááŸááá«á á¡á²áá«ááᯠá¡ááá¯ááºážááá¯ááºážááœá²ááŒá®áž á¡áá®ážáá¬ážá áá¯ááºáá±á¬ááºáá»ááºááœá±ááá± á¡ááŸáá¯ááºáá¯á¶ážááœá±ááᯠáá¯á¶ážáá²á·ááááºá á á¯á á¯áá±á«ááºáž áá±ážááá¯ááºážááŸááá²á·áááºá
áááá¡ááá¯ááºáž
ARM áááá¯áá¬ááœááºá ááááá¯ááºáá±á¬ááºáá»áẠááá·áºáááºáá»ááºáá»á¬áž áá±ážáá¯ááᯠááŸááºáá¯á¶áááºáá¬ážáá±á¬ R0-R3 ááŸáááá·áº ááŒááºááœá¬ážáááºá áá»ááºáá±á¬á¡áá¬áá»á¬áž ááŸááá«á stack ááŸáááá·áº ááŒááºáááºážáá«áááºá LR ááŸááºáá¯á¶áááºááẠááŒááºáá¬ááá·áºááááºá
á¬ááᯠáááºáá±á¬ááºáááºá áááºážá parameters áá»á¬ážááᯠáá»áœááºá¯ááºááá¯á·á
áœáá·áºáá
áºááŒá®ážáá±á¬áẠfunction á¡áá¯ááºáá¯ááºááá¯ááºá
á±ááẠá€á¡áá¬á¡á¬ážáá¯á¶ážááᯠááááºážáááºážááẠááá¯á¡ááºáá«áááºá áá¯ááºáááºážá
ááºááœáẠáá»áœááºá¯ááºááá¯á·á¡áá¯á¶ážááŒá¯ááá·áº ááŸááºáá¯á¶áááºáá»á¬ážá¡á¬ážáá¯á¶ážááá¯áááºáž ááááºážáááºážááẠááá¯á¡ááºáá±á¬ááŒá±á¬áá·áº áá»áœááºá¯ááºááá¯á·ááẠPUSH.W {R0-R10,LR} ááᯠáá¯ááºáá±á¬ááºáá«áááºá R7 ááœáẠstack ááŸáááá·áº function ááá¯á·áá±ážááá¯á·áá±á¬ parameters áá»á¬ážá
á¬áááºážáááááºá
á¬ááá¯áááŸááááºá
function ááá¯á¡áá¯á¶ážááŒá¯ááŒááºážá fopen ááá¯ááºááá¯ááœáá·áºááŒáá·áºáá¡á±á¬áẠ/data/local/tmp/aes "ab" áá¯ááºááœááº
á¥ááá¬á¡á¬ážááŒáá·áºá R0 ááœáẠáá»áœááºá¯ááºááá¯á·ááẠR1 ááœáẠááá¯ááºá¡áááºáááááºá
á¬ááᯠáá¯ááºááá¯ááœáŸááºááŒááá·áº á
á¬ááŒá±á¬ááºážáááááºá
á¬ááŒá
áºáááºá ááŒá®ážáá±á¬á· áá®ááŸá¬ á¡ááŸáá¯ááºáá¯ááºá á¡áá¯á¶ážááá¯áá±á¬á· áá±á¬ááºáá¯ááºáá±á¬ááºáá»ááºááᯠáááºááœá¬ážáá«áááºá áááºážááá¯áááºáááºáá¯ááºáá±á¬ááºáááºá¡ááœááºá áá»áœááºá¯ááºááá¯á·ááẠáá¯ááºáá±á¬ááºáá»ááºá áá¯ááºá¡á
á
áºá¡ááŸááºááá¯á· áá°ážááŒá±á¬ááºážááŒááºážááᯠá¡á
ááá¯ááºážááœáẠáá¬ážáá²á·ááŒá®áž á¡ááŸáá¯ááºáá»á¬ážááᯠáá»á±á¬áºááŒááºáᬠá¡ááŸáá¯ááºá¡á
á¬áž patch áá¡áááºááᯠáá±á«ááºážááá·áºáá«áááºá
áá±á«áºááá¯ááŒááºážá fopen.
áá¯ááºáá±á¬ááºáá»ááºá ááá áá±á¬ááºáá¯á¶ážáᯠaes á¡áá»áá¯ážá¡á á¬ážááŸááááºá int. áá»áœááºá¯ááºááá¯á·ááẠááŸááºáá¯á¶áááºáá»á¬ážááᯠá¡á ááœáẠstack ááœááºááááºážáááºážáá¬ážáá±á¬ááŒá±á¬áá·áºá áá¯ááºáá±á¬ááºáá»ááºááá¯ááá¯ážááŸááºážá áœá¬ááŒááºáááºážááá¯ááºáááºá fwrite stack áá±á«áºááŸá áááºážááá¯á·áááááºá á¬áá»á¬ážá
ááá¯á·áá±á¬áẠáá»áœááºá¯ááºááá¯á·ááœáẠáá±áá¬á¡ááœááºá¡á
á¬ážááŸáá·áº áá±á¬á·á¡ááœáẠáá±áá¬ááᯠááœáŸááºááŒááá·áº ááááºážááááºážá á¡á
áŠážááŒá¯ááŒááºáž vector ááŸáá·áº áá¯ááºááŸááºáá¬ážáá±á¬ áá±áá¬áá»á¬ážáá«ááŸááá±á¬ ááœá²á·á
ááºážáá¯á¶áá¯á¶ážáá»áá¯ážááŸááááºá
á¡áá¯á¶ážááœááºá ááá¯ááºááá¯ááááºáá«á ááŸááºáá¯á¶áááºáá»ááºáá»á¬ážááá¯ááŒááºáááºááá°ááŒá®ážááááºážáá»á¯ááºááŸá¯á¡á
á
áºá¡ááŸááºááá¯á·ááœáŸá²ááŒá±á¬ááºážáá«á 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
áá»áœááºá¯ááºááá¯á·ááẠá á¯áá±ážááŒááºážá áááºááŸááºááá¯ážááŒááºážá áááºáááºááŒááºážá á áááºááŒááºážá áááºážáááºážááẠnull ááŒááºáá±ážáá±á¬ááŒá±á¬áá·áº áá»áœááºá¯ááºááá¯á·ááẠNullPointerException ááᯠáááºáá¶áááŸááá«áááºá
áá¯ááºááá±á¬ááºáááºááœá²ááŒááºážá áááºááŒá¬ááŸá¯á¡ááœááºážá âMETA-INF/â ááŸáá·áº â.RSAâ ááá¯á·ááẠá áááºáááºá á¬ážááœááºáá»ááºážááŒá±á¬ááºážáá»á¬ážááᯠáá¯á¶áá±á¬áºáá±ážááá·áº áá¯ááºáá±á¬ááºáá»ááºáá áºáá¯ááᯠááœá±á·ááŸááá²á·áááºá á¡ááá®áá±ážááŸááºážááẠáááºážááááºááŸááºááᯠá¡áááºááŒá¯áá±áá¯á¶ááááºá ááá¯á·ááá¯áẠáááºážááŸáá±á¬á·áá»á¬ážááá¯ááẠáá¯ááºáá±ážáááºá áááºááŸááºáá²á· ááŒá áºáá»ááºáá±áá¬ááœá±ááᯠáá«ááááºáááá¯ááºááœááºáá»ááºáá°ážá áá«ááŒá±á¬áá·áº ááŸááºáááºáá²á· áááºááŸááºááᯠááœáŸá²ááá¯ááºáááºá áá»áœááºá¯ááºááá¯á·ááẠâMETA-INF/â á¡á á¬áž âBLABLINF/â ááá¯áááŸáá á±áááºá¡ááœáẠáá¯ááºááŸááºáá¬ážáá±á¬á á¬ááŒá±á¬ááºážááᯠáá¬áá±ážááŒáá«á áá¯á·á APK ááœáẠááá¯á¡áááºááŒáá·áº ááá¯ááºááœá²áá áºáá¯ááᯠáááºáá®ážááŒá®áž ááŸáá·áºááá±á¬ááºáá¬áááºááŸááºááᯠááá¯áá±áá¬ááœáẠááá·áºáá«á
áá»áœááºá¯ááºááá¯á·ááẠá á¯áá±ážááŒááºážá áááºááŸááºááá¯ážááŒááºážá áááºáááºááŒááºážá á áááºááŒááºážá áááºááᯠáá«ááá¯á·ááŸá¬áá±á¬á·ááŸááááºá
MitM
áá±á¬á·áá áºáá¯ááŸáá·áº áá±á¬á·ááŸáá·áºáá®áá±á¬ á¡á ááŒá¯ááŒááºáž vector áá áºáá¯ááᯠáá»áœááºá¯ááºááá¯á· áááºáá¶áááŸááá²á·áá«áááºá áá¬áá¬áá¯á¶á·ááŒááºááŸá¯ááᯠCBC áá¯ááºááœáẠá á¬ááŸááºááẠááŒáá¯ážá á¬ážááŒáá«á áá¯á·á
MD5á âextract_unzipsizeâ ááŸáá·áº áá¶áá«ááºáá
áºáá¯ááŸáá·áº áááºáá°ááá·áº áá±á¬áºááœááºážááẠURL ááᯠáá»áœááºá¯ááºááá¯á· ááœá±á·áááºá áá»áœááºá¯ááºááá¯á·á
á
áºáá±ážáááº- áá±á¬áºááœááºážááá¯ááºá MD5 ááẠáá°áá®áááºá áá¯ááºááá¯ážáá¬ážáá±á¬ á
á¬ááŒáá·áºááá¯ááºá á¡ááœááºá¡á
á¬ážááẠá¡áá°áá°áááºááŒá
áºáá«áááºá áá»áœááºá¯ááºááá¯á·ááẠá€á
á¬ááŒáá·áºááá¯ááºááᯠáá¬áá±ážááẠááŒáá¯ážá
á¬ážáá±ááŒá®áž áááºážááᯠááá±á¬ááºáá¬ááá¯á· áá±ážáá±á¬ááºááẠááŒáá¯ážá
á¬ážáá±áá«áááºá áá»áœááºá¯ááºááá¯á·á áá¬áá±ážáá¬ážááá·áº áá
áºáá»á
áºááá¯ááºááᯠáá±á«ááºážáá¯ááºáá¯ááºááŒá±á¬ááºážááŒááááºá¡ááœáẠâPWNED!â á
á¬áá¬ážááŒáá·áº SMS áááºáá®ážááẠáááºááœááºáá»ááºáá
áºáá¯ááᯠáá»áœááºá¯ááºááá¯á· á
áááºááá¯ááºáá«áááºá áá»áœááºá¯ááºááá¯á·ááẠáá¬áá¬á០áá¯á¶á·ááŒááºááŸá¯ááŸá
áºáá¯ááᯠá¡á
á¬ážááá¯ážáá«áááº-
ááá±á¬ááºáá¬ááẠááŸááºáááºážáá±á¬ááºážááᯠá¡ááŒáááºáá±á«ááºážáá»á¬ážá
áœá¬ áá±á«ááºážáá¯ááºáá¯ááºááẠááŒáá¯ážá
á¬ážááŒá®ážáá±á¬áẠáááºážááẠá¡ááŸá¬ážá¡ááœááºážáá
áºáᯠááŒá
áºá
á±áááºá áá
áºáá¯áá¯ááŒá
áºáá¯á¶ááááºá
áá°áááŒáá¯ááºáá°ážá á€ááŸá±ážááŸáááºáá±á¬áá±á¬áºáááºááᯠááœá²ááŒááºážá
áááºááŒá¬ááŒááºážááŒáá·áº áá¬áá¬ááẠááŸááºáááºážáá¡ááœááºá¡á
á¬ážááá¯áááºáž áá¯ááºááœáŸáá·áºáá±ážááŒá±á¬ááºáž ááœá±á·ááŸáááá«áááºá
áááºážááᯠLEB128 ááœáẠáá¯ááºáá¯ááºáá¬ážáááºá áá¬áá±ážááŒá®ážáá±á¬ááºá á
á¬ááŒáá·áºááá¯ááºááŸá áá±á¬áºááœááºážááá¯ááºá á¡ááœááºá¡á
á¬ážááẠá¡áááºážáááºááŒá±á¬ááºážáá²ááœá¬ážáá±á¬ááŒá±á¬áá·áº ááá±á¬ááºáá¬á០áá±á¬áºááœááºážááá¯ááºááᯠááááºáá±á¬ááºáᬠáá±á«ááºážáá¯ááºááœá²áááºáᯠáá°ááᬠá¡ááŒáááºááŒáááºááŒáá¯ážá
á¬ážááŒá®ážáá±á¬ááºááœáẠá¡ááŸá¬ážá¡ááœááºážááŒá
áºááœá¬ážáááºá
áá»áœááºá¯ááºááá¯á·ááẠáá±á¬áºááœááºážááá¯ááºá á¡ááœááºá¡á á¬ážááᯠáá»áááºááŸááá±ážáááº... ááŸáá·áº - á¡á±á¬ááºááœá²! ð ááááºá áá®áá®ááá¯áá²ááŸá¬áá«á
á¡áá»áá¯ážáááºáá»á¬ážááŸáá·áº developer áá¯á¶á·ááŒááºááŸá¯
á¡áá¬ážáá°áááºá áááºáá¬áá»á¬ážááẠá¡áá¹ááá¬ááºááŸááá±á¬á á¬ááŒáá·áºááá¯ááºáá»á¬ážááᯠááŒáá·áºáá±áááºááŸáá·áº áá¯ááºáá±á¬ááºááẠUC Browser á ááá¯á¶ááŒá¯á¶áá±á¬á¡ááºá¹áá«áááºááᯠá¡áá¯á¶ážááŒá¯ááá¯ááºáááºá á€á á¬ááŒáá·áºááá¯ááºáá»á¬ážááẠááá±á¬ááºáá¬áá¡ááŒá±á¡áá±ááœáẠá¡áá¯ááºáá¯ááºáááºááŒá áºáá±á¬ááŒá±á¬áá·áº áááºážááá¯á·ááẠáááºážáá áá áºááœáá·áºááŒá¯áá»ááºá¡á¬ážáá¯á¶ážááᯠáááºáá¶áááŸááááºááŒá áºáááºá ááááºá¡áá±ááŒáá·áº phishing windows áá»á¬ážááá¯ááŒáááá¯ááºááá·áºá¡ááŒáẠáá±áá¬áá±á·á áºááœááºááááºážáááºážáá¬ážááá·áº áá±á¬á·ááºá¡ááºáá»á¬ážá á áá¬ážááŸááºáá»á¬ážááŸáá·áº ááœááºáá®ážáá»á¬ážá¡áá«á¡ááẠáááá¹áá±á¬áºáá±á¬ááºááá¯ááºááŸáá·áºáá¡áá¯ááºáá¯ááºáá±á¬ááá¯ááºáá»á¬ážááᯠáááºáá±á¬ááºááŒáá·áºááŸá¯ááá¯ááºáááºááŒá áºáááºá
áá»áœááºá¯ááºááá¯á·ááẠUC Browser á developer áá»á¬ážá¡á¬áž áááºááœááºááŒá®áž áá»áœááºá¯ááºááá¯á·ááœá±á·ááŸáááá·áºááŒá¿áá¬ááᯠá¡áááá±ážáᬠá¡á¬ážáááºážáá»ááºááŸáá·áº áááºážáá¡áá¹ááá¬ááºááᯠáá±á¬ááºááŒááẠááŒáá¯ážá
á¬ážáá²á·áá±á¬áºáááºáž áááºážááá¯á·ááẠáá»áœááºá¯ááºááá¯á·ááŸáá·áº áá¬ááŸáááœá±ážááœá±ážáá²á·áá«á á€á¡áá±á¬á¡ááœááºážá ááá±á¬ááºáá¬ááẠáááºážáá¡áá¹ááá¬ááºááŸááá±á¬á¡ááºá¹áá«áááºááᯠááá¯ážááŸááºážá
áœá¬ááŒááºáá±á¬ááºáá±áá²á·áááºá áá«áá±ááá·áº á¡á¬ážáááºážáá»ááºá¡áá±ážá
áááºááœá±ááᯠáá¯ááºáá±á¬áºááá¯ááºáá²á·á¡áá« á¡áááºáááᯠáá»á
áºáá»á°ááŸá¯ááá¯á· áááŒá
áºááá¯ááºáá±á¬á·áá«áá°ážá ááẠáá áááº
HTTPS ááŸáá
áºááá·áº áá¬áá¬ááá¯á· áááºáá±á¬ááºááá·áº UC Browser 12.10.9.1193 áá¬ážááŸááºážá¡áá
áºááᯠáá¯ááºáá±ááá¯ááºáá«áááºá
ááá¯á·á¡ááŒááºá "ááŒááºáááºááŒááºáž" ááŒá®ážáá±á¬ááºááŸáá·áº á€áá±á¬ááºážáá«ážááá¯áá±ážáá¬ážáá»áááºá¡ááá ááá±á¬ááºáá¬áá
áºáá¯ááœáẠPDF áá
áºáá¯ááá¯ááœáá·áºáááºááŒáá¯ážá
á¬ážááŒááºážááẠ"á¡á°ážá áá
áºáá¯áá¯ááŸá¬ážááœááºážááœá¬ážáááº!" PDF ááá¯ááœáá·áºáááºááŒáá¯ážá
á¬ážá
áẠáá¬áá¬áᶠáá±á¬ááºážááá¯ááŸá¯áá
áºáᯠáááŒá¯áá¯ááºáá²á·áá±á¬áºáááºáž Google Play á
ááºážáá»ááºážáá»á¬ážááᯠáá»áá¯ážáá±á¬ááºáᬠáááºáááºááá¯ááºáá±á¬áá¯ááºááᯠáááºáááºáá±á«ááºážáá¯ááºáá¯ááºááá¯ááºá
áœááºážááᯠá¡ááááºá¡ááŒáœááºáá±ážááá·áº ááá±á¬ááºáá¬ááᯠá
áááºáá±á¬á¡áá«ááœáẠáá±á¬ááºážááá¯ááŸá¯áá
áºáᯠááŒá¯áá¯ááºáá²á·áá«áááºá
source: www.habr.com