ááá˘áŤ
á ááá˘áľ áá¨á¨áť áĽá
á¨á°áá°á áá á ááľ áŠá˛ áĽáŽááá ááľáłáá፠á°ááᎠá áŁá áááá á áá ááአá°á°áŤááˇáᥠááááá á áá áá á á°á áááá˝ ááłáŞáŤáá˝ áá á°áááᣠá¨á°ááŤáŠ áľá¨-áážá˝ á áŞá˛áŽ áááá˝ á°á°áŤááˇá (áááľáᣠá°á áááá˝ áĽáŤáá¨áą áá á áĽáá áŤáľáĄ áá á áááłá á¨áá˛áĽ áŞá˛áŽáŁ áá á ááľáŠ á¨áá
á áłá˝ áá á ááľ á¤áᏠá°ááĽáá)ᣠá áłáš ááá áŤááá áľáŁ ááĽááľ á¨á°ááá áĽá áá°á áááŽá˝á á¨áŤá á áľá᪠áŁááŽá˝á á°á á
ááᢠá VK áá áŁáá áŚáá´áá á¨áŠá˛ á áłá˝ áĄáľá ááľáĽ á áá˘
áá
á˝áá á ááťáá áľ ááᣠáŠá˛ á áłá˝ á ááá ááá áá á¨500 á áá áááśá˝ á ááľá˘ áá
á áľá°áá áá - ááá ááŽá áĽáť áĽá á ááᢠá¨ááááááš ááŤá¨á áľáááľáłáá፠áĽá á ááá ááá áá áá° á ááłááľ á áááŹá˝áá˝ ááááá áĽá á
áŹáłáá˝á áá¨áľ áá˝ááᢠááĽááłá˝á ááááŤáą áá
áá áᥠáŠá˛ áĽáŽááá ááĽá ááá áĽá¨á°áŤ áááá ááá¨áľ áá°ááᢠáĽá áĽáą áĽáá°ááŤá°áá á°ááá !
á áá°áá áŞáŤá áŽáľ ááľáĽ ᣠá¨áá°áá á áŽáľ á¨ááá¨áľ áĽá á¨áááľ á˝ááł á°áááˇá áŁ
á¨áá á áłá˝ á¨á°ááá ááá ááá á áĽááą áá áľ á ááá ááá áá ááá á¨á á¨UC áĽáŽááá áľáŞáľ á áá ááá˘
package: com.UCMobile.intl
versionName: 12.10.8.1172
versionCode: 10598
sha1 APK-ŃаКНа: f5edb2243413c777172f6362876041eb0c3a928c
á¨áĽááľ áŹáá°á
á áŠá˛ áĽáŽááá áááááľ ááľáĽ á áŤáľ ááá áľá áŤáá á áááááľ ááááľ áá˝ááᢠcom.uc.deployment.UpgradeDeploy Service.
<service android_exported="false" android_name="com.uc.deployment.UpgradeDeployService" android_process=":deploy" />
áá
á áááááľ á˛ááá á áłáš á¨POST áĽáŤá áŤáááŁá
áľááá á ááľ á°á áá áá˛á¤á á ááĽáł á á áłáš ááľáĽ ááááľ á˛ááá á¨áá¨á°ááľ áĽáŤááá˝ á áľáŤáá ááľáĽ ááłáŠ áá˝ááá˘
á ááááŞáŤ á¨POST áĽáŤá á áá˘
áá˛á¤á áĽá á¨á˘áŽ á
áá¸áśá˝á ááá¨áľ á¤á°-áá˝áááľ áŤáá áááἠááááłáᢠá¨ááááŞáŤá áĽáŤá áľá áľáááą áá¨á áĽáá°ááŤáľá°ááá ááááľ ááááŤáłá áá (á˘áŤááľ á ááá´áá¸á á áľááááá á¤á°-áá˝áááľ ááá
á¨áĽ) áĽá ááĽáą ááá˝ á áłáš ááá¨áľ áľáááŤáľáááá á¤á°-áá˝áááľ á¨á°áá°á áá¨á ááá áá-á áľáŤáťáá áĽá ááááŁáľá ᣠáá áááᢠá˝áአáá
áĽáŤá á¨á°áá°á ᨠááá ááá˘
áááĽáŤá áá áá
áááĽáŤá áááľ
á¤á° ááá ááą áŤáą á áá ááľáĽ á¨áłá¸á áá áĽá á áá°áá°á á¨áá˘
á¨áľáŤáá á˛ááŞááľ áŽáľ áááá
á¨á ááááŠá ááá˝ ááááłáľ áĽááááᢠá¨ááá áŽáľá áĽáá com.uc.deployment.UpgradeDeploy Serviceá¨áá´ á StartCommand áá áááľ com.uc.áá°ááŤáľ.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 áá áĽáŠá á¨ááᣠá¨áśáľáľ ááá á¨áá˝á á ááŤáŽá˝ á ááąá áŤááááłáá˘
áŽáąá áá°áá°á áĽáááĽááá. á¨á ááľ áááľ ááá á áá áĽáŤáłá˝áá ááá áľá áŁáá áá´ ááľáĽ áĽááááá á˛ááŞááľ áŁátesByKey.
áĽáá áááľ á°á¨á᪠áŁááśá˝ á¨áááťá˝á á°ááŤáá°áá, áĽá á¨áĽááą á ááľ ááĽá¨ááá á°áááˇá. á áá ááááľ áááĽááąá á˛ááŞááľ áááľá¨á ááá áĽáá°á°áá¨á ááá˝ áá.
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.Cipher. áĽá áá
áá ááĽá 10601 ááłáá á¨á°áá°á áŤáá°á á°áááá - áá
á ááá˝ á¨áľáĽáá ááĽá ááá˘
á¨áááĽáá á¨á˝ááá á°áá°ááľ á áá á áááá˝á á¨áá°áá á ááá áĽááááá IRouterComponent áĽá áá´ áľáĽáá:
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.áś (á áĽáááą .jar áá áĽá á ááłááľ á¨ááľá ፠áá á¨á°ááá á áááážá˝ áá°áá áá áŤáááá áľ) á ááľ á¤á°á á¤á°-áá˝áááľ á ááĄ- libsgmainso-6.4.36.áś. á IDA ááľáĽ áĽáá¨áá°ááá áĽá áľá á°áśá˝ áŤáá¸á áĽá á¨áááá áłáĽáá˝á áĽáááááᢠá˝áአá¨ááá áŤáľá á áá á¨áĽ áá áŤááá ááᢠáá á¨áá°á¨áá áľááłááá ááááłá°áĽ áá á°áĽá ááá˘
áá á áŤáľáááá: á¨á¤áá¤á ááá á áľááá áááŤá áĽá ááá°áá°á, á¨ááŽááŤá áŤáľá á°áá á¨áĽ á á áá. áľááá
, á ááá á¨á´áá˝á á áá á¨áĽá áĽáá°áááá, á áááą ááľáĽ áŤááľá á°ááá
ááľáŽá˝ áᎠáĽáá°áááá.
áááá á IDA ááľáĽ áĽáá°áá ááááąá˘
áá፠á¨áášáá áá˝á á áľááá á á¤á°-áá˝áááľ ááľáĽ á á፠áŽáľ á¤á°á á°áĽá á¨á°ááá¸á áá´ á¨áľ áĽáá°ááá ááááá áááľ ááááśá˝ á áᢠá¨ááááŞáŤá á¨áá፠áľá ááľá áľ áá á¨ááŤ_áĽá á_áľá_á¨ááá áľá_áá´ áľá.
ááá°áá á¤á° ááá
ááąá á˛áá ááááἠáá (á á°ááŁá ááľáĽ JNI_á°ááá)
á¨á°ááŁá áĽáŞá á áá áá á¨á°áááᥠá°áááá˝.
á áĽá áááł, á¨ááááŞáŤáá áá´ á¨á°á ááá, áľá áĽáá°áá ááá á áá áľ. ááŤ_áŽá_áłáŚáŁáŚ_áááľ_á ááŁ_á°á áááľ_á áľáá_ááá˛ááĽáŤáŞ_á¨áľáĽáá á°ááá .
áá° áá á¨á°áአá°ááŁáŤáľ ááŤá¨á áĽáá°áá
áŤá á°ááŁá á¨áá, áá
áááľ áĽáŞ áááá áŤáľáááááłá áááľ áá á¨á°áááᥠá°áááá˝.
áá° á°ááŁáŠ áĽáááľ JNI_á°ááá áĽá áá
áá ááľá áĽááŤáá-
áĽáá
áá áĽá¨áá áá? á ááááŞáŤ áĽááł, á¨á°ááŁáŠ ááááŞáŤ áĽá áá¨á¨áť á ARM áľá-á
áááá˝ á¨á°áááą áá¸á. á áá°áá°áŞáŤá áá áŤáá á¨ááááŞáŤá áááŞáŤ á°ááŁáŠ á áá áŤá áľ áá (á áá
ááłá áá R0, R1 áĽá R2) á¨áá áááá á¨ááááá˘áŤáá áááśá˝ áŤá¨ááťá, áĽáá˛áá ᨠLR ááááá˘áŤ áááśá˝, á¨á°ááŁáŠ á¨ááááť á áľáŤáťá áááá. . á¨áá¨á¨áťá áááŞáŤ á¨á°ááᥠááááŚá˝á áá°áá á¨á áľ ááááłá, áĽá á¨ááááť á áľáŤáťá áá˛áŤáá á áᲠááááá˘áŤ ááľáĽ ááááŁá - áľááá
á¨á°ááŁáŠ ááááłá. ááá áá á á
áá áľ á¨á°ááá¨áąáŁ ááŁáŞá áááŞáŤá ááá áá á¨á°ááá áá á¨ááááť á áľáŤáť áĽáá°áááá áŤáľá°áááᢠá¨á፠á áá áá áĽáá°ááá áĽáá°ááá
áŽáľ á áááá ᢠá¨á°áá°á á áľáŤáť 1xB0 áá° R130 á°ááá, 5 á¨áĽáą ááááłá, á¨ááŤá áá° R0 áĽá 0x10 áá¨ááá áłá. 0xB13B áááŁá. áľááá
, IDA á¨áá¨á¨áťá áááŞáŤ áá°á á á°ááŁá ááááť áá áĽá áŤáľáŁá, ááá áá á áĽáááą áá° áľááľ á áľáŤáť 0xB13B áááłá.
áĽáá áá ᨠARM ááŽá°á°áŽá˝ áááľ áááłáá˝ áĽá áááľ áááŞáŤáá˝ áĽááłáá¸á ááľáłááľ á áá áá: ARM áĽá Thumb. á¨á áľáŤáťá áľááš ááá á˘áľ á¨áľáá áááŞáŤ áľáĽáľáĽ áĽá á áá áĽáá°ááá áá áááŁáŁáŞá áááá¨ááᢠáŤá áááľ á áľáŤáťá á áľááá 0xB13A áá, áĽá á áľááš ááá á áá ááአá áṠᨠThumb áááłá áŤááááłá.
á áá
á¤á°-áá˝áááľ ááľáĽ áĽá á áĽáŤááłááą á°ááŁá ááááŞáŤ áá á°ááłáłá âá áľááâ á°á¨ááŻáá˘
á¨ááťáť áŽáľ. á áĽááą áá á áááá á ááááĽá - áĽááľáłááłáá
á¨ááá á°ááŁáŤáľ áĽááá°á á
áá áľáá˝ áŠá
áĽáá°ááá˘
áŽáą áá° 0xB13A á ááá˝ áľáááááᣠ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á áĽáááá¨áľáĄ-
áĽá á áĽááṠᣠáĽáá
á ááľ dword á LR ááľáĽ áŁáá á áľáŤáť á°ááľáˇá ᣠáá°áá
á áľáŤáť á°á¨ááŻá ᣠá¨á፠á áá á áá¤áą á áľáŤáť áá áŤáá áĽá´áľ á°ááľáś ááá áá áá°á¨ááᢠáĽáá˛ááᣠ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.áś á¨áŠá˛ á áłá˝ áĽá á¨á°ááŁá áŽáľ á°ááĽáá JNI_á°ááá.
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 á¨ááá áľá á ááá˝ áĽá¨á°ááł ááᢠá¨áá á°ááŁá áááŞáŤáá˝ áĽáá°áááᣠá¨á°áá°á ᨠááἠáá á°ááłáłá á¨áá á¨ááἠá ááᣠá¨á°áá°á ááľ áĽá ááĽá á°áááááᢠááá áá ᣠá°ááŁáŠá á¨á ፠á áá ᣠáá° á°ááŁáŠ áľááá°ááá á ááľ ááľáĽ á˛ááŞááľ á¨á°á°á¨á ááľáá áááŤá ᢠááá á áá, áá á á¨áááá áľá áĽáá° ááá°á áááŞáŤ á áľáá áááľáłá. áľááá , ááĽáŠ á¨áá áŁá ááŤá áá á ááá á¨ááľáአááááľ áá. á¨áááá áľá ááááłáľ áĽáááá, á áľááááá á á áŁáŤ áĽá¨ááľá áĽáá°áá áááá¨á áááŁá. ááľáĽ á¨ááááá á áááá áĽáááá¨áľ áááľ_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;
}
áĽáŤ áááľ_7AF78 áá°á áá°á áá á áŁááľ áľááľá ááŤáŁ ááłá áááĽáŤá (á áĽááá ááŤáŁáá˝ áá á áááá á ááááĽá)ᢠáĽáá áááľ áĽáá°áá áŤá ááŤáŁáá˝ á°ááĽá¨áá: á áá°áá ááľáá ááá "DcO/lcK+h?m3c*q@" (áá ááá áĽáá°áá áááááľ ááá áá), áááá á¨á°áá°á ᨠááἠááá. á ááá á, áááąá áĽááá˝ á á°áá°á ááá á ááľáĽ ááááŁá, áĽáąá áá° á°ááŁáŠ áá°áááá áááľ_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/áááľ á ááŁ/á°á áááľ/á áľáá/JNICLIbrary. á áŁá áĽáŠ! á áľááááá ááááľ áá ááá˘
á¨áľáĽáá áá
á áá áá°á áááá á ááĽá á¨á°áááᥠá°áááá˝, áá á áá° á°ááŁáŠ áá áááá doCommandNative. ᨠá¨á°á áŠáľá á°ááŁáŤáľ áĽáááá¨áľ JNI_á°áááᣠáĽá ááľáĽ áĽáááááá áááľ_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_á°ááá.
áśáľáľ ááĽáŽá˝ á áá ááľáĽ áŤááá ááááľ áŤááááłá. áĽáŤááłááą á¨áá á
á á á°ááłá á°ááŁáŠá á¨á°ááł á áľáŤáť áááá. ááá á ááá
ááľááá ááááľ ááľáĽ áá. áĽá
á áá á¨áááľá áááá ááá
áŽá˝ á¨á°á¨áą á¨ááŤáľááááá á°ááŁá áá° áá áá á¨áá¨ááá áľá áŽáľ ááľáĽ áŚáł ááááľ á áľá¸á᪠á áá°áá (áá°á á˛á áľáá
á˝ááá áááá áłá¨áľ á ááááťá¸áá).
á°á¨á᪠áá°á á
áľáŤááá á˛ááŞááľ ááľá¨á áŤáá áľ á¨á°ááŁá á áľáŤáť á°ááĽáááᥠ0x5F1ACᢠáá ááá°á°áľ á áŁá áá áá á¨áŠá˛ á áłá˝ ááá˘áá˝ áá á áľááŤá ááá á ááá á°ááááá˘
á á፠áŽáľ ááľáĽ á¨á°á°áŤá áľááľá áááŞáŤáá˝á á¨á°áá áá á áá áĽááááá
áá° á°ááŁá á á áľáŤáť 0x4D070. áĽá áĽáá
áá á áááľ áŽáľ áá°á á
áá áĽááá.
á R7 áĽá R4 ááľáĽ áááľ á˘áá´ááśá˝á áĽááľáááŁáá-
á¨ááááŞáŤáá áá¨á á áá áá° R11 áĽááááŤáááĄ-
á¨á á¨á´á áá á áľáŤáť áááááľáŁ á˘áá´ááľ áá áááĄ-
áá° ááááŞáŤá á áľáŤáť á¨ááą á áá, ááá°áá á˘áá´ááľ áĽá
á áá áááá, áĽáąá á R4 ááľáĽ. á á°áá á¨áĄ ááľáĽ 230 ááĽá¨ áááŽá˝ á á.
áľá áĽáą áá ááľá¨á á áá áľ? áá ááĽáŞáŤ / ááĽá፠áááá á IDA áááá áá˝ááᥠá ááľá -> áá -> á¨ááá¨áŞáŤ ááἠáááášá˘
á¨á°ááá áŽáľ á áŁá á áľá᪠áá. ááá ááᣠá áŤáŤá ááľáĽ ááááłá˝ááᣠááĽá ááľáááá áááááá á°ááŁá áĽáŞá ááľá°áá áá˝ááᢠáááľ_6115C:
á áááł 3 ᨠRC4 áľáá° ááá á áá áá á˛ááŞááľ á¨á°á°á¨áá áľ ááĽáŞáŤ / ááĽá፠áá áᢠáĽáá á áá
áááł, áá° á°ááŁáŠ á¨á°áááá ááá
á á¨á°á°ááááľ áááŞáŤáá˝ á°áááˇá doCommandNative. áĽá፠á¨áá á¨áá ááá áĽááľáłááľ magicInt á¨ááá áá 16. á°ááłá ááłáá áĽáááá¨áłáá - áĽá á¨á ááŤáł á˝áááŽá˝ á áá á áááŞáá ááłáá
á¨áá˝áá áľá áŽáľ áĽááááá.
áá
AES áá!
á áááŞáá á á ᣠá¨áá¨á áá á¨áĽáąá áááááá˝ ááááľ áá-áá᳠ᣠááá áĽá ááááŁáľá ᣠá¨áááť áŹáá°á (á¨áĽáą ááááľ á AES áľáá°ááá á á áŤá áá á¨á°áá á¨á° áá)ᢠá¨ááą áá áŤáá ááá á á¨á°ááŁáŠ áĽáŞ á ááľ á¨áá áŚáł ááá á á áá áľ áááľ_6115C, ááá áá áá á¨áŽáą ááá á á°áá á á°áἠá¨á°á°á á áá, áľááá ááá á¨á˛ááŞááľ á°ááŁá áááŞáŤáá˝ áá° ááá ááľáĽ áĽáá˛áŁá áŽáąá ááá á áá ááłáĄ áááłá.
á áá
áááá ᨠpatch áŽáľ á áááŁá á፠ááá á áĽá ááááá á ááľáŽááľ áľáąá˛áŽá ááľááá ᣠáĽááŤá áĽáá° áĽá á˛ááŞááľ á¨ááľá¨á á°ááŁá á°ááłáłá á¨áá¤áľ áááŞáŤáá˝á á¨ááá á á°ááŁá ááá áĽá áá° ááá ááá ᣠá¨á፠áŽááá°áŠ á¨áááááá áŽáľ ááľá°á áááĽá ᢠáááá¨áľ.
á¨áŠá˛ áĽáŽááá áĄáľá áá°ááťá˝á áŽáľ á¨áá¨ááá áážáľ ááá¨áŁá¨áĄ áá áᢠá áĽáŤááłááą á°ááŁá ááááŞáŤ áá á ááá á áá á ááááá áá°áŤáľ á¨áá˝á á¨ááťáť áŽáľ áĽááłáá áĽááľáłááľá˘ á áŁá ááš đ ááá áĽáá á áááá á°ááŁá ááááŞáŤ áá áááá áááŞáŤáá˝ áá° ááá á¨ááŤáľááἠáŽáľ á á áŚáł á¨áá. áá° áááá˝ áá¨ááá áĽá á¨á ááŤáŁá˝ á°ááŁáŤáľ á¨ááťáť ááŁáŤáá˝á áá áá áá á¨áĽá. á á á ááá á áŤáľ áááá˝ áá áŠ.
á¨ááááŞáŤá ááá:
á ARM á ááá´áá¸á ááľáĽ á¨ááááŞáŤááš á áŤáľ á¨á°ááŁá áááŞáŤáá˝ á ááááá˘áŤ R0-R3 á áŠá áŤááá, á¨á°ááŠáľ, áŤá, á ááá ááľáĽ áááá. á¨LR áááἠá¨ááááť á áľáŤáťáá ááááᢠáá¤áśášá á¨áŁáá á áá á°ááŁáŠ áĽáá˛á ፠áá
áá áááἠá áá áľá˘ áĽáá˛áá á áá°áą ááľáĽ á¨ááá ááá¸áá áááá ááááŚá˝ ááľááἠá ááĽá, áľááá
PUSH.W {R0-R10,LR}á áĽáá°áááá. á R7 ááľáĽ á ááá˝áľ á áŠá áá° á°ááŁáŠ á¨áá°ááááľá á¨áááŞáŤáá˝ áááá á áľáŤáť áĽááááá.
á°ááŁáŠá á áá áá ááá áááá áĽáá¨áá°á /data/local/tmp/aes á "ab" áááł
áááľá ááá°ááᢠá R0 ááľáĽ á¨ááá áľá á áľáŤáťá áĽáááááá, á R1 ááľáĽ - áááłáá á¨ááŤááááľ á¨ááľáá á áľáŤáť. áĽá áĽáá
á¨ááťáť áŽáľ áŤá áá, áľááá
áá° ááŁáŠ á°ááŁá áĽáááĽááá. ááľáŤáąá áĽáá˛ááĽá ááááŞáŤ áá áá° á°ááŁáŠ áĽááá°á áŽáľ á˝áááá áĽááľáááŁáá, ááťáťáá á ááá, áĽá á¨ááťáťá ááá
á¨áááľá°á ááŁáááľ áĽáá¨ááŤáá.
á áá°áá áá ááá.
á¨á°ááŁáŠ á¨ááááŞáŤááš áśáľáľ áááŞáŤáá˝ aes ááááľ á áá¸á int. ááááŞáŤ áá ááááŚášá áá° ááá áľááľáááĽá, á°ááŁáŠá á ááá ááá áĽáá˝ááá áťá ááá áá áŤáá¸áá á áľáŤáťáá˝.
á ááá áá á¨áá¨ááá áá á áĽá ááááᣠááľáááŞáŤ áŹáá°á áĽá á˘áááŞááľáľ áłáł áá¨á á áá á¨áŤá áśáľáľ á ááááŽá˝ á ááá˘
á áá¨á¨áťá áá áááá ááá, ááááŚášá áá°áá áŠá áľ ááááą áĽá áááŁá áŞáŤáá áá° áĽááá°áá á°ááŁá áŤáľá°ááá aes.
á ááľ á¤áᏠá¨á°áŁá á á¤á°-áá˝áááľ áá áĽáá°á áľáŁááᣠáĽáááááááᣠáá° ááłáŞáŤá/ emulator áĽáá°á ááá áĽá áĽááľááááááᢠá¨áĽá á¨ááťáť ááŁáŤ áĽá¨á°áá ᨠáááá áĽááŤáá, áĽá áĽá áá¨ááá˝ áĽá፠áĽá¨á°áťá áá. á áłáš ááľá áŤá á¨áá ááá ááľáŤáá áĽáť á áá°ááᣠáĽá ááá ááľá ፠á áĽáŤá ááľáĽ áŁáá á°ááŁá ááľáĽ áŤáááᢠáá á áá ááááŤáľ á áľáááá áá¨á áĽá፠á¨áá, áĽá á áľáááá áĽáŤá á áľáŤáá ááľáĽ á ááłáá. á áľááááá áĽáŤá ááá á¨áĽ áŠá˛ áĽáŽááá áĽáľáŞáŤáľá°áŤáá áĽááłáá áĽá áŁá¨áá áá°á á¨á°áá áá á áááá á¨á°áá°á á¨áá ááá˝ áĽááá°áľ áĽá á áááŹá˝áá áĽáá°áá áĽáááĽááᥠáááá áĽáá áľáá´ áá á áá á˛ááŞááľ áĽáá¨ááá˘
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/" áĽá ".RSA" á¨áááł á°ááŁá á°ááᢠá áááŹá˝á á¨áĽáá á áá¨áááŤáá á¨ááŤá¨ááἠáááľááᢠááá á°áá á¨áĽáą áááá˝á áŤáááŤá. á áĽáá á áá¨áááŤá áá áá áĽá¨á°á¨á°á° áĽááłá á áľááá áááá á ááááá, áľááá áľáááááá á¨ááľáá áá¨ááľ áĽáť áĽááá¸áŤáľáłáá. á˘áááŞááľ á¨á°á°á¨ááá ááľáá á "META-INF/" áááł "BLABLINF/" áĽááľáááᣠá á¤áᏠááľáĽ áŤáá áľá á¨áŤá á áá áĽááá á áĽá á¨áľáŠááá á áłá˝ á°áá°ááŹáľá áĽá፠áĽáá¨ááá˘
áĽáá°á áľáŁáá ᣠáĽáááááá ᣠáĽááááá ᣠáĽááááŤáá ᢠá˘áá! ááá á áá!
ááľá¤á
á¨ááá áá áĽáŠá á¨áá ááá áĽá á¨áááť áŹáá°á á°ááĽáááᢠá á˛á˘á˛ áááł á¨á ááááŠá ááá˝ á˛ááŞááľ áááľá¨á áĽááááá˘
á¨áá
á°á áŠá áá¤ááᣠá¨MD5 áá á¨áááłá°á áááᣠâáááŁáľ_ááľááŁáľâ áĽá ááĽáá áĽááŤááᢠáĽá áĽáááľáťáá-á¨áá
á°áŠ á¤áá˛5 á°ááłáłá áá ᣠáŤááłá¸áá á¤á°-áá˝áááľ áá á á°ááłáłá ááᢠáá
áá á¤á°-áá˝áááľ ááĽáá áá áłáš áááľá áľ áĽá¨áá¨áá ááᢠá¨áłá¸áá á¤á°-áá˝áááłá˝á ááŤáá áááłá¨áľáŁ âPWNED!â á¨áá á˝áá áŤáá á¤áľá¤áá¤áľ á¨ááá á ááłáĽ áĽááááŤááᢠá¨á áááአáááľ ááážá˝á áĽáá°áŤáááĄ-
á áłáš áá
á°áŠá áĽá áá áááá¨áľ ááááŤá, á¨á፠á áá áľá
á°áľ áá°áŁá. á¨áá ááá áááľáá
áĽáą á áááľá. áá
áá á á¨áá á
áá¸áľ á áá°áá°á ááááŤáľ á áááአá¨áá
á°áŠá áá á áĽáá°ááŤáľá°ááá áłáááĄ-
á LEB128 ááľáĽ á°ááá§áᢠá¨áĽá áá á áá áŁá¨áá
á°áŠ áá á á¨á¤á°-áá˝áááľ áá áľáá˝ á°áá¨á¨ áŁáľááá
á áłáš áá
á°áŠ á á°áá á¨á ᨠááአáĽáá°áá¨á° á á°á áĽá á¨áĽá áá¨áŤáá˝ á áá áľá
á°áľ áŁáá˘
á¨áá á°áŠá áá á áĽááľá°áŤáááá ... áĽá - áľá! đ áá¤áą á áŞá˛áŽá ááľáĽ áá.
áááá˝ áĽá á¨ááᢠááá˝
á á°ááłáłá áááł á°áá ááŚá˝ á°ááŽá á áá á¤á°-ááťáááľá ááá°áŤá¨áľ áĽá áááľáŹáľ á°á áááą áŤáá°á á ááá á¨UC Browser áŁá áŞá áá áá áá˝ááᢠáĽááá á¤á°-ááááá˝ á á áłáš á ááľ ááľáĽ áá°áŤá, áľááá áááá á¨áľáááľ áááśášá ááá áá. á áá¤áąá, á¨ááľáá ááľáŽáśá˝á á¨ááłá¨áľ á˝ááł, áĽáá˛áá á¨áĽááąáŤá áťááá áľáŠáá á¨áľáŤ áááá˝á ááááľ, ááá˘áŤáá˝, á¨ááá ááá˝ áĽá á áá¨á ááą ááľáĽ á¨á°á¨ááš áŠáŞáá˝á á¨ááŽ.
á¨áŠá˛ áĽáŽáááá á áááá˝ á áááá¨á áŤááááá á˝áá á áłáááᣠá°áááááąá áĽá á á°ááá ááá áá áá¨áá ááááá ááá á áá°ááŤá¨ááᢠáá
á áĽáá˛á
áĽááłáᣠá áłáš á á°áá áŁá
áŞáá á ááá
áá¨áľ áá áᢠááá áá á ááľ áá á¨á°áááááąá áááá á¨ááá
á á áá áĽáá°á ááą á˝á áááľ á ááťááᢠááá˝ 27 áá áá˘
á á˛áľ á¨áŠá˛ á áłá˝ 12.10.9.1193 á°áááᣠáĽáąá á ááááŠá á HTTPS á áŠá á áááˇááĄ
á á°á¨ááŞá á¨âááľá°áŤá¨áŤâ á áá áĽá áá
á á˝áá áĽáľá¨á°ááá áľ áá áľá¨áľ áá˛á¤á á á áłáš ááľáĽ áááááľ ááá¨á âááᣠá¨áá á˝áá á°ááĽáŻá!â á¨áá á¨áľá
á°áľ áááĽááľ á áľá¨áľááᢠáá˛á¤á áááááľ á ááá¨áá áľ áá áá áááአá¨áá¨á áĽáŤá á ááá á¨áᣠááá áá á áłáš á˛ááá áĽáŤá ááጠáá áᣠáá
á°áá á¨ááá ááá á
áá˝á á ááŁáľ á¨áá°áá á áŽáľ ááá¨áľ áĽáá°áááĽá ááá áá°áŁáá˘
ááá: hab.com