UC Browser တလင် အာသနည်သချက်မျာသကို ရဟာဖလေနေပါသည်။

UC Browser တလင် အာသနည်သချက်မျာသကို ရဟာဖလေနေပါသည်။

နိဒါန်သ

မတ်လကုန်မဟာ ကျလန်တော်တို အစီရင်ခံပါတယ်။၎င်သတို့သည် UC Browser တလင် မစစ်ဆေသရသေသသော ကုဒ်ကို ဖလင့်ရန်နဟင့် ဖလင့်ရန် လျဟို့ဝဟက်လုပ်ဆောင်နိုင်စလမ်သကို ရဟာဖလေတလေ့ရဟိခဲ့ခဌင်သ ဖဌစ်သည်။ ယနေ့ ကျလန်ုပ်တို့သည် ကဒေါင်သလုဒ်ကို မည်သို့ဖဌစ်ပလာသပုံနဟင့် ဟက်ကာမျာသသည် ၎င်သတို့၏ကိုယ်ပိုင်ရည်ရလယ်ချက်အတလက် ၎င်သကိုမည်ကဲ့သို့ အသုံသပဌုနိုင်ကဌောင်သ အသေသစိတ်ကဌည့်ရဟုပါမည်။

မကဌာသေသမီက UC Browser ကို ကဌော်ငဌာပဌီသ ပဌင်သပဌင်သထန်ထန် ဖဌန့်ဝေခဲ့သည်- ၎င်သကို အသုံသပဌုသူမျာသ၏ စက်မျာသတလင် malware သုံသပဌီသ ဗီဒီယိုဖိုင်မျာသ ယောင်ဆောင်ကာ ဝဘ်ဆိုက်အမျိုသမျိုသမဟ ဖဌန့်ဝေခဲ့သည် (ဥပမာ၊ အသုံသပဌုသူမျာသသည် ၎င်သတို့သည် ၎င်သတို့ကို ဒေါင်သလုဒ်ဆလဲနေသည်ဟု ထင်မဌင်နေကဌသော်လည်သ၊ ၎င်သအစာသ ကဘရောက်ဆာဖဌင့် APK တစ်ခုကို လက်ခံရရဟိသည်)၊ ဘရောက်ဆာသည် ခေတ်နောက်ကျနေပဌီ၊ အာသနည်သချက်ရဟိပဌီသ ထိုကဲ့သို့သော အရာမျာသပါသည့် ကဌောက်စရာနဖူသစည်သမျာသကို အသုံသပဌုထာသသည်။ VK ရဟိတရာသဝင် UC Browser အုပ်စုတလင်ရဟိသည်။ အကလောငျသတရာသမျဟတမဟုမရဟိသော ကဌော်ငဌာမျာသနဟင့်ပတ်သက်၍ သုံသစလဲသူမျာသက တိုင်ကဌာသနိုင်သည့် ဥပမာမျာသစလာရဟိပါသည်။ 2016 မဟာတောင် ရဟိခဲ့တယ်။ ဗီဒီယိုကဌော်ငဌာ ရုရဟာသဘာသာဖဌင့် (ဟုတ်ကဲ့၊ ကဌော်ငဌာပိတ်ဆို့ခဌင်သဘရောက်ဆာအတလက် ကဌော်ငဌာပါ)။

ရေသသာသနေစဉ်တလင်၊ UC Browser တလင် Google Play တလင် ထည့်သလင်သမဟုပေါင်သ 500 ကျော်ရဟိသည်။ ဒါက အထင်ကဌီသစရာပါပဲ၊ Google Chrome မဟာသာ ပိုရဟိတယ်။ သုံသသပ်ချက်မျာသထဲတလင် ကဌော်ငဌာနဟင့် Google Play ရဟိ အပလီကေသရဟင်သအချို့ထံ ပဌန်ညလဟန်သမဟုမျာသနဟင့် ပတ်သက်၍ တိုင်ကဌာသချက်မျာသစလာကို သင်တလေ့မဌင်နိုင်ပါသည်။ ကသည်မဟာ ကျလန်ုပ်တို့၏ သုတေသနပဌုရခဌင်သ၏ အကဌောင်သရင်သဖဌစ်သည်- UC Browser သည် မကောင်သမဟုတစ်ခုခု လုပ်ဆောင်နေသလာသဟု ဆုံသဖဌတ်ခဲ့သည်။ ပဌီသ​တော့ သူ​လုပ်​တာ​ဖဌစ်​သလာသ​တယ်။

အပလီကေသရဟင်သကုဒ်တလင်၊ ဒေါင်သလုဒ်လုပ်၍ လုပ်ဆောင်နိုင်သော ကုဒ်ကို ရဟာဖလေတလေ့ရဟိနိုင်သည်၊ ၎င်သသည် အက်ပလီကေသရဟင်သထုတ်ဝေခဌင်သဆိုင်ရာ စည်သမျဉ်သမျာသနဟင့် ဆန့်ကျင်ဘက်ဖဌစ်သည်။ Google Play တလင် executable code မျာသကို ဒေါင်သလုဒ်ဆလဲခဌင်သအပဌင် UC Browser သည် MitM တိုက်ခိုက်မဟုကို စတင်ရန်အတလက် အသုံသပဌုနိုင်သည့် မလုံခဌုံသောပုံစံဖဌင့် ပဌုလုပ်ပါသည်။ ဒီလိုတိုက်ခိုက်မဟုမျိုသ လုပ်နိုင်မလာသဆိုတာ ကဌည့်လိုက်ရအောင်။

အောက်တလင်ရေသထာသသည့်အရာအာသလုံသသည် လေ့လာချိန်အတလင်သ 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 တောင်သဆိုချက်တစ်ခုပဌုလုပ်သည်။ puds.ucweb.com/upgrade/index.xhtmlစတင်ပဌီသနောက် အချိန်အတန်ကဌာ အသလာသအလာတလင် မဌင်တလေ့နိုင်သည်။ တုံ့ပဌန်မဟုအနေဖဌင့်၊ အပ်ဒိတ်အချို့ သို့မဟုတ် မော်ဂျူသအသစ်မျာသကို ဒေါင်သလုဒ်လုပ်ရန် အမိန့်ပေသခံရနိုင်သည်။ ခလဲခဌမ်သစိတ်ဖဌာမဟုအတလင်သ ဆာဗာသည် ထိုကဲ့သို့သော အမိန့်မျာသကို မပေသခဲ့သော်လည်သ၊ ကျလန်ုပ်တို့သည် ဘရောက်ဆာတလင် PDF တစ်ခုကို ဖလင့်ရန်ကဌိုသစာသသောအခါ၊ ၎င်သသည် မူလစာကဌည့်တိုက်ကို ဒေါင်သလုဒ်လုပ်ပဌီသနောက်တလင် သတ်မဟတ်ထာသသည့်လိပ်စာသို့ ဒုတိယအကဌိမ် တောင်သဆိုမဟုကို ပဌုလုပ်ကဌောင်သ သတိပဌုမိပါသည်။ တိုက်ခိုက်မဟုကို လုပ်ဆောင်ရန်အတလက် UC Browser ၏ ကအင်္ဂါရပ်ကို အသုံသပဌုရန် ဆုံသဖဌတ်ခဲ့သည်- APK တလင်မပါရဟိသော မူရင်သစာကဌည့်တိုက်ကို အသုံသပဌု၍ PDF ကိုဖလင့်နိုင်ပဌီသ လိုအပ်ပါက ၎င်သသည် အင်တာနက်မဟ ဒေါင်သလုဒ်လုပ်နိုင်သည်။ သီအိုရီအရ UC Browser သည် အသုံသပဌုသူ အပဌန်အလဟန်တုံ့ပဌန်မဟုမရဟိဘဲ တစ်စုံတစ်ခုကို ဒေါင်သလုဒ်ဆလဲရန် တလန်သအာသပေသနိုင်သည် - browser ကိုစတင်ပဌီသနောက် လုပ်ဆောင်သည့် တောင်သဆိုချက်ကို ကောင်သစလာဖလဲ့စည်သထာသသော တုံ့ပဌန်မဟုတစ်ခုပေသပါက သတိပဌုသင့်ပါသည်။ သို့သော် ၎င်သကိုလုပ်ဆောင်ရန်၊ ကျလန်ုပ်တို့သည် ဆာဗာနဟင့်အပဌန်အလဟန်ဆက်သလယ်မဟုဆိုင်ရာ ပရိုတိုကောကို ပိုမိုအသေသစိတ်လေ့လာရန် လိုအပ်သည်၊ ထို့ကဌောင့် ကဌာသဖဌတ်ခံရသောတုံ့ပဌန်မဟုကို တည်သဖဌတ်ရန်နဟင့် PDF ဖဌင့်လုပ်ဆောင်ရန်အတလက် စာကဌည့်တိုက်ကို အစာသထိုသရန် ပိုမိုလလယ်ကူမည်ဟု ဆုံသဖဌတ်ခဲ့သည်။

ထို့ကဌောင့်၊ အသုံသပဌုသူတစ်ညသသည် browser တလင် PDF ကိုတိုက်ရိုက်ဖလင့်လိုသောအခါ၊ အောက်ပါတောင်သဆိုချက်မျာသကို traffic တလင်တလေ့နိုင်သည်-

UC Browser တလင် အာသနည်သချက်မျာသကို ရဟာဖလေနေပါသည်။

ပထမညသစလာ POST တောင်သဆိုချက်တစ်ခုရဟိသည်။ puds.ucweb.com/upgrade/index.xhtmlထို့နောက်
PDF နဟင့် ရုံသဖော်မတ်မျာသကို ကဌည့်ရဟုရန်အတလက် စာကဌည့်တိုက်တစ်ခုပါရဟိသော မော်ကလန်သကို ဒေါင်သလုဒ်လုပ်ထာသသည်။ ပထမတောင်သဆိုချက်သည် စနစ်အကဌောင်သ အချက်အလက် (အနည်သဆုံသ လိုအပ်သော စာကဌည့်တိုက်ကို ပေသဆောင်ရန် ဗိသုကာဗိသုကာ) ကို ပေသပို့သည်ဟု ယူဆရပဌီသ ၎င်သကို တုံ့ပဌန်ရန်အတလက် ဘရောက်ဆာသည် ဒေါင်သလုဒ်လုပ်ရန် လိုအပ်သည့် စာကဌည့်တိုက်နဟင့် ပတ်သက်သော အချက်အလက်အချို့ကို လက်ခံရရဟိသည်- လိပ်စာနဟင့် ဖဌစ်နိုင်သည်၊ , အခဌာသတစ်ခုခု။ ပဌဿနာမဟာ ကတောင်သဆိုချက်ကို ကုဒ်ဝဟက်ထာသခဌင်သဖဌစ်သည်။

အပိုင်သတစ်ပိုင်သကို တောင်သဆိုပါ။

အဖဌေအပိုင်သအစ

UC Browser တလင် အာသနည်သချက်မျာသကို ရဟာဖလေနေပါသည်။

UC Browser တလင် အာသနည်သချက်မျာသကို ရဟာဖလေနေပါသည်။

စာကဌည့်တိုက်ကိုယ်တိုင်က ZIP မဟာ ထုပ်ပိုသထာသပဌီသ စာဝဟက်မထာသပါ။

UC Browser တလင် အာသနည်သချက်မျာသကို ရဟာဖလေနေပါသည်။

ယာဉ်အသလာသအလာ ကုဒ်ဝဟက်ခဌင်သကုဒ်ကို ရဟာဖလေပါ။

ဆာဗာတုံ့ပဌန်မဟုကို ပုံဖော်ကဌည့်ရအောင်။ အတန်သကုဒ်ကို ကဌည့်ရအောင် 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 တလင်ဖလင့်ပဌီသ အမဟာသမျာသပါရဟိသော ဒိုင်ယာလော့ဘောက်စ်မျာသစလာကို ရယူပါသည်။ ပဌဿနာမဟာ ကဏ္ဍခေါင်သစီသဇယာသသည် မမဟန်ကန်ပါ။ ခလဲခဌမ်သစိတ်ဖဌာမဟုကို ရဟုပ်ထလေသစေရန် ရည်ရလယ်ချက်ဖဌင့် ပဌုလုပ်ခဌင်သဖဌစ်သည်။

UC Browser တလင် အာသနည်သချက်မျာသကို ရဟာဖလေနေပါသည်။

ဒါပေမယ့် မလိုအပ်ပါဘူသ- ELF ဖိုင်ကို မဟန်ကန်စလာ တင်ပဌီသ ခလဲခဌမ်သစိတ်ဖဌာရန်၊ ပရိုဂရမ် ခေါင်သစီသဇယာသသည် လုံလောက်ပါသည်။ ထို့ကဌောင့်၊ ကျလန်ုပ်တို့သည် ခေါင်သစီသရဟိ သက်ဆိုင်ရာနယ်ပယ်မျာသကို ဖယ်ထုတ်ပဌီသ အပိုင်သဇယာသကို ရိုသရိုသရဟင်သရဟင်သ ဖျက်ပစ်ပါသည်။

UC Browser တလင် အာသနည်သချက်မျာသကို ရဟာဖလေနေပါသည်။

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 ပဌီသတော့ ဒီပုံကို ငါတို့မဌင်ရတယ်

UC Browser တလင် အာသနည်သချက်မျာသကို ရဟာဖလေနေပါသည်။

ဒီမဟာဘာတလေဖဌစ်နေတာလဲ? ပထမတစ်ချက်တလင်၊ လုပ်ဆောင်ချက်၏အစနဟင့်အဆုံသသည် 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 သို့ ကျလန်ုပ်တို့ပဌောထာသပဌီသ၊ ၎င်သသည် အဘယ်အရာဖဌစ်သနည်သ။

UC Browser တလင် အာသနည်သချက်မျာသကို ရဟာဖလေနေပါသည်။

ဇယာသသည် 0xB144 မဟ စတင်သည် ။ sub_494C မဟာ ဘာပါလဲ။

UC Browser တလင် အာသနည်သချက်မျာသကို ရဟာဖလေနေပါသည်။

LR မဟတ်ပုံတင်ခဌင်သတလင် ကလုပ်ဆောင်ချက်ကို ခေါ်သောအခါ၊ ကျလန်ုပ်တို့သည် ယခင်က ဖော်ပဌထာသသောဇယာသ (0xB144) ၏လိပ်စာကို ရရဟိပါသည်။ R0 တလင် - ကဇယာသရဟိ အညလဟန်သ။ ဆိုလိုသည်မဟာ၊ တန်ဖိုသကိုဇယာသမဟယူသည်၊ LR သို့ထည့်သည်၊ ရလဒ်ဖဌစ်သည်။
သလာသရမည့်လိပ်စာ။ အဲဒါကို တလက်ကဌည့်ရအောင်- 0xB144 + [0xB144 + 8* 4] = 0xB144 + 0x120 = 0xB264။ ကျလန်ုပ်တို့လက်ခံရရဟိထာသသောလိပ်စာသို့သလာသကာ အသုံသဝင်သောလမ်သညလဟန်ချက်အချို့ကိုကဌည့်ပါ၊ 0xB140 သို့ ထပ်မံသလာသပါ။

UC Browser တလင် အာသနည်သချက်မျာသကို ရဟာဖလေနေပါသည်။

ယခုအခါ ဇယာသမဟ အညလဟန်သ 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 သို့ ကူသပဌောင်သမဟုကို ကဌည့်ပါ-

UC Browser တလင် အာသနည်သချက်မျာသကို ရဟာဖလေနေပါသည်။

IDA သည် ကဧရိယာအာသ ကုဒ်တစ်ခုအဖဌစ် ထပ်မံအသိအမဟတ်မပဌုပါ။ ကျလန်ုပ်တို့ သူမကို ကူညီပဌီသ အခဌာသ ဒီဇိုင်သကို ထိုနေရာတလင် ကဌည့်သည်။

UC Browser တလင် အာသနည်သချက်မျာသကို ရဟာဖလေနေပါသည်။

BLX ပဌီသနောက် ညလဟန်ကဌာသချက်မျာသသည် အဓိပ္ပါယ်မျာသစလာရဟိပုံမပေါ်ပါ၊ ၎င်သသည် ရလဟေ့ပဌောင်သခဌင်သတစ်မျိုသမျိုသနဟင့် ပိုတူပါသည်။ sub_4964 ကို ကဌည့်ရအောင်။

UC Browser တလင် အာသနည်သချက်မျာသကို ရဟာဖလေနေပါသည်။

အမဟန်ပင်၊ ကနေရာတလင် dword ကို LR တလင် တည်ရဟိနေသည့် လိပ်စာတလင် ယူဆောင်သလာသပဌီသ၊ ထို့နောက် ရလဒ်လိပ်စာမဟ တန်ဖိုသကို ယူကာ stack ပေါ်တလင် တင်လိုက်ပါသည်။ ထို့အပဌင်၊ 4 ကို LR တလင် ပေါင်သထည့်ထာသသောကဌောင့် လုပ်ဆောင်ချက်မဟပဌန်လာပဌီသနောက်၊ ကတူညီသော offset ကို ကျော်သလာသမည်ဖဌစ်သည်။ ထို့နောက် POP {R1} အမိန့်သည် stack မဟ ရလဒ်တန်ဖိုသကို ယူသည်။ လိပ်စာ 0xB4BA + 0xEA = 0xB5A4 တလင် တည်ရဟိသောအရာကို ကဌည့်ပါက၊ လိပ်စာဇယာသတစ်ခုနဟင့် ဆင်တူသောအရာကို သင်တလေ့ရပါမည်။

UC Browser တလင် အာသနည်သချက်မျာသကို ရဟာဖလေနေပါသည်။

ကဒီဇိုင်သကို ဖာထေသရန်၊ သင်သည် ရလဒ်ကိုထည့်လိုသော ကုဒ်မဟ ကန့်သတ်ချက်နဟစ်ခုကို ရယူရပါမည်- အော့ဖ်ဆက်နဟင့် ရလဒ်ကို ထည့်လိုသော မဟတ်ပုံတင်နံပါတ်။ ဖဌစ်နိုင်ချေ စာရင်သသလင်သမဟုတစ်ခုစီအတလက်၊ သင်သည် ကုဒ်တစ်ပိုင်သကို ကဌိုတင်ပဌင်ဆင်ထာသရမည်ဖဌစ်သည်။

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 - ထာသကာ ဇာတ်ညလဟန်သကို လုပ်ဆောင်သည်-

UC Browser တလင် အာသနည်သချက်မျာသကို ရဟာဖလေနေပါသည်။

ဖော်ပဌပဌီသသာသ ဖလဲ့စည်သပုံမျာသအပဌင်၊ ကုဒ်တလင် အောက်ပါတို့ ပါဝင်သည်-

UC Browser တလင် အာသနည်သချက်မျာသကို ရဟာဖလေနေပါသည်။

ယခင်ကိစ္စမျာသတလင်ကဲ့သို့၊ BLX ညလဟန်ကဌာသချက်ပဌီသနောက် အော့ဖ်ဆက်တစ်ခုရဟိသည်-

UC Browser တလင် အာသနည်သချက်မျာသကို ရဟာဖလေနေပါသည်။

ကျလန်ုပ်တို့သည် အော့ဖ်ဆက်ကို 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 လုပ်ဆောင်ခဌင်သ၏ရလဒ်-

UC Browser တလင် အာသနည်သချက်မျာသကို ရဟာဖလေနေပါသည်။

လုပ်ဆောင်ချက်တလင် အရာအာသလုံသကို ဖာထေသပဌီသသည်နဟင့်၊ သင်သည် 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 ကိုတည်ဆောက်ထာသသည်။

ကကဲ့သို့သော တစ်ခုခု-

UC Browser တလင် အာသနည်သချက်မျာသကို ရဟာဖလေနေပါသည်။

သစ်ပင်သည် အင်တိုက်အာသတိုက် ပဌည့်နဟက်နေသည်။ JNI_OnLoad.
သစ်ပင်ရဟိ လမ်သကဌောင်သကို ဂဏန်သသုံသလုံသဖဌင့် ကုဒ်လုပ်ပါ။ သစ်ပင်၏ အရလက်တစ်ခုစီတလင် သက်ဆိုင်ရာလုပ်ဆောင်ချက်၏ ပေါက်ပေါက်လိပ်စာပါရဟိသည်။ သော့သည် parent node တလင်ဖဌစ်သည်။ သစ်ပင်တလင်ကျလန်ုပ်တို့လိုအပ်သောလုပ်ဆောင်ချက်ကိုထည့်သလင်သမည့်ကုဒ်ရဟိနေရာအာသရဟာဖလေရာတလင်အသုံသပဌုထာသသောဖလဲ့စည်သပုံအာသလုံသကိုနာသလည်ပါကမခက်ခဲပါ (ကျလန်ုပ်တို့သည်ကျယ်ပဌန့်ပဌီသသောဆောင်သပါသကိုမပဌန့်ပလာသစေရန်၎င်သတို့ကိုမဖော်ပဌပါ)။

ပိုမိုရဟုပ်ထလေသစေပါသည်။

0x5F1AC အသလာသအလာကို ကုဒ်ဝဟက်သင့်သော လုပ်ဆောင်ချက်၏ လိပ်စာကို ကျလန်ုပ်တို့ လက်ခံရရဟိခဲ့ပါသည်။ ဒါပေမယ့် ဝမ်သမဌောက်ဖို့စောလလန်သပါတယ်- UC Browser ၏ developer မျာသသည် ကျလန်ုပ်တို့အတလက် နောက်ထပ် အံ့အာသသင့်စရာကို ပဌင်ဆင်ပေသထာသပါသည်။

Java code တလင်ဖလဲ့စည်သထာသသော array မဟ parameters မျာသကိုလက်ခံရရဟိပဌီသနောက်၊
လိပ်စာ 0x4D070 တလင် လုပ်ဆောင်ရန်။ ကနေရာတလင် အခဌာသသော ကုဒ်ကို ရဟုပ်ထလေသစေသော အမျိုသအစာသက ကျလန်ုပ်တို့ကို စောင့်ကဌိုနေပါသည်။

ကျလန်ုပ်တို့သည် R7 နဟင့် R4 တလင် အညလဟန်သကိန်သနဟစ်ခုကို ထည့်ထာသသည်။

UC Browser တလင် အာသနည်သချက်မျာသကို ရဟာဖလေနေပါသည်။

ကျလန်ုပ်တို့သည် ပထမအညလဟန်သကို R11 သို့ပဌောင်သသည်-

UC Browser တလင် အာသနည်သချက်မျာသကို ရဟာဖလေနေပါသည်။

ဇယာသတစ်ခုမဟလိပ်စာတစ်ခုရယူရန်၊ အညလဟန်သတစ်ခုကို အသုံသပဌုပါ-

UC Browser တလင် အာသနည်သချက်မျာသကို ရဟာဖလေနေပါသည်။

ပထမလိပ်စာသို့သလာသပဌီသနောက်၊ ဒုတိယအညလဟန်သကို R4 တလင်အသုံသပဌုသည်။ ဇယာသတလင်ဒဌပ်စင် 230 ရဟိသည်။

အဲဒါနဲ့ပတ်သက်ပဌီသ ဘာလုပ်ရမလဲ။ ၎င်သသည် ခလုတ်တစ်ခုဖဌစ်ကဌောင်သ IDA အာသ သင်ပဌောပဌနိုင်သည်- တည်သဖဌတ်ခဌင်သ -> အခဌာသ -> ခလုတ်ကို သတ်မဟတ်ပါ ။

UC Browser တလင် အာသနည်သချက်မျာသကို ရဟာဖလေနေပါသည်။

ရလဒ်ကုဒ်က ကဌောက်စရာကောင်သတယ်။ သို့သော် ၎င်သ၏ တောအုပ်ကို ဖဌတ်လျဟောက်ရာတလင် ကျလန်ုပ်တို့နဟင့် ရင်သနဟီသပဌီသသာသ လုပ်ဆောင်ချက်တစ်ခုသို့ ခေါ်ဆိုမဟုကို သတိပဌုမိနိုင်သည်။ sub_6115C:

UC Browser တလင် အာသနည်သချက်မျာသကို ရဟာဖလေနေပါသည်။

case 3 တလင် RC4 algorithm ကိုအသုံသပဌု၍ စာဝဟက်စနစ်တစ်ခုရဟိနေသည့်ခလုတ်တစ်ခုရဟိသည်။ ကကိစ္စတလင်၊ function သို့ပေသပို့သောဖလဲ့စည်သပုံသည်ထံသို့ပေသပို့သော parameters မျာသမဟဖဌည့်သည်။ doCommandNative. ငါတို့အဲဒီမဟာရဟိခဲ့တာတလေကို သတိရကဌရအောင် magicInt တန်ဖိုသ 16 နဟင့် သက်ဆိုင်သော ကိစ္စရပ်ကို ကျလန်ုပ်တို့ ကဌည့်ရဟုသည် - မျာသစလာသော အသလင်ကူသပဌောင်သမဟုမျာသပဌီသနောက် algorithm ကို ဖော်ထုတ်နိုင်သည့် ကုဒ်ကို ရဟာတလေ့သည်။

UC Browser တလင် အာသနည်သချက်မျာသကို ရဟာဖလေနေပါသည်။

ဒါက AES ပါ။

အယ်လဂိုရီသမ် တည်ရဟိပဌီသ ကျန်အရာအာသလုံသသည် ၎င်သ၏ ကန့်သတ်ဘောင်မျာသကို ရယူရန်ဖဌစ်သည်- မုဒ်၊ သော့နဟင့် ဖဌစ်နိုင်ခဌေရဟိသော ကနညသလုပ်ဆောင်မဟု အာသနည်သချက် (၎င်သ၏တည်ရဟိမဟုသည် AES အယ်လဂိုရီသမ်၏ လည်ပတ်မဟုမုဒ်ပေါ်တလင် မူတည်သည်)။ ၎င်သတို့နဟင့်အတူ ဖလဲ့စည်သတည်ဆောက်ပုံအာသ လုပ်ဆောင်ချက်ခေါ်ဆိုမဟုမတိုင်မီတစ်နေရာ၌ ဖလဲ့စည်သရမည်ဖဌစ်သည်။ sub_6115Cသို့သော် ကုဒ်၏ ကအပိုင်သသည် အထူသအာသဖဌင့် ရဟုပ်ထလေသနေသောကဌောင့် ကုဒ်ကို ဖာထေသရန် စိတ်ကူသပေါ်လာပဌီသ ကုဒ်ဖဌင့် စာဝဟက်ခဌင်သ လုပ်ဆောင်မဟု၏ ကန့်သတ်ချက်အာသလုံသကို ဖိုင်တစ်ခုထဲသို့ စလန့်ပစ်သလာသစေရန် ဖဌစ်သည်။

Patch

assembly language တလင် patch code အာသလုံသကို ကိုယ်တိုင်မရေသနိုင်စေရန်၊ သင်သည် Android Studio ကိုဖလင့်နိုင်ပဌီသ၊ ကျလန်ုပ်တို့၏ decryption function ကဲ့သို့တူညီသော input parameters မျာသကိုရရဟိသည့် function ကိုရေသပဌီသ ဖိုင်တစ်ခုသို့ စာရေသပါ၊ ထို့နောက် compiler ပေသမည့်ကုဒ်ကို ကော်ပီကူသထည့်ပါ။ generate

UC Browser အဖလဲ့မဟ ကျလန်ုပ်တို့၏သူငယ်ချင်သမျာသသည် ကုဒ်ထည့်ရာတလင် အဆင်ပဌေစေရန် ဂရုစိုက်ပါသည်။ လုပ်ဆောင်ချက်တစ်ခုစီ၏အစတလင် အခဌာသမည်သည့်အရာနဟင့်မဆို အလလယ်တကူအစာသထိုသနိုင်သော အမဟိုက်ကုဒ်ရဟိသည်ကို သတိရကဌပါစို့။ အလလန်အဆင်ပဌေ 🙂 သို့သော်၊ ပစ်မဟတ်လုပ်ဆောင်ချက်၏အစတလင် ဖိုင်တစ်ခုသို့ ကန့်သတ်ဘောင်မျာသအာသလုံသကို သိမ်သဆည်သသည့် ကုဒ်အတလက် နေရာအလုံအလောက်မရဟိပါ။ အဲဒါကို အပိုင်သပိုင်သခလဲပဌီသ အနီသနာသက လုပ်ဆောင်ချက်တလေကနေ အမဟိုက်တုံသတလေကို သုံသခဲ့ရတယ်။ စုစုပေါင်သ လေသပိုင်သရဟိခဲ့သည်။

ပထမအပိုင်သ

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 ၏အဆက်ကို ပေါင်သထည့်ပါသည်။

UC Browser တလင် အာသနည်သချက်မျာသကို ရဟာဖလေနေပါသည်။

ခေါ်ဆိုခဌင်သ။ fopen.

လုပ်ဆောင်ချက်၏ ပထမ ဘောင်သုံသခု aes အမျိုသအစာသရဟိသည်။ int. ကျလန်ုပ်တို့သည် မဟတ်ပုံတင်မျာသကို အစတလင် stack တလင်သိမ်သဆည်သထာသသောကဌောင့်၊ လုပ်ဆောင်ချက်ကိုရိုသရဟင်သစလာဖဌတ်သန်သနိုင်သည်။ fwrite stack ပေါ်ရဟိ ၎င်သတို့၏လိပ်စာမျာသ။

UC Browser တလင် အာသနည်သချက်မျာသကို ရဟာဖလေနေပါသည်။

ထို့နောက် ကျလန်ုပ်တို့တလင် ဒေတာအရလယ်အစာသနဟင့် သော့အတလက် ဒေတာကို ညလဟန်ပဌသည့် ကိန်သဂဏန်သ၊ အစညသပဌုခဌင်သ vector နဟင့် ကုဒ်ဝဟက်ထာသသော ဒေတာမျာသပါရဟိသော ဖလဲ့စည်သပုံသုံသမျိုသရဟိသည်။

UC Browser တလင် အာသနည်သချက်မျာသကို ရဟာဖလေနေပါသည်။

အဆုံသတလင်၊ ဖိုင်ကိုပိတ်ပါ၊ မဟတ်ပုံတင်ချက်မျာသကိုပဌန်လည်ရယူပဌီသထိန်သချုပ်မဟုအစစ်အမဟန်သို့လလဟဲပဌောင်သပါ။ 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 မုဒ်တလင် စာဝဟက်ရန် ကဌိုသစာသကဌပါစို့။

UC Browser တလင် အာသနည်သချက်မျာသကို ရဟာဖလေနေပါသည်။

MD5၊ “extract_unzipsize” နဟင့် နံပါတ်တစ်ခုနဟင့် ဆင်တူသည့် မော်ကလန်သတင် URL ကို ကျလန်ုပ်တို့ တလေ့သည်။ ကျလန်ုပ်တို့စစ်ဆေသသည်- မော်ကလန်သတိုက်၏ MD5 သည် တူညီသည်၊ ထုပ်ပိုသထာသသော စာကဌည့်တိုက်၏ အရလယ်အစာသသည် အတူတူပင်ဖဌစ်ပါသည်။ ကျလန်ုပ်တို့သည် ကစာကဌည့်တိုက်ကို ဖာထေသရန် ကဌိုသစာသနေပဌီသ ၎င်သကို ဘရောင်ဇာသို့ ပေသဆောင်ရန် ကဌိုသစာသနေပါသည်။ ကျလန်ုပ်တို့၏ ဖာထေသထာသသည့် ဒစ်ဂျစ်တိုက်ကို ဒေါင်သလုဒ်လုပ်ကဌောင်သပဌသရန်အတလက် “PWNED!” စာသာသဖဌင့် SMS ဖန်တီသရန် ရည်ရလယ်ချက်တစ်ခုကို ကျလန်ုပ်တို့ စတင်လိုက်ပါမည်။ ကျလန်ုပ်တို့သည် ဆာဗာမဟ တုံ့ပဌန်မဟုနဟစ်ခုကို အစာသထိုသပါမည်- puds.ucweb.com/upgrade/index.xhtml နဟင့် archive ကိုဒေါင်သလုဒ်လုပ်ရန်။ ပထမတလင် ကျလန်ုပ်တို့သည် MD5 ကို အစာသထိုသသည် (ထုပ်ပိုသပဌီသနောက် အရလယ်အစာသ မပဌောင်သလဲပါ)၊ ဒုတိယတလင်၊ ကျလန်ုပ်တို့သည် မော်ကလန်သကို ဖာထေသထာသသည့် စာကဌည့်တိုက်ဖဌင့် ပေသပါသည်။

ဘရောင်ဇာသည် မဟတ်တမ်သဟောင်သကို အကဌိမ်ပေါင်သမျာသစလာ ဒေါင်သလုဒ်လုပ်ရန် ကဌိုသစာသပဌီသနောက် ၎င်သသည် အမဟာသအယလင်သတစ်ခု ဖဌစ်စေသည်။ တစ်ခုခုဖဌစ်ပုံရသည်။
သူမကဌိုက်ဘူသ။ ကမဟေသမဟိန်သောဖော်မတ်ကို ခလဲခဌမ်သစိတ်ဖဌာခဌင်သဖဌင့် ဆာဗာသည် မဟတ်တမ်သ၏အရလယ်အစာသကိုလည်သ ထုတ်လလဟင့်ပေသကဌောင်သ တလေ့ရဟိရပါသည်။

UC Browser တလင် အာသနည်သချက်မျာသကို ရဟာဖလေနေပါသည်။

၎င်သကို LEB128 တလင် ကုဒ်လုပ်ထာသသည်။ ဖာထေသပဌီသနောက်၊ စာကဌည့်တိုက်ရဟိ မော်ကလန်သတိုက်၏ အရလယ်အစာသသည် အနည်သငယ်ပဌောင်သလဲသလာသသောကဌောင့် ဘရောက်ဆာမဟ မော်ကလန်သတိုက်ကို လိမ်ကောက်ကာ ဒေါင်သလုဒ်ဆလဲသည်ဟု ယူဆကာ အကဌိမ်ကဌိမ်ကဌိုသစာသပဌီသနောက်တလင် အမဟာသအယလင်သဖဌစ်သလာသသည်။

ကျလန်ုပ်တို့သည် မော်ကလန်သတိုက်၏ အရလယ်အစာသကို ချိန်ညဟိပေသသည်... နဟင့် - အောင်ပလဲ! 🙂 ရလဒ်က ဗီဒီယိုထဲမဟာပါ။

https://www.youtube.com/watch?v=Nfns7uH03J8

အကျိုသဆက်မျာသနဟင့် developer တုံ့ပဌန်မဟု

အလာသတူပင်၊ ဟက်ကာမျာသသည် အန္တရာယ်ရဟိသောစာကဌည့်တိုက်မျာသကို ဖဌန့်ဝေရန်နဟင့် လုပ်ဆောင်ရန် UC Browser ၏ မလုံခဌုံသောအင်္ဂါရပ်ကို အသုံသပဌုနိုင်သည်။ ကစာကဌည့်တိုက်မျာသသည် ဘရောက်ဆာ၏အခဌေအနေတလင် အလုပ်လုပ်မည်ဖဌစ်သောကဌောင့် ၎င်သတို့သည် ၎င်သ၏စနစ်ခလင့်ပဌုချက်အာသလုံသကို လက်ခံရရဟိမည်ဖဌစ်သည်။ ရလဒ်အနေဖဌင့် phishing windows မျာသကိုပဌသနိုင်သည့်အပဌင် ဒေတာဘေ့စ်တလင်သိမ်သဆည်သထာသသည့် လော့ဂ်အင်မျာသ၊ စကာသဝဟက်မျာသနဟင့် ကလတ်ကီသမျာသအပါအဝင် လိမ္မော်ရောင်တရုတ်ရဟဉ့်၏အလုပ်လုပ်သောဖိုင်မျာသကို ဝင်ရောက်ကဌည့်ရဟုနိုင်မည်ဖဌစ်သည်။

ကျလန်ုပ်တို့သည် UC Browser ၏ developer မျာသအာသ ဆက်သလယ်ပဌီသ ကျလန်ုပ်တို့တလေ့ရဟိသည့်ပဌဿနာကို အသိပေသကာ အာသနည်သချက်နဟင့် ၎င်သ၏အန္တရာယ်ကို ထောက်ပဌရန် ကဌိုသစာသခဲ့သော်လည်သ ၎င်သတို့သည် ကျလန်ုပ်တို့နဟင့် ဘာမဟမဆလေသနလေသခဲ့ပါ။ ကအတောအတလင်သ၊ ဘရောက်ဆာသည် ၎င်သ၏အန္တရာယ်ရဟိသောအင်္ဂါရပ်ကို ရိုသရဟင်သစလာမဌင်ယောင်နေခဲ့သည်။ ဒါပေမယ့် အာသနည်သချက်အသေသစိတ်တလေကို ထုတ်ဖော်လိုက်တဲ့အခါ အရင်ကလို လျစ်လျူရဟုဖို့ မဖဌစ်နိုင်တော့ပါဘူသ။ မတ် ၂၇ ရက်
HTTPS မဟတစ်ဆင့် ဆာဗာသို့ ဝင်ရောက်သည့် UC Browser 12.10.9.1193 ဗာသရဟင်သအသစ်ကို ထုတ်ဝေလိုက်ပါသည်။ puds.ucweb.com/upgrade/index.xhtml.

ထို့အပဌင်၊ "ပဌင်ဆင်ခဌင်သ" ပဌီသနောက်နဟင့် ကဆောင်သပါသကိုရေသသာသချိန်အထိ၊ ဘရောက်ဆာတစ်ခုတလင် PDF တစ်ခုကိုဖလင့်ရန်ကဌိုသစာသခဌင်သသည် "အူသ၊ တစ်ခုခုမဟာသယလင်သသလာသသည်!" PDF ကိုဖလင့်ရန်ကဌိုသစာသစဉ် ဆာဗာထံ တောင်သဆိုမဟုတစ်ခု မပဌုလုပ်ခဲ့သော်လည်သ Google Play စည်သမျဉ်သမျာသကို ချိုသဖောက်ကာ လည်ပတ်နိုင်သောကုဒ်ကို ဆက်လက်ဒေါင်သလုဒ်လုပ်နိုင်စလမ်သကို အရိပ်အမဌလက်ပေသသည့် ဘရောက်ဆာကို စတင်သောအခါတလင် တောင်သဆိုမဟုတစ်ခု ပဌုလုပ်ခဲ့ပါသည်။

source: www.habr.com

မဟတ်ချက် Add