UC ๋ธŒ๋ผ์šฐ์ €์˜ ์ทจ์•ฝ์  ์ฐพ๊ธฐ

UC ๋ธŒ๋ผ์šฐ์ €์˜ ์ทจ์•ฝ์  ์ฐพ๊ธฐ

์†Œ๊ฐœ

XNUMX์›” ๋ง์— ์šฐ๋ฆฌ๋Š” ๋ณด๊ณ , ๊ทธ๋“ค์€ UC ๋ธŒ๋ผ์šฐ์ €์—์„œ ํ™•์ธ๋˜์ง€ ์•Š์€ ์ฝ”๋“œ๋ฅผ ๋กœ๋“œํ•˜๊ณ  ์‹คํ–‰ํ•˜๋Š” ์ˆจ๊ฒจ์ง„ ๊ธฐ๋Šฅ์„ ๋ฐœ๊ฒฌํ–ˆ์Šต๋‹ˆ๋‹ค. ์˜ค๋Š˜ ์šฐ๋ฆฌ๋Š” ์ด ๋‹ค์šด๋กœ๋“œ๊ฐ€ ์–ด๋–ป๊ฒŒ ์ด๋ฃจ์–ด์ง€๋Š”์ง€, ๊ทธ๋ฆฌ๊ณ  ํ•ด์ปค๊ฐ€ ์ž์‹ ์˜ ๋ชฉ์ ์„ ์œ„ํ•ด ์ด๋ฅผ ์–ด๋–ป๊ฒŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š”์ง€ ์ž์„ธํžˆ ์‚ดํŽด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

์–ผ๋งˆ ์ „ UC Browser๋Š” ๋งค์šฐ ๊ณต๊ฒฉ์ ์œผ๋กœ ๊ด‘๊ณ  ๋ฐ ๋ฐฐํฌ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์•…์„ฑ ์ฝ”๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์‚ฌ์šฉ์ž ์žฅ์น˜์— ์„ค์น˜๋˜์—ˆ์œผ๋ฉฐ, ๋น„๋””์˜ค ํŒŒ์ผ๋กœ ์œ„์žฅํ•˜์—ฌ ๋‹ค์–‘ํ•œ ์‚ฌ์ดํŠธ์—์„œ ๋ฐฐํฌ๋˜์—ˆ์Šต๋‹ˆ๋‹ค(์˜ˆ: ์‚ฌ์šฉ์ž๋Š” ํฌ๋ฅด๋…ธ ๋น„๋””์˜ค ๋“ฑ์„ ๋‹ค์šด๋กœ๋“œํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ–ˆ์ง€๋งŒ, ๋Œ€์‹  ์ด ๋ธŒ๋ผ์šฐ์ €๋กœ APK๋ฅผ ๋ฐ›์•˜์Šต๋‹ˆ๋‹ค), ๋ธŒ๋ผ์šฐ์ €๊ฐ€ ์˜ค๋ž˜๋˜๊ณ  ์ทจ์•ฝํ•˜๋‹ค๋Š” ๋ฉ”์‹œ์ง€๊ฐ€ ํฌํ•จ๋œ ๋ฌด์„œ์šด ๋ฐฐ๋„ˆ๋ฅผ ์‚ฌ์šฉํ–ˆ์Šต๋‹ˆ๋‹ค. VK์˜ ๊ณต์‹ UC ๋ธŒ๋ผ์šฐ์ € ๊ทธ๋ฃน์—๋Š” ๋‹ค์Œ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ํ…Œ๋งˆ, ์‚ฌ์šฉ์ž๊ฐ€ ๋ถ€๋‹นํ•œ ๊ด‘๊ณ ์— ๋Œ€ํ•ด ๋ถˆ๋งŒ์„ ์ œ๊ธฐํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒฝ์šฐ์—๋Š” ๋งŽ์€ ์˜ˆ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. 2016๋…„์—๋Š” ์‹ฌ์ง€์–ด ๋น„๋””์˜ค ๊ด‘๊ณ  ๋Ÿฌ์‹œ์•„์–ด๋กœ(์˜ˆ, ๊ด‘๊ณ  ์ฐจ๋‹จ ๋ธŒ๋ผ์šฐ์ € ๊ด‘๊ณ ).

์ด ๊ธ€์„ ์“ฐ๋Š” ์‹œ์ ์— UC Browser๋Š” Google Play์—์„œ 500์–ต ๊ฑด ์ด์ƒ ์„ค์น˜๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์ด๋Š” ์ธ์ƒ์ ์ž…๋‹ˆ๋‹ค. Google Chrome์—๋งŒ ๋” ๋งŽ์€ ๊ธฐ๋Šฅ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ๋ฆฌ๋ทฐ ์ค‘์—๋Š” ๊ด‘๊ณ ์— ๋Œ€ํ•œ ๋ถˆ๋งŒ ์‚ฌํ•ญ๊ณผ Google Play์˜ ์ผ๋ถ€ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์œผ๋กœ์˜ ๋ฆฌ๋””๋ ‰์…˜์„ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์ด ์šฐ๋ฆฌ ์—ฐ๊ตฌ์˜ ์ด์œ ์˜€์Šต๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๋Š” UC ๋ธŒ๋ผ์šฐ์ €๊ฐ€ ๋ญ”๊ฐ€ ๋‚˜์œ ์ผ์„ ํ•˜๊ณ  ์žˆ๋Š”์ง€ ์•Œ์•„๋ณด๊ธฐ๋กœ ๊ฒฐ์ •ํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๊ทธ๊ฐ€ ๊ทธ๋žฌ๋‹ค๋Š” ๊ฒƒ์ด ๋ฐํ˜€์กŒ์Šต๋‹ˆ๋‹ค!

์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ฝ”๋“œ์—์„œ๋Š” ์‹คํ–‰ ๊ฐ€๋Šฅํ•œ ์ฝ”๋“œ๋ฅผ ๋‹ค์šด๋กœ๋“œํ•˜๊ณ  ์‹คํ–‰ํ•˜๋Š” ๊ธฐ๋Šฅ์ด ๋ฐœ๊ฒฌ๋๊ณ , ์ด๋Š” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๊ฒŒ์‹œ ๊ทœ์น™์— ์œ„๋ฐฐ๋ฉ๋‹ˆ๋‹ค. Google Play์—์„œ. ์‹คํ–‰ ๊ฐ€๋Šฅํ•œ ์ฝ”๋“œ๋ฅผ ๋‹ค์šด๋กœ๋“œํ•˜๋Š” ๊ฒƒ ์™ธ์—๋„ UC Browser๋Š” ์•ˆ์ „ํ•˜์ง€ ์•Š์€ ๋ฐฉ์‹์œผ๋กœ ๋‹ค์šด๋กœ๋“œ๋ฅผ ์ˆ˜ํ–‰ํ•˜๋ฏ€๋กœ MitM ๊ณต๊ฒฉ์„ ์‹œ์ž‘ํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๊ฐ€ ๊ทธ๋Ÿฌํ•œ ๊ณต๊ฒฉ์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ๋Š”์ง€ ์‚ดํŽด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

์•„๋ž˜์— ๊ธฐ๋ก๋œ ๋ชจ๋“  ๋‚ด์šฉ์€ ์—ฐ๊ตฌ ๋‹น์‹œ Google Play์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์—ˆ๋˜ UC ๋ธŒ๋ผ์šฐ์ € ๋ฒ„์ „๊ณผ ๊ด€๋ จ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

package: com.UCMobile.intl
versionName: 12.10.8.1172
versionCode: 10598
sha1 APK-ั„ะฐะนะปะฐ: f5edb2243413c777172f6362876041eb0c3a928c

๊ณต๊ฒฉ ๋ฒกํ„ฐ

UC ๋ธŒ๋ผ์šฐ์ € ๋งค๋‹ˆํŽ˜์ŠคํŠธ์—์„œ ์„ค๋ช…์ด ํ•„์š”ํ•œ ์ด๋ฆ„์„ ๊ฐ€์ง„ ์„œ๋น„์Šค๋ฅผ ์ฐพ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. com.uc.deployment.UpgradeDeployService.

    <service android_exported="false" android_name="com.uc.deployment.UpgradeDeployService" android_process=":deploy" />

์ด ์„œ๋น„์Šค๊ฐ€ ์‹œ์ž‘๋˜๋ฉด ๋ธŒ๋ผ์šฐ์ €๋Š” POST ์š”์ฒญ์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค. puds.ucweb.com/upgrade/index.xhtml, ์ด๋Š” ์‹œ์ž‘ ํ›„ ์–ผ๋งˆ ํ›„์— ๊ตํ†ต ์ƒํ™ฉ์—์„œ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด์— ๋Œ€ํ•œ ์‘๋‹ต์œผ๋กœ ์ผ๋ถ€ ์—…๋ฐ์ดํŠธ๋‚˜ ์ƒˆ ๋ชจ๋“ˆ์„ ๋‹ค์šด๋กœ๋“œํ•˜๋ผ๋Š” ๋ช…๋ น์„ ๋ฐ›์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ถ„์„ ์ค‘์— ์„œ๋ฒ„๋Š” ๊ทธ๋Ÿฌํ•œ ๋ช…๋ น์„ ๋‚ด๋ฆฌ์ง€ ์•Š์•˜์ง€๋งŒ ๋ธŒ๋ผ์šฐ์ €์—์„œ PDF๋ฅผ ์—ด๋ ค๊ณ  ํ•˜๋ฉด ์œ„์— ์ง€์ •๋œ ์ฃผ์†Œ๋กœ ๋‘ ๋ฒˆ์งธ ์š”์ฒญ์„ ํ•œ ํ›„ ๊ธฐ๋ณธ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ๋‹ค์šด๋กœ๋“œํ•œ๋‹ค๋Š” ๊ฒƒ์„ ๋ฐœ๊ฒฌํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ณต๊ฒฉ์„ ์ˆ˜ํ–‰ํ•˜๊ธฐ ์œ„ํ•ด ์šฐ๋ฆฌ๋Š” UC ๋ธŒ๋ผ์šฐ์ €์˜ ๊ธฐ๋Šฅ์ธ APK์— ์—†๊ณ  ํ•„์š”ํ•œ ๊ฒฝ์šฐ ์ธํ„ฐ๋„ท์—์„œ ๋‹ค์šด๋กœ๋“œํ•˜๋Š” ๊ธฐ๋ณธ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ PDF๋ฅผ ์—ฌ๋Š” ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•˜๊ธฐ๋กœ ๊ฒฐ์ •ํ–ˆ์Šต๋‹ˆ๋‹ค. ์ด๋ก ์ ์œผ๋กœ UC ๋ธŒ๋ผ์šฐ์ €๋Š” ๋ธŒ๋ผ์šฐ์ €๊ฐ€ ์‹œ์ž‘๋œ ํ›„ ์‹คํ–‰๋˜๋Š” ์š”์ฒญ์— ๋Œ€ํ•ด ์˜ฌ๋ฐ”๋ฅธ ํ˜•์‹์˜ ์‘๋‹ต์„ ์ œ๊ณตํ•˜๋Š” ๊ฒฝ์šฐ ์‚ฌ์šฉ์ž ์ƒํ˜ธ ์ž‘์šฉ ์—†์ด ๊ฐ•์ œ๋กœ ๋ฌด์–ธ๊ฐ€๋ฅผ ๋‹ค์šด๋กœ๋“œํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ์ ์— ์ฃผ๋ชฉํ•  ๊ฐ€์น˜๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ์ด๋ ‡๊ฒŒ ํ•˜๋ ค๋ฉด ์„œ๋ฒ„์™€์˜ ์ƒํ˜ธ ์ž‘์šฉ ํ”„๋กœํ† ์ฝœ์„ ๋” ์ž์„ธํžˆ ์—ฐ๊ตฌํ•ด์•ผ ํ•˜๋ฏ€๋กœ ๊ฐ€๋กœ์ฑ„๋Š” ์‘๋‹ต์„ ํŽธ์ง‘ํ•˜๊ณ  PDF ์ž‘์—…์„ ์œ„ํ•ด ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ๊ต์ฒดํ•˜๋Š” ๊ฒƒ์ด ๋” ์‰ฌ์šธ ๊ฒƒ์ด๋ผ๊ณ  ๊ฒฐ์ •ํ–ˆ์Šต๋‹ˆ๋‹ค.

๋”ฐ๋ผ์„œ ์‚ฌ์šฉ์ž๊ฐ€ ๋ธŒ๋ผ์šฐ์ €์—์„œ ์ง์ ‘ PDF๋ฅผ ์—ด๋ ค๊ณ  ํ•˜๋ฉด ํŠธ๋ž˜ํ”ฝ์—์„œ ๋‹ค์Œ ์š”์ฒญ์ด ํ‘œ์‹œ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

UC ๋ธŒ๋ผ์šฐ์ €์˜ ์ทจ์•ฝ์  ์ฐพ๊ธฐ

๋จผ์ € POST ์š”์ฒญ์ด ์žˆ์Šต๋‹ˆ๋‹ค. puds.ucweb.com/upgrade/index.xhtml๊ทธ ํ›„
PDF ๋ฐ Office ํ˜•์‹์„ ๋ณผ ์ˆ˜ ์žˆ๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ ํฌํ•จ๋œ ์•„์นด์ด๋ธŒ๊ฐ€ ๋‹ค์šด๋กœ๋“œ๋ฉ๋‹ˆ๋‹ค. ์ฒซ ๋ฒˆ์งธ ์š”์ฒญ์ด ์‹œ์Šคํ…œ์— ๋Œ€ํ•œ ์ •๋ณด(์ ์–ด๋„ ํ•„์š”ํ•œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์ œ๊ณตํ•˜๊ธฐ ์œ„ํ•œ ์•„ํ‚คํ…์ฒ˜)๋ฅผ ์ „์†กํ•˜๊ณ  ์ด์— ๋Œ€ํ•œ ์‘๋‹ต์œผ๋กœ ๋ธŒ๋ผ์šฐ์ €๊ฐ€ ๋‹ค์šด๋กœ๋“œํ•ด์•ผ ํ•˜๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์— ๋Œ€ํ•œ ์ผ๋ถ€ ์ •๋ณด(์ฃผ์†Œ ๋ฐ ๊ฐ€๋Šฅํ•œ ๊ฒฝ์šฐ)๋ฅผ ์ˆ˜์‹ ํ•œ๋‹ค๊ณ  ๊ฐ€์ •ํ•˜๋Š” ๊ฒƒ์ด ๋…ผ๋ฆฌ์ ์ž…๋‹ˆ๋‹ค. , ๋‹ค๋ฅธ ๊ฒƒ. ๋ฌธ์ œ๋Š” ์ด ์š”์ฒญ์ด ์•”ํ˜ธํ™”๋˜์–ด ์žˆ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์กฐ๊ฐ ์š”์ฒญ

๋‹ต๋ณ€ ์กฐ๊ฐ

UC ๋ธŒ๋ผ์šฐ์ €์˜ ์ทจ์•ฝ์  ์ฐพ๊ธฐ

UC ๋ธŒ๋ผ์šฐ์ €์˜ ์ทจ์•ฝ์  ์ฐพ๊ธฐ

๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์ž์ฒด๋Š” ZIP์œผ๋กœ ํŒจํ‚ค์ง€๋˜์–ด ์žˆ์œผ๋ฉฐ ์•”ํ˜ธํ™”๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

UC ๋ธŒ๋ผ์šฐ์ €์˜ ์ทจ์•ฝ์  ์ฐพ๊ธฐ

ํŠธ๋ž˜ํ”ฝ ๋ณตํ˜ธํ™” ์ฝ”๋“œ ๊ฒ€์ƒ‰

์„œ๋ฒ„ ์‘๋‹ต์„ ํ•ด๋…ํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. ํด๋ž˜์Šค ์ฝ”๋“œ๋ฅผ ์‚ดํŽด๋ณด์ž com.uc.deployment.UpgradeDeployService: ๋ฉ”์†Œ๋“œ์—์„œ ์‹œ์ž‘ ๋ช…๋ น ์ด๋™ com.uc.deployment.bx, ๊ทธ๋ฆฌ๊ณ  ๊ทธ๊ฒƒ๋ถ€ํ„ฐ com.uc.browser.core.dcfe:

    public final void e(l arg9) {
int v4_5;
String v3_1;
byte[] v3;
byte[] v1 = null;
if(arg9 == null) {
v3 = v1;
}
else {
v3_1 = arg9.iGX.ipR;
StringBuilder v4 = new StringBuilder("[");
v4.append(v3_1);
v4.append("]product:");
v4.append(arg9.iGX.ipR);
v4 = new StringBuilder("[");
v4.append(v3_1);
v4.append("]version:");
v4.append(arg9.iGX.iEn);
v4 = new StringBuilder("[");
v4.append(v3_1);
v4.append("]upgrade_type:");
v4.append(arg9.iGX.mMode);
v4 = new StringBuilder("[");
v4.append(v3_1);
v4.append("]force_flag:");
v4.append(arg9.iGX.iEo);
v4 = new StringBuilder("[");
v4.append(v3_1);
v4.append("]silent_mode:");
v4.append(arg9.iGX.iDQ);
v4 = new StringBuilder("[");
v4.append(v3_1);
v4.append("]silent_type:");
v4.append(arg9.iGX.iEr);
v4 = new StringBuilder("[");
v4.append(v3_1);
v4.append("]silent_state:");
v4.append(arg9.iGX.iEp);
v4 = new StringBuilder("[");
v4.append(v3_1);
v4.append("]silent_file:");
v4.append(arg9.iGX.iEq);
v4 = new StringBuilder("[");
v4.append(v3_1);
v4.append("]apk_md5:");
v4.append(arg9.iGX.iEl);
v4 = new StringBuilder("[");
v4.append(v3_1);
v4.append("]download_type:");
v4.append(arg9.mDownloadType);
v4 = new StringBuilder("[");
v4.append(v3_1);
v4.append("]download_group:");
v4.append(arg9.mDownloadGroup);
v4 = new StringBuilder("[");
v4.append(v3_1);
v4.append("]download_path:");
v4.append(arg9.iGH);
v4 = new StringBuilder("[");
v4.append(v3_1);
v4.append("]apollo_child_version:");
v4.append(arg9.iGX.iEx);
v4 = new StringBuilder("[");
v4.append(v3_1);
v4.append("]apollo_series:");
v4.append(arg9.iGX.iEw);
v4 = new StringBuilder("[");
v4.append(v3_1);
v4.append("]apollo_cpu_arch:");
v4.append(arg9.iGX.iEt);
v4 = new StringBuilder("[");
v4.append(v3_1);
v4.append("]apollo_cpu_vfp3:");
v4.append(arg9.iGX.iEv);
v4 = new StringBuilder("[");
v4.append(v3_1);
v4.append("]apollo_cpu_vfp:");
v4.append(arg9.iGX.iEu);
ArrayList v3_2 = arg9.iGX.iEz;
if(v3_2 != null && v3_2.size() != 0) {
Iterator v3_3 = v3_2.iterator();
while(v3_3.hasNext()) {
Object v4_1 = v3_3.next();
StringBuilder v5 = new StringBuilder("[");
v5.append(((au)v4_1).getName());
v5.append("]component_name:");
v5.append(((au)v4_1).getName());
v5 = new StringBuilder("[");
v5.append(((au)v4_1).getName());
v5.append("]component_ver_name:");
v5.append(((au)v4_1).aDA());
v5 = new StringBuilder("[");
v5.append(((au)v4_1).getName());
v5.append("]component_ver_code:");
v5.append(((au)v4_1).gBl);
v5 = new StringBuilder("[");
v5.append(((au)v4_1).getName());
v5.append("]component_req_type:");
v5.append(((au)v4_1).gBq);
}
}
j v3_4 = new j();
m.b(v3_4);
h v4_2 = new h();
m.b(v4_2);
ay v5_1 = new ay();
v3_4.hS("");
v3_4.setImsi("");
v3_4.hV("");
v5_1.bPQ = v3_4;
v5_1.bPP = v4_2;
v5_1.yr(arg9.iGX.ipR);
v5_1.gBF = arg9.iGX.mMode;
v5_1.gBI = arg9.iGX.iEz;
v3_2 = v5_1.gAr;
c.aBh();
v3_2.add(g.fs("os_ver", c.getRomInfo()));
v3_2.add(g.fs("processor_arch", com.uc.b.a.a.c.getCpuArch()));
v3_2.add(g.fs("cpu_arch", com.uc.b.a.a.c.Pb()));
String v4_3 = com.uc.b.a.a.c.Pd();
v3_2.add(g.fs("cpu_vfp", v4_3));
v3_2.add(g.fs("net_type", String.valueOf(com.uc.base.system.a.Jo())));
v3_2.add(g.fs("fromhost", arg9.iGX.iEm));
v3_2.add(g.fs("plugin_ver", arg9.iGX.iEn));
v3_2.add(g.fs("target_lang", arg9.iGX.iEs));
v3_2.add(g.fs("vitamio_cpu_arch", arg9.iGX.iEt));
v3_2.add(g.fs("vitamio_vfp", arg9.iGX.iEu));
v3_2.add(g.fs("vitamio_vfp3", arg9.iGX.iEv));
v3_2.add(g.fs("plugin_child_ver", arg9.iGX.iEx));
v3_2.add(g.fs("ver_series", arg9.iGX.iEw));
v3_2.add(g.fs("child_ver", r.aVw()));
v3_2.add(g.fs("cur_ver_md5", arg9.iGX.iEl));
v3_2.add(g.fs("cur_ver_signature", SystemHelper.getUCMSignature()));
v3_2.add(g.fs("upgrade_log", i.bjt()));
v3_2.add(g.fs("silent_install", String.valueOf(arg9.iGX.iDQ)));
v3_2.add(g.fs("silent_state", String.valueOf(arg9.iGX.iEp)));
v3_2.add(g.fs("silent_file", arg9.iGX.iEq));
v3_2.add(g.fs("silent_type", String.valueOf(arg9.iGX.iEr)));
v3_2.add(g.fs("cpu_archit", com.uc.b.a.a.c.Pc()));
v3_2.add(g.fs("cpu_set", SystemHelper.getCpuInstruction()));
boolean v4_4 = v4_3 == null || !v4_3.contains("neon") ? false : true;
v3_2.add(g.fs("neon", String.valueOf(v4_4)));
v3_2.add(g.fs("cpu_cores", String.valueOf(com.uc.b.a.a.c.Jl())));
v3_2.add(g.fs("ram_1", String.valueOf(com.uc.b.a.a.h.Po())));
v3_2.add(g.fs("totalram", String.valueOf(com.uc.b.a.a.h.OL())));
c.aBh();
v3_2.add(g.fs("rom_1", c.getRomInfo()));
v4_5 = e.getScreenWidth();
int v6 = e.getScreenHeight();
StringBuilder v7 = new StringBuilder();
v7.append(v4_5);
v7.append("*");
v7.append(v6);
v3_2.add(g.fs("ss", v7.toString()));
v3_2.add(g.fs("api_level", String.valueOf(Build$VERSION.SDK_INT)));
v3_2.add(g.fs("uc_apk_list", SystemHelper.getUCMobileApks()));
Iterator v4_6 = arg9.iGX.iEA.entrySet().iterator();
while(v4_6.hasNext()) {
Object v6_1 = v4_6.next();
v3_2.add(g.fs(((Map$Entry)v6_1).getKey(), ((Map$Entry)v6_1).getValue()));
}
v3 = v5_1.toByteArray();
}
if(v3 == null) {
this.iGY.iGI.a(arg9, "up_encode", "yes", "fail");
return;
}
v4_5 = this.iGY.iGw ? 0x1F : 0;
if(v3 == null) {
}
else {
v3 = g.i(v4_5, v3);
if(v3 == null) {
}
else {
v1 = new byte[v3.length + 16];
byte[] v6_2 = new byte[16];
Arrays.fill(v6_2, 0);
v6_2[0] = 0x5F;
v6_2[1] = 0;
v6_2[2] = ((byte)v4_5);
v6_2[3] = -50;
System.arraycopy(v6_2, 0, v1, 0, 16);
System.arraycopy(v3, 0, v1, 16, v3.length);
}
}
if(v1 == null) {
this.iGY.iGI.a(arg9, "up_encrypt", "yes", "fail");
return;
}
if(TextUtils.isEmpty(this.iGY.mUpgradeUrl)) {
this.iGY.iGI.a(arg9, "up_url", "yes", "fail");
return;
}
StringBuilder v0 = new StringBuilder("[");
v0.append(arg9.iGX.ipR);
v0.append("]url:");
v0.append(this.iGY.mUpgradeUrl);
com.uc.browser.core.d.c.i v0_1 = this.iGY.iGI;
v3_1 = this.iGY.mUpgradeUrl;
com.uc.base.net.e v0_2 = new com.uc.base.net.e(new com.uc.browser.core.d.c.i$a(v0_1, arg9));
v3_1 = v3_1.contains("?") ? v3_1 + "&dataver=pb" : v3_1 + "?dataver=pb";
n v3_5 = v0_2.uc(v3_1);
m.b(v3_5, false);
v3_5.setMethod("POST");
v3_5.setBodyProvider(v1);
v0_2.b(v3_5);
this.iGY.iGI.a(arg9, "up_null", "yes", "success");
this.iGY.iGI.b(arg9);
}

์—ฌ๊ธฐ์„œ๋Š” POST ์š”์ฒญ์ด ํ˜•์„ฑ๋˜๋Š” ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๋Š” 16๋ฐ”์ดํŠธ ๋ฐฐ์—ด ์ƒ์„ฑ๊ณผ ๊ทธ ์ฑ„์šฐ๊ธฐ(0x5F, 0, 0x1F, -50 (=0xCE))์— ์ฃผ์˜๋ฅผ ๊ธฐ์šธ์˜€์Šต๋‹ˆ๋‹ค. ์œ„ ์š”์ฒญ์—์„œ ๋ณธ ๋‚ด์šฉ๊ณผ ์ผ์น˜ํ•ฉ๋‹ˆ๋‹ค.

๊ฐ™์€ ํด๋ž˜์Šค์—์„œ ๋˜ ๋‹ค๋ฅธ ํฅ๋ฏธ๋กœ์šด ๋ฉ”์„œ๋“œ๊ฐ€ ์žˆ๋Š” ์ค‘์ฒฉ ํด๋ž˜์Šค๋ฅผ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

        public final void a(l arg10, byte[] arg11) {
f v0 = this.iGQ;
StringBuilder v1 = new StringBuilder("[");
v1.append(arg10.iGX.ipR);
v1.append("]:UpgradeSuccess");
byte[] v1_1 = null;
if(arg11 == null) {
}
else if(arg11.length < 16) {
}
else {
if(arg11[0] != 0x60 && arg11[3] != 0xFFFFFFD0) {
goto label_57;
}
int v3 = 1;
int v5 = arg11[1] == 1 ? 1 : 0;
if(arg11[2] != 1 && arg11[2] != 11) {
if(arg11[2] == 0x1F) {
}
else {
v3 = 0;
}
}
byte[] v7 = new byte[arg11.length - 16];
System.arraycopy(arg11, 16, v7, 0, v7.length);
if(v3 != 0) {
v7 = g.j(arg11[2], v7);
}
if(v7 == null) {
goto label_57;
}
if(v5 != 0) {
v1_1 = g.P(v7);
goto label_57;
}
v1_1 = v7;
}
label_57:
if(v1_1 == null) {
v0.iGY.iGI.a(arg10, "up_decrypt", "yes", "fail");
return;
}
q v11 = g.b(arg10, v1_1);
if(v11 == null) {
v0.iGY.iGI.a(arg10, "up_decode", "yes", "fail");
return;
}
if(v0.iGY.iGt) {
v0.d(arg10);
}
if(v0.iGY.iGo != null) {
v0.iGY.iGo.a(0, ((o)v11));
}
if(v0.iGY.iGs) {
v0.iGY.a(((o)v11));
v0.iGY.iGI.a(v11, "up_silent", "yes", "success");
v0.iGY.iGI.a(v11);
return;
}
v0.iGY.iGI.a(v11, "up_silent", "no", "success");
}
}

์ด ๋ฉ”์„œ๋“œ๋Š” ๋ฐ”์ดํŠธ ๋ฐฐ์—ด์„ ์ž…๋ ฅ์œผ๋กœ ์‚ฌ์šฉํ•˜๊ณ  0๋ฐ”์ดํŠธ๊ฐ€ 60x0์ธ์ง€, ์„ธ ๋ฒˆ์งธ ๋ฐ”์ดํŠธ๊ฐ€ 0xD1์ธ์ง€, ๋‘ ๋ฒˆ์งธ ๋ฐ”์ดํŠธ๊ฐ€ 11, 0 ๋˜๋Š” 1x0F์ธ์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค. ์„œ๋ฒ„์˜ ์‘๋‹ต์„ ์‚ดํŽด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. 60๋ฐ”์ดํŠธ๋Š” 0x1, ๋‘ ๋ฒˆ์งธ ๋ฐ”์ดํŠธ๋Š” 0x60F, ์„ธ ๋ฒˆ์งธ ๋ฐ”์ดํŠธ๋Š” XNUMXxXNUMX์ž…๋‹ˆ๋‹ค. ์šฐ๋ฆฌ์—๊ฒŒ ๊ผญ ํ•„์š”ํ•œ ๊ฒƒ ๊ฐ™๊ตฐ์š”. ํ–‰(์˜ˆ: "up_decrypt")์œผ๋กœ ํŒ๋‹จํ•˜๋ฉด ์„œ๋ฒ„์˜ ์‘๋‹ต์„ ํ•ด๋…ํ•˜๋Š” ๋ฉ”์„œ๋“œ๊ฐ€ ์—ฌ๊ธฐ์—์„œ ํ˜ธ์ถœ๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
๋ฐฉ๋ฒ•์œผ๋กœ ๋„˜์–ด ๊ฐ‘์‹œ๋‹ค gj. ์ฒซ ๋ฒˆ์งธ ์ธ์ˆ˜๋Š” ์˜คํ”„์…‹ 2(์˜ˆ: ์šฐ๋ฆฌ์˜ ๊ฒฝ์šฐ 0x1F)์— ์žˆ๋Š” ๋ฐ”์ดํŠธ์ด๊ณ  ๋‘ ๋ฒˆ์งธ ์ธ์ˆ˜๋Š” ์˜คํ”„์…‹์ด ์—†๋Š” ์„œ๋ฒ„ ์‘๋‹ต์ž…๋‹ˆ๋‹ค.
์ฒ˜์Œ 16๋ฐ”์ดํŠธ.

     public static byte[] j(int arg1, byte[] arg2) {
if(arg1 == 1) {
arg2 = c.c(arg2, c.adu);
}
else if(arg1 == 11) {
arg2 = m.aF(arg2);
}
else if(arg1 != 0x1F) {
}
else {
arg2 = EncryptHelper.decrypt(arg2);
}
return arg2;
}

๋ถ„๋ช…ํžˆ ์—ฌ๊ธฐ์„œ๋Š” ์•”ํ˜ธ ํ•ด๋… ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์„ ํƒํ•˜๊ณ 
0x1F์™€ ๋™์ผํ•œ ๊ฒฝ์šฐ๋Š” ์„ธ ๊ฐ€์ง€ ๊ฐ€๋Šฅํ•œ ์˜ต์…˜ ์ค‘ ํ•˜๋‚˜๋ฅผ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค.

์šฐ๋ฆฌ๋Š” ๊ณ„์†ํ•ด์„œ ์ฝ”๋“œ๋ฅผ ๋ถ„์„ํ•ฉ๋‹ˆ๋‹ค. ๋ช‡ ๋ฒˆ์˜ ์ ํ”„ ํ›„์— ์šฐ๋ฆฌ๋Š” ์„ค๋ช…์ด ํ•„์š” ์—†๋Š” ์ด๋ฆ„์„ ๊ฐ€์ง„ ๋ฉ”์†Œ๋“œ์— ๋„๋‹ฌํ•˜๊ฒŒ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. decryptBytesByKey.

์—ฌ๊ธฐ์—์„œ๋Š” ์‘๋‹ต์—์„œ ๋‘ ๋ฐ”์ดํŠธ๊ฐ€ ๋” ๋ถ„๋ฆฌ๋˜๊ณ  ๊ทธ๋กœ๋ถ€ํ„ฐ ๋ฌธ์ž์—ด์ด ์–ป์–ด์ง‘๋‹ˆ๋‹ค. ์ด๋Ÿฐ ๋ฐฉ์‹์œผ๋กœ ๋ฉ”์‹œ์ง€๋ฅผ ํ•ด๋…ํ•˜๊ธฐ ์œ„ํ•œ ํ‚ค๊ฐ€ ์„ ํƒ๋œ๋‹ค๋Š” ๊ฒƒ์€ ๋ถ„๋ช…ํ•ฉ๋‹ˆ๋‹ค.

    private static byte[] decryptBytesByKey(byte[] bytes) {
byte[] v0 = null;
if(bytes != null) {
try {
if(bytes.length < EncryptHelper.PREFIX_BYTES_SIZE) {
}
else if(bytes.length == EncryptHelper.PREFIX_BYTES_SIZE) {
return v0;
}
else {
byte[] prefix = new byte[EncryptHelper.PREFIX_BYTES_SIZE];  // 2 ะฑะฐะนั‚ะฐ
System.arraycopy(bytes, 0, prefix, 0, prefix.length);
String keyId = c.ayR().d(ByteBuffer.wrap(prefix).getShort()); // ะ’ั‹ะฑะพั€ ะบะปัŽั‡ะฐ
if(keyId == null) {
return v0;
}
else {
a v2 = EncryptHelper.ayL();
if(v2 == null) {
return v0;
}
else {
byte[] enrypted = new byte[bytes.length - EncryptHelper.PREFIX_BYTES_SIZE];
System.arraycopy(bytes, EncryptHelper.PREFIX_BYTES_SIZE, enrypted, 0, enrypted.length);
return v2.l(keyId, enrypted);
}
}
}
}
catch(SecException v7_1) {
EncryptHelper.handleDecryptException(((Throwable)v7_1), v7_1.getErrorCode());
return v0;
}
catch(Throwable v7) {
EncryptHelper.handleDecryptException(v7, 2);
return v0;
}
}
return v0;
}

์•ž์„ ๋‚ด๋‹ค๋ณด๋ฉด ์ด ๋‹จ๊ณ„์—์„œ๋Š” ์•„์ง ํ‚ค๋ฅผ ์–ป์ง€ ๋ชปํ•˜๊ณ  ํ‚ค์˜ "์‹๋ณ„์ž"๋งŒ ์–ป์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์—ด์‡ ๋ฅผ ์–ป๋Š” ๋ฐฉ๋ฒ•์€ ์กฐ๊ธˆ ๋” ๋ณต์žกํ•ฉ๋‹ˆ๋‹ค.

๋‹ค์Œ ๋ฐฉ๋ฒ•์—์„œ๋Š” ๊ธฐ์กด ๋งค๊ฐœ๋ณ€์ˆ˜์— 16๊ฐœ์˜ ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ๋” ์ถ”๊ฐ€ํ•˜์—ฌ ๊ทธ ์ค‘ XNUMX๊ฐœ(๋งค์ง ๋„˜๋ฒ„ XNUMX, ํ‚ค ์‹๋ณ„์ž, ์•”ํ˜ธํ™”๋œ ๋ฐ์ดํ„ฐ, ์ดํ•ดํ•  ์ˆ˜ ์—†๋Š” ๋ฌธ์ž์—ด(์—ฌ๊ธฐ์„œ๋Š” ๋น„์–ด ์žˆ์Œ))๋ฅผ ๋งŒ๋“ญ๋‹ˆ๋‹ค.

    public final byte[] l(String keyId, byte[] encrypted) throws SecException {
return this.ayJ().staticBinarySafeDecryptNoB64(16, keyId, encrypted, "");
}

์ผ๋ จ์˜ ์ „ํ™˜ ํ›„์— ์šฐ๋ฆฌ๋Š” ๋ฐฉ๋ฒ•์— ๋„๋‹ฌํ•ฉ๋‹ˆ๋‹ค. staticBinarySafeDecryptNoB64 ์ธํ„ฐํŽ˜์ด์Šค com.alibaba.wireless.security.open.staticdataencrypt.IStaticDataEncryptComponent. ์ด ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„ํ•˜๋Š” ๊ธฐ๋ณธ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ฝ”๋“œ์—๋Š” ํด๋ž˜์Šค๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ํŒŒ์ผ์— ๊ทธ๋Ÿฌํ•œ ํด๋ž˜์Šค๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค lib/armeabi-v7a/libsgmain.so, ์‹ค์ œ๋กœ๋Š” .so๊ฐ€ ์•„๋‹ˆ๋ผ .jar์ž…๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๊ฐ€ ๊ด€์‹ฌ ์žˆ๋Š” ๋ฉ”์†Œ๋“œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๊ตฌํ˜„๋ฉ๋‹ˆ๋‹ค.

package com.alibaba.wireless.security.a.i;
// ...
public class a implements IStaticDataEncryptComponent {
private ISecurityGuardPlugin a;
// ...
private byte[] a(int mode, int magicInt, int xzInt, String keyId, byte[] encrypted, String magicString) {
return this.a.getRouter().doCommand(10601, new Object[]{Integer.valueOf(mode), Integer.valueOf(magicInt), Integer.valueOf(xzInt), keyId, encrypted, magicString});
}
// ...
private byte[] b(int magicInt, String keyId, byte[] encrypted, String magicString) {
return this.a(2, magicInt, 0, keyId, encrypted, magicString);
}
// ...
public byte[] staticBinarySafeDecryptNoB64(int magicInt, String keyId, byte[] encrypted, String magicString) throws SecException {
if(keyId != null && keyId.length() > 0 && magicInt >= 0 && magicInt < 19 && encrypted != null && encrypted.length > 0) {
return this.b(magicInt, keyId, encrypted, magicString);
}
throw new SecException("", 301);
}
//...
}

์—ฌ๊ธฐ์„œ ๋งค๊ฐœ๋ณ€์ˆ˜ ๋ชฉ๋ก์€ ๋‘ ๊ฐœ์˜ ์ •์ˆ˜(2์™€ 0)๋กœ ๋ณด์™„๋ฉ๋‹ˆ๋‹ค.
๋ชจ๋“  ๊ฒƒ, 2๋Š” ๋ฉ”์„œ๋“œ์—์„œ์™€ ๊ฐ™์ด ์•”ํ˜ธ ํ•ด๋…์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. doFinal ์‹œ์Šคํ…œ ํด๋ž˜์Šค javax.crypto.Cipher. ๊ทธ๋ฆฌ๊ณ  ์ด ๋ชจ๋“  ๊ฒƒ์€ ๋ฒˆํ˜ธ 10601์„ ๊ฐ€์ง„ ํŠน์ • ๋ผ์šฐํ„ฐ๋กœ ์ „์†ก๋ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ๋ถ„๋ช…ํžˆ ๋ช…๋ น ๋ฒˆํ˜ธ์ž…๋‹ˆ๋‹ค.

๋‹ค์Œ ์ „ํ™˜ ์ฒด์ธ ํ›„์— ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„ํ•˜๋Š” ํด๋ž˜์Šค๋ฅผ ์ฐพ์Šต๋‹ˆ๋‹ค. IRouterComponent ๋ฐ ๋ฐฉ๋ฒ• do๋ช…๋ น:

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);
}
}

๊ทธ๋ฆฌ๊ณ  ์ˆ˜์—…๋„ ํ•˜๊ณ  JNIC๋„์„œ๊ด€, ๋„ค์ดํ‹ฐ๋ธŒ ๋ฉ”์†Œ๋“œ๊ฐ€ ์„ ์–ธ๋จ 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 ๋ธŒ๋ผ์šฐ์ €์˜ ์ทจ์•ฝ์  ์ฐพ๊ธฐ

๊ทธ๋Ÿฌ๋‚˜ ์ด๋Š” ํ•„์š”ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ELF ํŒŒ์ผ์„ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ๋กœ๋“œํ•˜๊ณ  ๋ถ„์„ํ•˜๋ ค๋ฉด ํ”„๋กœ๊ทธ๋žจ ํ—ค๋” ํ…Œ์ด๋ธ”์ด๋ฉด ์ถฉ๋ถ„ํ•ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์„น์…˜ ํ…Œ์ด๋ธ”์„ ์‚ญ์ œํ•˜๊ณ  ํ—ค๋”์˜ ํ•ด๋‹น ํ•„๋“œ๋ฅผ XNUMX์œผ๋กœ ๋งŒ๋“ญ๋‹ˆ๋‹ค.

UC ๋ธŒ๋ผ์šฐ์ €์˜ ์ทจ์•ฝ์  ์ฐพ๊ธฐ

IDA์—์„œ ํŒŒ์ผ์„ ๋‹ค์‹œ ์—ฝ๋‹ˆ๋‹ค.

Java ์ฝ”๋“œ์—์„œ ๋„ค์ดํ‹ฐ๋ธŒ๋กœ ์„ ์–ธ๋œ ๋ฉ”์†Œ๋“œ์˜ ๊ตฌํ˜„์ด ๋„ค์ดํ‹ฐ๋ธŒ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์˜ ์ •ํ™•ํžˆ ์–ด๋””์— ์žˆ๋Š”์ง€ Java ๊ฐ€์ƒ ๋จธ์‹ ์— ์•Œ๋ ค์ฃผ๋Š” ๋ฐฉ๋ฒ•์—๋Š” ๋‘ ๊ฐ€์ง€๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์ฒซ ๋ฒˆ์งธ๋Š” ์ข… ์ด๋ฆ„์„ ์ง€์ •ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. Java_package_name_ClassName_MethodName.

๋‘ ๋ฒˆ์งธ๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ๋กœ๋“œํ•  ๋•Œ ๋“ฑ๋กํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค(ํ•จ์ˆ˜์—์„œ JNI_OnLoad)
ํ•จ์ˆ˜ ํ˜ธ์ถœ์„ ์‚ฌ์šฉํ•˜์—ฌ ๋“ฑ๋ก์›์ฃผ๋ฏผ.

์šฐ๋ฆฌ์˜ ๊ฒฝ์šฐ ์ฒซ ๋ฒˆ์งธ ๋ฐฉ๋ฒ•์„ ์‚ฌ์šฉํ•˜๋ฉด ์ด๋ฆ„์€ ๋‹ค์Œ๊ณผ ๊ฐ™์•„์•ผ ํ•ฉ๋‹ˆ๋‹ค. Java_com_taobao_wireless_security_adapter_JNICLibrary_doCommandNative.

๋‚ด๋ณด๋‚ธ ํ•จ์ˆ˜ ์ค‘์—๋Š” ํ•ด๋‹น ํ•จ์ˆ˜๊ฐ€ ์—†์œผ๋ฏ€๋กœ ํ˜ธ์ถœ์„ ์ฐพ์•„์•ผ ํ•จ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. ๋“ฑ๋ก์›์ฃผ๋ฏผ.
ํ•จ์ˆ˜๋กœ ๊ฐ€๋ณด์ž JNI_OnLoad ๊ทธ๋ฆฌ๊ณ  ์šฐ๋ฆฌ๋Š” ์ด ์‚ฌ์ง„์„ ๋ด…๋‹ˆ๋‹ค:

UC ๋ธŒ๋ผ์šฐ์ €์˜ ์ทจ์•ฝ์  ์ฐพ๊ธฐ

์—ฌ๊ธฐ์„œ ๋ฌด์Šจ ์ผ์ด ์ผ์–ด๋‚˜๊ณ  ์žˆ๋Š” ๊ฑธ๊นŒ์š”? ์–ธ๋œป ๋ณด๊ธฐ์— ํ•จ์ˆ˜์˜ ์‹œ์ž‘๊ณผ ๋์€ ARM ์•„ํ‚คํ…์ฒ˜์—์„œ ์ผ๋ฐ˜์ ์ž…๋‹ˆ๋‹ค. ์Šคํƒ์˜ ์ฒซ ๋ฒˆ์งธ ๋ช…๋ น์–ด๋Š” ํ•จ์ˆ˜๊ฐ€ ์ž‘์—…์— ์‚ฌ์šฉํ•  ๋ ˆ์ง€์Šคํ„ฐ(์ด ๊ฒฝ์šฐ R0, R1 ๋ฐ R2)์˜ ๋‚ด์šฉ๊ณผ ํ•จ์ˆ˜์˜ ๋ฐ˜ํ™˜ ์ฃผ์†Œ๊ฐ€ ํฌํ•จ๋œ LR ๋ ˆ์ง€์Šคํ„ฐ์˜ ๋‚ด์šฉ์„ ์ €์žฅํ•ฉ๋‹ˆ๋‹ค. . ๋งˆ์ง€๋ง‰ ๋ช…๋ น์–ด๋Š” ์ €์žฅ๋œ ๋ ˆ์ง€์Šคํ„ฐ๋ฅผ ๋ณต์›ํ•˜๊ณ  ๋ฐ˜ํ™˜ ์ฃผ์†Œ๋Š” ์ฆ‰์‹œ PC ๋ ˆ์ง€์Šคํ„ฐ์— ๋ฐฐ์น˜๋˜๋ฏ€๋กœ ํ•จ์ˆ˜์—์„œ ๋ฐ˜ํ™˜๋ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์ž์„ธํžˆ ์‚ดํŽด๋ณด๋ฉด ๋์—์„œ ๋‘ ๋ฒˆ์งธ ๋ช…๋ น์–ด๊ฐ€ ์Šคํƒ์— ์ €์žฅ๋œ ๋ฐ˜ํ™˜ ์ฃผ์†Œ๋ฅผ ๋ณ€๊ฒฝํ•œ๋‹ค๋Š” ๊ฒƒ์„ ์•Œ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋‚˜์ค‘์— ์–ด๋–ป๊ฒŒ ๋ ์ง€ ๊ณ„์‚ฐํ•ด ๋ด…์‹œ๋‹ค
์ฝ”๋“œ ์‹คํ–‰. ํŠน์ • ์ฃผ์†Œ 1xB0์ด R130์— ๋กœ๋“œ๋˜๊ณ  ๊ฑฐ๊ธฐ์—์„œ 5๋ฅผ ๋บ€ ๋‹ค์Œ R0์œผ๋กœ ์ „์†ก๋˜๊ณ  0x10์ด ์ถ”๊ฐ€๋ฉ๋‹ˆ๋‹ค. 0xB13B๋กœ ๋‚˜ํƒ€๋‚ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ IDA๋Š” ๋งˆ์ง€๋ง‰ ๋ช…๋ น์–ด๊ฐ€ ์ •์ƒ์ ์ธ ํ•จ์ˆ˜ ๋ฆฌํ„ด์ด๋ผ๊ณ  ์ƒ๊ฐํ•˜์ง€๋งŒ ์‹ค์ œ๋กœ๋Š” ๊ณ„์‚ฐ๋œ ์ฃผ์†Œ 0xB13B๋กœ ๊ฐ€๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์—ฌ๊ธฐ์„œ ARM ํ”„๋กœ์„ธ์„œ์—๋Š” ARM๊ณผ Thumb์ด๋ผ๋Š” ๋‘ ๊ฐ€์ง€ ๋ชจ๋“œ์™€ ๋‘ ๊ฐ€์ง€ ๋ช…๋ น์–ด ์„ธํŠธ๊ฐ€ ์žˆ๋‹ค๋Š” ์ ์„ ๊ธฐ์–ตํ•  ๊ฐ€์น˜๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์ฃผ์†Œ์˜ ์ตœํ•˜์œ„ ๋น„ํŠธ๋Š” ์–ด๋–ค ๋ช…๋ น์–ด ์„ธํŠธ๊ฐ€ ์‚ฌ์šฉ๋˜๊ณ  ์žˆ๋Š”์ง€ ํ”„๋กœ์„ธ์„œ์— ์•Œ๋ ค์ค๋‹ˆ๋‹ค. ์ฆ‰, ์‹ค์ œ ์ฃผ์†Œ๋Š” 0xB13A์ด๊ณ  ์ตœํ•˜์œ„ ๋น„ํŠธ ์ค‘ ํ•˜๋‚˜๋Š” Thumb ๋ชจ๋“œ๋ฅผ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค.

์œ ์‚ฌํ•œ "์–ด๋Œ‘ํ„ฐ"๊ฐ€ ์ด ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์˜ ๊ฐ ๊ธฐ๋Šฅ ์‹œ์ž‘ ๋ถ€๋ถ„์— ์ถ”๊ฐ€๋˜์—ˆ์œผ๋ฉฐ
์“ฐ๋ ˆ๊ธฐ ์ฝ”๋“œ. ์šฐ๋ฆฌ๋Š” ๋” ์ด์ƒ ์ž์„ธํžˆ ์„ค๋ช…ํ•˜์ง€ ์•Š์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๋Š” ๋‹จ์ง€ ๊ธฐ์–ตํ•ฉ๋‹ˆ๋‹ค
๊ฑฐ์˜ ๋ชจ๋“  ๊ธฐ๋Šฅ์˜ ์‹ค์ œ ์‹œ์ž‘์€ ์กฐ๊ธˆ ๋” ๋ฉ€๋ฆฌ ๋–จ์–ด์ ธ ์žˆ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์ฝ”๋“œ๊ฐ€ ๋ช…์‹œ์ ์œผ๋กœ 0xB13A๋กœ ์ ํ”„ํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— IDA ์ž์ฒด์—์„œ๋Š” ํ•ด๋‹น ์ฝ”๋“œ๊ฐ€ ์ด ์œ„์น˜์— ์žˆ๋‹ค๋Š” ๊ฒƒ์„ ์ธ์‹ํ•˜์ง€ ๋ชปํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ฐ™์€ ์ด์œ ๋กœ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์— ์žˆ๋Š” ๋Œ€๋ถ€๋ถ„์˜ ์ฝ”๋“œ๋ฅผ ์ฝ”๋“œ๋กœ ์ธ์‹ํ•˜์ง€ ๋ชปํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋ถ„์„์ด ๋‹ค์†Œ ์–ด๋ ต๋‹ค. ์šฐ๋ฆฌ๋Š” ์ด๊ฒƒ์ด ์ฝ”๋“œ๋ผ๊ณ  IDA์— ์•Œ๋ฆฝ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ผ์ด ์ผ์–ด๋‚ฉ๋‹ˆ๋‹ค.

UC ๋ธŒ๋ผ์šฐ์ €์˜ ์ทจ์•ฝ์  ์ฐพ๊ธฐ

ํ…Œ์ด๋ธ”์€ ๋ถ„๋ช…ํžˆ 0xB144์—์„œ ์‹œ์ž‘๋ฉ๋‹ˆ๋‹ค. sub_494C์—๋Š” ๋ฌด์—‡์ด ์žˆ๋‚˜์š”?

UC ๋ธŒ๋ผ์šฐ์ €์˜ ์ทจ์•ฝ์  ์ฐพ๊ธฐ

LR ๋ ˆ์ง€์Šคํ„ฐ์—์„œ ์ด ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•˜๋ฉด ์•ž์„œ ์–ธ๊ธ‰ํ•œ ํ…Œ์ด๋ธ”(0xB144)์˜ ์ฃผ์†Œ๋ฅผ ์–ป์Šต๋‹ˆ๋‹ค. R0 - ์ด ํ…Œ์ด๋ธ”์˜ ์ธ๋ฑ์Šค์ž…๋‹ˆ๋‹ค. ์ฆ‰, ํ…Œ์ด๋ธ”์—์„œ ๊ฐ’์„ ๊ฐ€์ ธ์™€ LR์— ์ถ”๊ฐ€ํ•˜๋ฉด ๊ฒฐ๊ณผ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.
๊ฐˆ ์ฃผ์†Œ. ๊ณ„์‚ฐํ•ด ๋ด…์‹œ๋‹ค: 0xB144 + [0xB144 + 8* 4] = 0xB144 + 0x120 = 0xB264. ์ˆ˜์‹ ๋œ ์ฃผ์†Œ๋กœ ์ด๋™ํ•˜์—ฌ ๋ฌธ์ž ๊ทธ๋Œ€๋กœ ๋ช‡ ๊ฐ€์ง€ ์œ ์šฉํ•œ ์ง€์นจ์„ ํ™•์ธํ•œ ๋‹ค์Œ ๋‹ค์‹œ 0xB140์œผ๋กœ ์ด๋™ํ•ฉ๋‹ˆ๋‹ค.

UC ๋ธŒ๋ผ์šฐ์ €์˜ ์ทจ์•ฝ์  ์ฐพ๊ธฐ

์ด์ œ ํ…Œ์ด๋ธ”์˜ ์ธ๋ฑ์Šค 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์œผ๋กœ์˜ ์ „ํ™˜์„ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.

UC ๋ธŒ๋ผ์šฐ์ €์˜ ์ทจ์•ฝ์  ์ฐพ๊ธฐ

IDA๋Š” ์ด๋ฒˆ์—๋„ ์ด ์˜์—ญ์„ ์ฝ”๋“œ๋กœ ์ธ์‹ํ•˜์ง€ ๋ชปํ–ˆ์Šต๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๋Š” ๊ทธ๋…€๋ฅผ ๋•๊ณ  ๊ทธ๊ณณ์—์„œ ๋˜ ๋‹ค๋ฅธ ๋””์ž์ธ์„ ๋ด…๋‹ˆ๋‹ค.

UC ๋ธŒ๋ผ์šฐ์ €์˜ ์ทจ์•ฝ์  ์ฐพ๊ธฐ

BLX ์ดํ›„์˜ ์ง€์นจ์€ ๊ทธ๋‹ค์ง€ ์˜๋ฏธ๊ฐ€ ์—†๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ์ผ์ข…์˜ ์น˜ํ™˜๊ณผ ๋น„์Šทํ•ฉ๋‹ˆ๋‹ค. sub_4964๋ฅผ ์‚ดํŽด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

UC ๋ธŒ๋ผ์šฐ์ €์˜ ์ทจ์•ฝ์  ์ฐพ๊ธฐ

์‹ค์ œ๋กœ ์—ฌ๊ธฐ์„œ๋Š” LR์— ์žˆ๋Š” ์ฃผ์†Œ์—์„œ dword๋ฅผ ๊ฐ€์ ธ์™€ ์ด ์ฃผ์†Œ์— ์ถ”๊ฐ€ํ•œ ๋‹ค์Œ ๊ฒฐ๊ณผ ์ฃผ์†Œ์˜ ๊ฐ’์„ ๊ฐ€์ ธ์™€ ์Šคํƒ์— ๋„ฃ์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ ํ•จ์ˆ˜์—์„œ ๋ฐ˜ํ™˜๋œ ํ›„ ๋™์ผํ•œ ์˜คํ”„์…‹์„ ๊ฑด๋„ˆ๋›ฐ๋„๋ก LR์— 4๊ฐ€ ์ถ”๊ฐ€๋ฉ๋‹ˆ๋‹ค. ๊ทธ ํ›„ POP {R1} ๋ช…๋ น์€ ์Šคํƒ์—์„œ ๊ฒฐ๊ณผ ๊ฐ’์„ ๊ฐ€์ ธ์˜ต๋‹ˆ๋‹ค. ์ฃผ์†Œ 0xB4BA + 0xEA = 0xB5A4์— ์œ„์น˜ํ•œ ๊ฒƒ์„ ๋ณด๋ฉด ์ฃผ์†Œ ํ…Œ์ด๋ธ”๊ณผ ๋น„์Šทํ•œ ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค:

UC ๋ธŒ๋ผ์šฐ์ €์˜ ์ทจ์•ฝ์  ์ฐพ๊ธฐ

์ด ๋””์ž์ธ์„ ํŒจ์น˜ํ•˜๋ ค๋ฉด ์ฝ”๋“œ์—์„œ ๋‘ ๊ฐœ์˜ ๋งค๊ฐœ๋ณ€์ˆ˜, ์ฆ‰ ์˜คํ”„์…‹๊ณผ ๊ฒฐ๊ณผ๋ฅผ ๋„ฃ์„ ๋ ˆ์ง€์Šคํ„ฐ ๋ฒˆํ˜ธ๋ฅผ ๊ฐ€์ ธ์™€์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๊ฐ€๋Šฅํ•œ ๊ฐ ๋“ฑ๋ก์— ๋Œ€ํ•ด ๋ฏธ๋ฆฌ ์ฝ”๋“œ๋ฅผ ์ค€๋น„ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

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 ๋ธŒ๋ผ์šฐ์ €์˜ ์ทจ์•ฝ์  ์ฐพ๊ธฐ

์ด๋ฏธ ์–ธ๊ธ‰๋œ ๊ตฌ์กฐ ์™ธ์—๋„ ์ฝ”๋“œ์—๋Š” ๋‹ค์Œ์ด ํฌํ•จ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.

UC ๋ธŒ๋ผ์šฐ์ €์˜ ์ทจ์•ฝ์  ์ฐพ๊ธฐ

์ด์ „ ์‚ฌ๋ก€์™€ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ BLX ๋ช…๋ น์–ด ๋’ค์— ์˜คํ”„์…‹์ด ์žˆ์Šต๋‹ˆ๋‹ค.

UC ๋ธŒ๋ผ์šฐ์ €์˜ ์ทจ์•ฝ์  ์ฐพ๊ธฐ

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"

์Šคํฌ๋ฆฝํŠธ ์‹คํ–‰ ๊ฒฐ๊ณผ:

UC ๋ธŒ๋ผ์šฐ์ €์˜ ์ทจ์•ฝ์  ์ฐพ๊ธฐ

ํ•จ์ˆ˜์˜ ๋ชจ๋“  ๊ฒƒ์ด ํŒจ์น˜๋˜๋ฉด 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 ํด๋ž˜์Šค ์ด๋ฆ„์ด ๋ถ„๋ช…ํžˆ ํ•ด๋…๋˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ํ•จ์ˆ˜์˜ ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ๋Š” ์•”ํ˜ธํ™”๋œ ๋ฐ์ดํ„ฐ์™€ ์œ ์‚ฌํ•œ ๋ฐ์ดํ„ฐ์— ๋Œ€ํ•œ ํฌ์ธํ„ฐ, ํŠน์ • ๋ฒ„ํผ ๋ฐ ์ˆซ์ž๊ฐ€ ์ „๋‹ฌ๋ฉ๋‹ˆ๋‹ค. ๋ถ„๋ช…ํžˆ ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•œ ํ›„์—๋Š” ํ•จ์ˆ˜์— ์ „๋‹ฌ๋˜๊ธฐ ๋•Œ๋ฌธ์— ๋ฒ„ํผ์— ํ•ด๋…๋œ ๋ผ์ธ์ด ์žˆ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ํด๋ž˜์Šค ์ฐพ๊ธฐ, ํด๋ž˜์Šค ์ด๋ฆ„์„ ๋‘ ๋ฒˆ์งธ ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์ˆซ์ž๋Š” ๋ฒ„ํผ์˜ ํฌ๊ธฐ ๋˜๋Š” ์ค„์˜ ๊ธธ์ด์ž…๋‹ˆ๋‹ค. ํด๋ž˜์Šค ์ด๋ฆ„์„ ํ•ด๋…ํ•ด ๋ด…์‹œ๋‹ค. ํด๋ž˜์Šค ์ด๋ฆ„์€ ์šฐ๋ฆฌ๊ฐ€ ์˜ฌ๋ฐ”๋ฅธ ๋ฐฉํ–ฅ์œผ๋กœ ๊ฐ€๊ณ  ์žˆ๋Š”์ง€ ์•Œ๋ ค์ค„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์—์„œ ๋ฌด์Šจ ์ผ์ด ์ผ์–ด๋‚˜๋Š”์ง€ ์ž์„ธํžˆ ์‚ดํŽด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. sub_73E24.

int __fastcall sub_73E56(unsigned __int8 *in, unsigned __int8 *out, size_t size)
{
int v4; // r6
int v7; // r11
int v8; // r9
int v9; // r4
size_t v10; // r5
int v11; // r0
struc_1 v13; // [sp+0h] [bp-30h]
int v14; // [sp+1Ch] [bp-14h]
int v15; // [sp+20h] [bp-10h]
v4 = 0;
v15 = *(_DWORD *)off_8AC00;
v14 = 0;
v7 = sub_7AF78(17);
v8 = sub_7AF78(size);
if ( !v7 )
{
v9 = 0;
goto LABEL_12;
}
(*(void (__fastcall **)(int, const char *, int))(v7 + 12))(v7, "DcO/lcK+h?m3c*q@", 16);
if ( !v8 )
{
LABEL_9:
v4 = 0;
goto LABEL_10;
}
v4 = 0;
if ( !in )
{
LABEL_10:
v9 = 0;
goto LABEL_11;
}
v9 = 0;
if ( out )
{
memset(out, 0, size);
v10 = size - 1;
(*(void (__fastcall **)(int, unsigned __int8 *, size_t))(v8 + 12))(v8, in, v10);
memset(&v13, 0, 0x14u);
v13.field_4 = 3;
v13.field_10 = v7;
v13.field_14 = v8;
v11 = sub_6115C(&v13, &v14);
v9 = v11;
if ( v11 )
{
if ( *(_DWORD *)(v11 + 4) == v10 )
{
qmemcpy(out, *(const void **)v11, v10);
v4 = *(_DWORD *)(v9 + 4);
}
else
{
v4 = 0;
}
goto LABEL_11;
}
goto LABEL_9;
}
LABEL_11:
sub_7B148(v7);
LABEL_12:
if ( v8 )
sub_7B148(v8);
if ( v9 )
sub_7B148(v9);
return v4;
}

๊ธฐ๋Šฅ sub_7AF78 ์ง€์ •๋œ ํฌ๊ธฐ์˜ ๋ฐ”์ดํŠธ ๋ฐฐ์—ด์— ๋Œ€ํ•œ ์ปจํ…Œ์ด๋„ˆ ์ธ์Šคํ„ด์Šค๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค(์ด๋Ÿฌํ•œ ์ปจํ…Œ์ด๋„ˆ์— ๋Œ€ํ•ด์„œ๋Š” ์ž์„ธํžˆ ์„ค๋ช…ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค). ์—ฌ๊ธฐ์— ๋‘ ๊ฐœ์˜ ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ์ƒ์„ฑ๋ฉ๋‹ˆ๋‹ค. ํ•˜๋‚˜๋Š” ๋‹ค์Œ ์ค„์„ ํฌํ•จํ•ฉ๋‹ˆ๋‹ค. "DcO/lcK+h?m3c*q@" (์ด๊ฒƒ์€ ํ‚ค๋ผ๊ณ  ์ถ”์ธกํ•˜๊ธฐ ์‰ฝ์Šต๋‹ˆ๋‹ค), ๋‹ค๋ฅธ ํ•˜๋‚˜๋Š” ์•”ํ˜ธํ™”๋œ ๋ฐ์ดํ„ฐ๋ฅผ ํฌํ•จํ•ฉ๋‹ˆ๋‹ค. ๋‹ค์Œ์œผ๋กœ, ๋‘ ๊ฐ์ฒด ๋ชจ๋‘ ํŠน์ • ๊ตฌ์กฐ์— ๋ฐฐ์น˜๋˜๊ณ , ์ด๋Š” ํ•จ์ˆ˜์— ์ „๋‹ฌ๋ฉ๋‹ˆ๋‹ค. sub_6115C. ๋˜ํ•œ ์ด ๊ตฌ์กฐ์—์„œ ํ•„๋“œ์— ๊ฐ’ 3์„ ํ‘œ์‹œํ•˜๊ณ  ๋‹ค์Œ์—๋Š” ์ด ๊ตฌ์กฐ์— ์–ด๋–ค ์ผ์ด ๋ฐœ์ƒํ•˜๋Š”์ง€ ์‚ดํŽด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

int __fastcall sub_611B4(struc_1 *a1, _DWORD *a2)
{
int v3; // lr
unsigned int v4; // r1
int v5; // r0
int v6; // r1
int result; // r0
int v8; // r0
*a2 = 820000;
if ( a1 )
{
v3 = a1->field_14;
if ( v3 )
{
v4 = a1->field_4;
if ( v4 < 0x19 )
{
switch ( v4 )
{
case 0u:
v8 = sub_6419C(a1->field_0, a1->field_10, v3);
goto LABEL_17;
case 3u:
v8 = sub_6364C(a1->field_0, a1->field_10, v3);
goto LABEL_17;
case 0x10u:
case 0x11u:
case 0x12u:
v8 = sub_612F4(
a1->field_0,
v4,
*(_QWORD *)&a1->field_8,
*(_QWORD *)&a1->field_8 >> 32,
a1->field_10,
v3,
a2);
goto LABEL_17;
case 0x14u:
v8 = sub_63A28(a1->field_0, v3);
goto LABEL_17;
case 0x15u:
sub_61A60(a1->field_0, v3, a2);
return result;
case 0x16u:
v8 = sub_62440(a1->field_14);
goto LABEL_17;
case 0x17u:
v8 = sub_6226C(a1->field_10, v3);
goto LABEL_17;
case 0x18u:
v8 = sub_63530(a1->field_14);
LABEL_17:
v6 = 0;
if ( v8 )
{
*a2 = 0;
v6 = v8;
}
return v6;
default:
LOWORD(v5) = 28032;
goto LABEL_5;
}
}
}
}
LOWORD(v5) = -27504;
LABEL_5:
HIWORD(v5) = 13;
v6 = 0;
*a2 = v5;
return v6;
}

์Šค์œ„์น˜ ๋งค๊ฐœ๋ณ€์ˆ˜๋Š” ์ด์ „์— ๊ฐ’ 3์ด ํ• ๋‹น๋œ ๊ตฌ์กฐ ํ•„๋“œ์ž…๋‹ˆ๋‹ค. ์‚ฌ๋ก€ 3์„ ์‚ดํŽด๋ณด์„ธ์š”. sub_6364C ๋งค๊ฐœ๋ณ€์ˆ˜๋Š” ์ด์ „ ํ•จ์ˆ˜์— ์ถ”๊ฐ€๋œ ๊ตฌ์กฐ(์˜ˆ: ํ‚ค ๋ฐ ์•”ํ˜ธํ™”๋œ ๋ฐ์ดํ„ฐ)์—์„œ ์ „๋‹ฌ๋ฉ๋‹ˆ๋‹ค. ์ž์„ธํžˆ ์‚ดํŽด๋ณด๋ฉด sub_6364C, RC4 ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์ธ์‹ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์šฐ๋ฆฌ์—๊ฒŒ๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜๊ณผ ํ‚ค๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ํด๋ž˜์Šค ์ด๋ฆ„์„ ํ•ด๋…ํ•ด ๋ด…์‹œ๋‹ค. ์ผ์–ด๋‚œ ์ผ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค. 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, ์ฆ‰, ์šฐ๋ฆฌ์˜ ๊ฒฝ์šฐ์—๋Š” 1, 6, 1์ž…๋‹ˆ๋‹ค. ์ด ์„ธ ์ˆซ์ž์™€ ํฌ์ธํ„ฐ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค. JNIEnv ํ•จ์ˆ˜์— ์ „๋‹ฌ๋œ ์ธ์ˆ˜๋Š” ๊ตฌ์กฐ์— ์ถ”๊ฐ€๋˜์–ด ์ „๋‹ฌ๋ฉ๋‹ˆ๋‹ค. ์–ป์€ ์„ธ ๊ฐœ์˜ ์ˆซ์ž(N1, N2 ๋ฐ N3๋กœ ํ‘œ์‹œ)๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ช…๋ น ํŠธ๋ฆฌ๊ฐ€ ๊ตฌ์ถ•๋ฉ๋‹ˆ๋‹ค.

์ด ๊ฐ™์€:

UC ๋ธŒ๋ผ์šฐ์ €์˜ ์ทจ์•ฝ์  ์ฐพ๊ธฐ

ํŠธ๋ฆฌ๋Š” ๋™์ ์œผ๋กœ ์ฑ„์›Œ์ง‘๋‹ˆ๋‹ค. JNI_OnLoad.
์„ธ ๊ฐœ์˜ ์ˆซ์ž๊ฐ€ ํŠธ๋ฆฌ์˜ ๊ฒฝ๋กœ๋ฅผ ์ธ์ฝ”๋”ฉํ•ฉ๋‹ˆ๋‹ค. ํŠธ๋ฆฌ์˜ ๊ฐ ์žŽ์—๋Š” ํ•ด๋‹น ํ•จ์ˆ˜์˜ ํฌ์ผ“ ์ฃผ์†Œ๊ฐ€ ํฌํ•จ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. ํ‚ค๋Š” ์ƒ์œ„ ๋…ธ๋“œ์— ์žˆ์Šต๋‹ˆ๋‹ค. ์‚ฌ์šฉ๋œ ๋ชจ๋“  ๊ตฌ์กฐ๋ฅผ ์ดํ•ดํ•œ๋‹ค๋ฉด ์ฝ”๋“œ์—์„œ ํ•„์š”ํ•œ ํ•จ์ˆ˜๊ฐ€ ํŠธ๋ฆฌ์— ์ถ”๊ฐ€๋˜๋Š” ์œ„์น˜๋ฅผ ์ฐพ๋Š” ๊ฒƒ์ด ์–ด๋ ต์ง€ ์•Š์Šต๋‹ˆ๋‹ค(์ด๋ฏธ ํฐ ๋ฌธ์„œ๋ฅผ ๋ถ€ํ’€๋ฆฌ์ง€ ์•Š๊ธฐ ์œ„ํ•ด ์„ค๋ช…ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค).

๋” ๋‚œ๋…ํ™”

ํŠธ๋ž˜ํ”ฝ์„ ํ•ด๋…ํ•ด์•ผ ํ•˜๋Š” ํ•จ์ˆ˜์˜ ์ฃผ์†Œ: 0x5F1AC๋ฅผ ๋ฐ›์•˜์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ๊ธฐ๋ปํ•˜๊ธฐ์—๋Š” ์•„์ง ์ด๋ฅด์Šต๋‹ˆ๋‹ค. UC ๋ธŒ๋ผ์šฐ์ € ๊ฐœ๋ฐœ์ž๊ฐ€ ์šฐ๋ฆฌ๋ฅผ ์œ„ํ•ด ๋˜ ๋‹ค๋ฅธ ๋†€๋ผ์›€์„ ์ค€๋น„ํ–ˆ์Šต๋‹ˆ๋‹ค.

Java ์ฝ”๋“œ๋กœ ๊ตฌ์„ฑ๋œ ๋ฐฐ์—ด์—์„œ ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ์ˆ˜์‹ ํ•œ ํ›„ ๋‹ค์Œ์„ ์–ป์Šต๋‹ˆ๋‹ค.
์ฃผ์†Œ 0x4D070์˜ ํ•จ์ˆ˜์—. ๊ทธ๋ฆฌ๊ณ  ๋˜ ๋‹ค๋ฅธ ์œ ํ˜•์˜ ์ฝ”๋“œ ๋‚œ๋…ํ™”๊ฐ€ ์šฐ๋ฆฌ๋ฅผ ๊ธฐ๋‹ค๋ฆฌ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

R7๊ณผ R4์— ๋‘ ๊ฐœ์˜ ์ธ๋ฑ์Šค๋ฅผ ๋„ฃ์Šต๋‹ˆ๋‹ค.

UC ๋ธŒ๋ผ์šฐ์ €์˜ ์ทจ์•ฝ์  ์ฐพ๊ธฐ

์ฒซ ๋ฒˆ์งธ ์ธ๋ฑ์Šค๋ฅผ R11๋กœ ์ด๋™ํ•ฉ๋‹ˆ๋‹ค.

UC ๋ธŒ๋ผ์šฐ์ €์˜ ์ทจ์•ฝ์  ์ฐพ๊ธฐ

ํ…Œ์ด๋ธ”์—์„œ ์ฃผ์†Œ๋ฅผ ์–ป์œผ๋ ค๋ฉด ์ธ๋ฑ์Šค๋ฅผ ์‚ฌ์šฉํ•˜์‹ญ์‹œ์˜ค.

UC ๋ธŒ๋ผ์šฐ์ €์˜ ์ทจ์•ฝ์  ์ฐพ๊ธฐ

์ฒซ ๋ฒˆ์งธ ์ฃผ์†Œ๋กœ ์ด๋™ํ•œ ํ›„ R4์— ์žˆ๋Š” ๋‘ ๋ฒˆ์งธ ์ธ๋ฑ์Šค๊ฐ€ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. ํ…Œ์ด๋ธ”์—๋Š” 230๊ฐœ์˜ ์š”์†Œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

์–ด๋–ป๊ฒŒ ํ•ด์•ผ ํ• ๊นŒ์š”? ํŽธ์ง‘ -> ๊ธฐํƒ€ -> ์Šค์œ„์น˜ ๊ด€์šฉ์–ด ์ง€์ •์„ ํ†ตํ•ด IDA์— ์ด๊ฒƒ์ด ์Šค์œ„์น˜์ž„์„ ์•Œ๋ฆด ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

UC ๋ธŒ๋ผ์šฐ์ €์˜ ์ทจ์•ฝ์  ์ฐพ๊ธฐ

๊ฒฐ๊ณผ ์ฝ”๋“œ๋Š” ๋ฌด์„ญ์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ์ •๊ธ€์„ ํ—ค์ณ๋‚˜๊ฐ€๋‹ค ๋ณด๋ฉด ์ด๋ฏธ ์šฐ๋ฆฌ์—๊ฒŒ ์นœ์ˆ™ํ•œ ํ•จ์ˆ˜๊ฐ€ ํ˜ธ์ถœ๋˜๋Š” ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. sub_6115C:

UC ๋ธŒ๋ผ์šฐ์ €์˜ ์ทจ์•ฝ์  ์ฐพ๊ธฐ

์‚ฌ๋ก€ 3์˜ ๊ฒฝ์šฐ RC4 ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์‚ฌ์šฉํ•˜์—ฌ ์•”ํ˜ธ๋ฅผ ํ•ด๋…ํ•˜๋Š” ์Šค์œ„์น˜๊ฐ€ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์ด ๊ฒฝ์šฐ ํ•จ์ˆ˜์— ์ „๋‹ฌ๋œ ๊ตฌ์กฐ๋Š” ์ „๋‹ฌ๋œ ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ์ฑ„์›Œ์ง‘๋‹ˆ๋‹ค. doCommandNative. ์šฐ๋ฆฌ๊ฐ€ ๊ฑฐ๊ธฐ์—์„œ ๋ฌด์—‡์„ ๊ฐ€์กŒ๋Š”์ง€ ๊ธฐ์–ตํ•˜์ž ๋งค์ง์ธํŠธ ๊ฐ’์€ 16์ž…๋‹ˆ๋‹ค. ํ•ด๋‹น ์‚ฌ๋ก€๋ฅผ ์‚ดํŽด๋ณด๊ณ  ์—ฌ๋Ÿฌ ๋ฒˆ์˜ ์ „ํ™˜ ํ›„์— ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์‹๋ณ„ํ•  ์ˆ˜ ์žˆ๋Š” ์ฝ”๋“œ๋ฅผ ์ฐพ์Šต๋‹ˆ๋‹ค.

UC ๋ธŒ๋ผ์šฐ์ €์˜ ์ทจ์•ฝ์  ์ฐพ๊ธฐ

AES ์ž…๋‹ˆ๋‹ค!

์•Œ๊ณ ๋ฆฌ์ฆ˜์€ ์กด์žฌํ•˜๋ฉฐ, ๋‚จ์€ ๊ฒƒ์€ ํ•ด๋‹น ๋งค๊ฐœ๋ณ€์ˆ˜(๋ชจ๋“œ, ํ‚ค ๋ฐ ์ดˆ๊ธฐํ™” ๋ฒกํ„ฐ)๋ฅผ ์–ป๋Š” ๊ฒƒ๋ฟ์ž…๋‹ˆ๋‹ค(ํ•ด๋‹น ์กด์žฌ ์—ฌ๋ถ€๋Š” AES ์•Œ๊ณ ๋ฆฌ์ฆ˜์˜ ์ž‘๋™ ๋ชจ๋“œ์— ๋”ฐ๋ผ ๋‹ค๋ฆ„). ์ด๋ฅผ ํฌํ•จํ•˜๋Š” ๊ตฌ์กฐ๋Š” ํ•จ์ˆ˜ ํ˜ธ์ถœ ์ด์ „ ์–ด๋”˜๊ฐ€์— ํ˜•์„ฑ๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. sub_6115C, ๊ทธ๋Ÿฌ๋‚˜ ์ฝ”๋“œ์˜ ์ด ๋ถ€๋ถ„์€ ํŠนํžˆ ๋‚œ๋…ํ™”๋˜์–ด ์žˆ์œผ๋ฏ€๋กœ ํ•ด๋… ๊ธฐ๋Šฅ์˜ ๋ชจ๋“  ๋งค๊ฐœ๋ณ€์ˆ˜๊ฐ€ ํŒŒ์ผ์— ๋คํ”„๋˜๋„๋ก ์ฝ”๋“œ๋ฅผ ํŒจ์น˜ํ•˜๋Š” ์•„์ด๋””์–ด๊ฐ€ ๋– ์˜ค๋ฆ…๋‹ˆ๋‹ค.

ํŒจ์น˜

๋ชจ๋“  ํŒจ์น˜ ์ฝ”๋“œ๋ฅผ ์–ด์…ˆ๋ธ”๋ฆฌ ์–ธ์–ด๋กœ ์ˆ˜๋™์œผ๋กœ ์ž‘์„ฑํ•˜์ง€ ์•Š์œผ๋ ค๋ฉด Android Studio๋ฅผ ์‹คํ–‰ํ•˜๊ณ  ๋ณตํ˜ธํ™” ํ•จ์ˆ˜์™€ ๋™์ผํ•œ ์ž…๋ ฅ ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ์ˆ˜์‹ ํ•˜์—ฌ ํŒŒ์ผ์— ์“ฐ๋Š” ํ•จ์ˆ˜๋ฅผ ์ž‘์„ฑํ•œ ๋‹ค์Œ ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ์ˆ˜ํ–‰ํ•  ์ฝ”๋“œ๋ฅผ ๋ณต์‚ฌํ•˜์—ฌ ๋ถ™์—ฌ๋„ฃ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ƒ์„ฑํ•˜๋‹ค.

UC ๋ธŒ๋ผ์šฐ์ € ํŒ€์˜ ์นœ๊ตฌ๋“ค๋„ ์ฝ”๋“œ ์ถ”๊ฐ€์˜ ํŽธ์˜์„ฑ์„ ๊ณ ๋ คํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ฐ ํ•จ์ˆ˜์˜ ์‹œ์ž‘ ๋ถ€๋ถ„์—๋Š” ๋‹ค๋ฅธ ํ•จ์ˆ˜๋กœ ์‰ฝ๊ฒŒ ๋Œ€์ฒด๋  ์ˆ˜ ์žˆ๋Š” ๊ฐ€๋น„์ง€ ์ฝ”๋“œ๊ฐ€ ์žˆ๋‹ค๋Š” ๊ฒƒ์„ ๊ธฐ์–ตํ•˜์„ธ์š”. ๋งค์šฐ ํŽธ๋ฆฌํ•ฉ๋‹ˆ๋‹ค ๐Ÿ™‚ ํ•˜์ง€๋งŒ ๋Œ€์ƒ ํ•จ์ˆ˜ ์‹œ์ž‘ ๋ถ€๋ถ„์— ๋ชจ๋“  ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ํŒŒ์ผ์— ์ €์žฅํ•˜๋Š” ์ฝ”๋“œ๋ฅผ ์œ„ํ•œ ๊ณต๊ฐ„์ด ๋ถ€์กฑํ•ฉ๋‹ˆ๋‹ค. ๋‚˜๋Š” ๊ทธ๊ฒƒ์„ ์—ฌ๋Ÿฌ ๋ถ€๋ถ„์œผ๋กœ ๋‚˜๋ˆ„๊ณ  ์ธ์ ‘ํ•œ ๊ธฐ๋Šฅ์˜ ๊ฐ€๋น„์ง€ ๋ธ”๋ก์„ ์‚ฌ์šฉํ•ด์•ผ ํ–ˆ์Šต๋‹ˆ๋‹ค. ์ด XNUMX๊ฐœ์˜ ๋ถ€๋ถ„์ด ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.

ะŸะตั€ะฒะฐั์˜ ั‡ะฐัั‚ัŒ :

UC ๋ธŒ๋ผ์šฐ์ €์˜ ์ทจ์•ฝ์  ์ฐพ๊ธฐ

ARM ์•„ํ‚คํ…์ฒ˜์—์„œ ์ฒ˜์Œ 0๊ฐœ์˜ ํ•จ์ˆ˜ ๋งค๊ฐœ๋ณ€์ˆ˜๋Š” ๋ ˆ์ง€์Šคํ„ฐ R3-R0์„ ํ†ตํ•ด ์ „๋‹ฌ๋˜๊ณ , ๋‚˜๋จธ์ง€๋Š” ์Šคํƒ์„ ํ†ตํ•ด ์ „๋‹ฌ๋ฉ๋‹ˆ๋‹ค. LR ๋ ˆ์ง€์Šคํ„ฐ๋Š” ๋ณต๊ท€ ์ฃผ์†Œ๋ฅผ ์ „๋‹ฌํ•ฉ๋‹ˆ๋‹ค. ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ๋คํ”„ํ•œ ํ›„ ํ•จ์ˆ˜๊ฐ€ ์ž‘๋™ํ•  ์ˆ˜ ์žˆ๋„๋ก ์ด ๋ชจ๋“  ๊ฒƒ์„ ์ €์žฅํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๋˜ํ•œ ํ”„๋กœ์„ธ์Šค์—์„œ ์‚ฌ์šฉํ•  ๋ชจ๋“  ๋ ˆ์ง€์Šคํ„ฐ๋ฅผ ์ €์žฅํ•ด์•ผ ํ•˜๋ฏ€๋กœ PUSH.W {R10-R7,LR}์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค. RXNUMX์—์„œ๋Š” ์Šคํƒ์„ ํ†ตํ•ด ํ•จ์ˆ˜์— ์ „๋‹ฌ๋œ ๋งค๊ฐœ๋ณ€์ˆ˜ ๋ชฉ๋ก์˜ ์ฃผ์†Œ๋ฅผ ์–ป์Šต๋‹ˆ๋‹ค.

๊ธฐ๋Šฅ ์‚ฌ์šฉ ํฌํŽœ ํŒŒ์ผ์„ ์—ด์–ด๋ณด์ž /๋ฐ์ดํ„ฐ/๋กœ์ปฌ/tmp/aes "ab" ๋ชจ๋“œ์—์„œ
์ฆ‰, ์ถ”๊ฐ€๋ฅผ ์œ„ํ•ด. R0์—์„œ๋Š” ํŒŒ์ผ ์ด๋ฆ„์˜ ์ฃผ์†Œ๋ฅผ ๋กœ๋“œํ•˜๊ณ , R1์—์„œ๋Š” ๋ชจ๋“œ๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” ์ค„์˜ ์ฃผ์†Œ๋ฅผ ๋กœ๋“œํ•ฉ๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์„œ ๊ฐ€๋น„์ง€ ์ฝ”๋“œ๊ฐ€ ์ข…๋ฃŒ๋˜๋ฏ€๋กœ ๋‹ค์Œ ๊ธฐ๋Šฅ์œผ๋กœ ๋„˜์–ด๊ฐ‘๋‹ˆ๋‹ค. ๊ณ„์† ์ž‘๋™ํ•˜๊ธฐ ์œ„ํ•ด ์šฐ๋ฆฌ๋Š” ์ฒ˜์Œ์— ๊ฐ€๋น„์ง€๋ฅผ ์šฐํšŒํ•˜์—ฌ ํ•จ์ˆ˜์˜ ์‹ค์ œ ์ฝ”๋“œ๋กœ์˜ ์ „ํ™˜์„ ๋ฐฐ์น˜ํ•˜๊ณ  ๊ฐ€๋น„์ง€ ๋Œ€์‹  ํŒจ์น˜์˜ ์—ฐ์†์„ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.

UC ๋ธŒ๋ผ์šฐ์ €์˜ ์ทจ์•ฝ์  ์ฐพ๊ธฐ

๋ถ€๋ฆ„ ํฌํŽœ.

ํ•จ์ˆ˜์˜ ์ฒ˜์Œ ์„ธ ๋งค๊ฐœ๋ณ€์ˆ˜ ์—์ด์Šค ์œ ํ˜•์ด ์žˆ๋‹ค INT. ์ฒ˜์Œ์— ๋ ˆ์ง€์Šคํ„ฐ๋ฅผ ์Šคํƒ์— ์ €์žฅํ–ˆ์œผ๋ฏ€๋กœ ๊ฐ„๋‹จํžˆ ํ•จ์ˆ˜๋ฅผ ์ „๋‹ฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์“ฐ๊ธฐ ์Šคํƒ์— ์žˆ๋Š” ์ฃผ์†Œ์ž…๋‹ˆ๋‹ค.

UC ๋ธŒ๋ผ์šฐ์ €์˜ ์ทจ์•ฝ์  ์ฐพ๊ธฐ

๋‹ค์Œ์œผ๋กœ ๋ฐ์ดํ„ฐ ํฌ๊ธฐ์™€ ํ‚ค, ์ดˆ๊ธฐํ™” ๋ฒกํ„ฐ ๋ฐ ์•”ํ˜ธํ™”๋œ ๋ฐ์ดํ„ฐ์— ๋Œ€ํ•œ ๋ฐ์ดํ„ฐ์— ๋Œ€ํ•œ ํฌ์ธํ„ฐ๋ฅผ ํฌํ•จํ•˜๋Š” ์„ธ ๊ฐ€์ง€ ๊ตฌ์กฐ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

UC ๋ธŒ๋ผ์šฐ์ €์˜ ์ทจ์•ฝ์  ์ฐพ๊ธฐ

๋งˆ์ง€๋ง‰์œผ๋กœ ํŒŒ์ผ์„ ๋‹ซ๊ณ  ๋ ˆ์ง€์Šคํ„ฐ๋ฅผ ๋ณต์›ํ•œ ํ›„ ์ œ์–ด๊ถŒ์„ ์‹ค์ œ ๊ธฐ๋Šฅ์œผ๋กœ ์ด์ „ํ•ฉ๋‹ˆ๋‹ค. ์—์ด์Šค.

ํŒจ์น˜๋œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ ํฌํ•จ๋œ APK๋ฅผ ์ˆ˜์ง‘ํ•˜๊ณ  ์„œ๋ช…ํ•œ ํ›„ ๊ธฐ๊ธฐ/์—๋ฎฌ๋ ˆ์ดํ„ฐ์— ์—…๋กœ๋“œํ•˜๊ณ  ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค. ๋คํ”„๊ฐ€ ์ƒ์„ฑ๋˜๊ณ  ์žˆ๊ณ  ๊ฑฐ๊ธฐ์— ๋งŽ์€ ๋ฐ์ดํ„ฐ๊ฐ€ ๊ธฐ๋ก๋˜๊ณ  ์žˆ๋Š” ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ธŒ๋ผ์šฐ์ €๋Š” ํŠธ๋ž˜ํ”ฝ์—๋งŒ ์•”ํ˜ธํ™”๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ ๋ชจ๋“  ์•”ํ˜ธํ™”๊ฐ€ ํ•ด๋‹น ๊ธฐ๋Šฅ์„ ํ†ต๊ณผํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์–ด๋–ค ์ด์œ ๋กœ ํ•„์š”ํ•œ ๋ฐ์ดํ„ฐ๊ฐ€ ์กด์žฌํ•˜์ง€ ์•Š์œผ๋ฉฐ ํ•„์š”ํ•œ ์š”์ฒญ์ด ํŠธ๋ž˜ํ”ฝ์— ํ‘œ์‹œ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. UC ๋ธŒ๋ผ์šฐ์ €๊ฐ€ ํ•„์š”ํ•œ ์š”์ฒญ์„ ํ•  ๋•Œ๊นŒ์ง€ ๊ธฐ๋‹ค๋ฆฌ์ง€ ์•Š์œผ๋ ค๋ฉด ์ด์ „์— ๋ฐ›์€ ์„œ๋ฒ„์—์„œ ์•”ํ˜ธํ™”๋œ ์‘๋‹ต์„ ๋ฐ›์•„ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๋‹ค์‹œ ํŒจ์น˜ํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. ๊ธฐ๋ณธ ํ™œ๋™์˜ 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์— ํ•ด๋‹น ์ด๋ฆ„์˜ ํด๋”๋ฅผ ์ƒ์„ฑํ•˜๊ณ  ๊ฑฐ๊ธฐ์— Squirrel ๋ธŒ๋ผ์šฐ์ € ์ธ์ฆ์„œ๋ฅผ ์ถ”๊ฐ€ํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

์šฐ๋ฆฌ๋Š” ์กฐ๋ฆฝ, ์„œ๋ช…, ์„ค์น˜, ์ถœ์‹œ๋ฅผ ์ง„ํ–‰ํ•ฉ๋‹ˆ๋‹ค. ๋น™๊ณ ! ์šฐ๋ฆฌ๋Š” ์—ด์‡ ๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค!

MitM

์šฐ๋ฆฌ๋Š” ํ‚ค์™€ ํ‚ค์™€ ๋™์ผํ•œ ์ดˆ๊ธฐํ™” ๋ฒกํ„ฐ๋ฅผ ๋ฐ›์•˜์Šต๋‹ˆ๋‹ค. CBC ๋ชจ๋“œ์—์„œ ์„œ๋ฒ„ ์‘๋‹ต์˜ ์•”ํ˜ธ๋ฅผ ํ•ด๋…ํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

UC ๋ธŒ๋ผ์šฐ์ €์˜ ์ทจ์•ฝ์  ์ฐพ๊ธฐ

MD5, "extract_unzipsize" ๋ฐ ์ˆซ์ž์™€ ์œ ์‚ฌํ•œ ์•„์นด์ด๋ธŒ URL์ด ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค. ํ™•์ธํ•ฉ๋‹ˆ๋‹ค: ์•„์นด์ด๋ธŒ์˜ MD5๊ฐ€ ๋™์ผํ•˜๊ณ , ์••์ถ•์„ ํ‘ผ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์˜ ํฌ๊ธฐ๊ฐ€ ๋™์ผํ•ฉ๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๋Š” ์ด ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ํŒจ์น˜ํ•˜์—ฌ ๋ธŒ๋ผ์šฐ์ €์— ์ œ๊ณตํ•˜๋ ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค. ํŒจ์น˜๋œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ ๋กœ๋“œ๋˜์—ˆ์Œ์„ ๋ณด์—ฌ์ฃผ๊ธฐ ์œ„ํ•ด "PWNED!"๋ผ๋Š” ํ…์ŠคํŠธ๊ฐ€ ํฌํ•จ๋œ SMS๋ฅผ ์ƒ์„ฑํ•˜๋ ค๋Š” ์ธํ…ํŠธ๋ฅผ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค. ์„œ๋ฒ„์˜ ๋‘ ๊ฐ€์ง€ ์‘๋‹ต์„ ๋Œ€์ฒดํ•ฉ๋‹ˆ๋‹ค. puds.ucweb.com/upgrade/index.xhtml ๊ทธ๋ฆฌ๊ณ  ์•„์นด์ด๋ธŒ๋ฅผ ๋‹ค์šด๋กœ๋“œํ•ฉ๋‹ˆ๋‹ค. ์ฒซ ๋ฒˆ์งธ์—์„œ๋Š” MD5๋ฅผ ๊ต์ฒดํ•˜๊ณ (์••์ถ•์„ ํ‘ผ ํ›„์—๋„ ํฌ๊ธฐ๋Š” ๋ณ€๊ฒฝ๋˜์ง€ ์•Š์Œ) ๋‘ ๋ฒˆ์งธ์—์„œ๋Š” ํŒจ์น˜๋œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋กœ ์•„์นด์ด๋ธŒ๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

๋ธŒ๋ผ์šฐ์ €๊ฐ€ ์•„์นด์ด๋ธŒ๋ฅผ ์—ฌ๋Ÿฌ ๋ฒˆ ๋‹ค์šด๋กœ๋“œํ•˜๋ ค๊ณ  ์‹œ๋„ํ•œ ํ›„ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค. ๋ถ„๋ช…ํžˆ ๋ญ”๊ฐ€
๊ทธ๋Š” ์ข‹์•„ํ•˜์ง€ ์•Š๋Š”๋‹ค. ์ด ๋ถˆ๋ถ„๋ช…ํ•œ ํ˜•์‹์„ ๋ถ„์„ํ•œ ๊ฒฐ๊ณผ ์„œ๋ฒ„๊ฐ€ ์•„์นด์ด๋ธŒ์˜ ํฌ๊ธฐ๋„ ์ „์†กํ•˜๋Š” ๊ฒƒ์œผ๋กœ ๋‚˜ํƒ€๋‚ฌ์Šต๋‹ˆ๋‹ค.

UC ๋ธŒ๋ผ์šฐ์ €์˜ ์ทจ์•ฝ์  ์ฐพ๊ธฐ

LEB128๋กœ ์ธ์ฝ”๋”ฉ๋ฉ๋‹ˆ๋‹ค. ํŒจ์น˜ ์ดํ›„์—๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ ํฌํ•จ๋œ ์•„์นด์ด๋ธŒ์˜ ํฌ๊ธฐ๊ฐ€ ์กฐ๊ธˆ ๋ณ€๊ฒฝ๋˜์–ด ๋ธŒ๋ผ์šฐ์ €์—์„œ๋Š” ํ•ด๋‹น ์•„์นด์ด๋ธŒ๊ฐ€ ๋น„๋šค๊ฒŒ ๋‹ค์šด๋กœ๋“œ๋œ ๊ฒƒ์œผ๋กœ ๊ฐ„์ฃผํ•˜์—ฌ ์—ฌ๋Ÿฌ ๋ฒˆ ์‹œ๋„ํ•œ ๋์— ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ–ˆ์Šต๋‹ˆ๋‹ค.

์•„์นด์ด๋ธŒ์˜ ํฌ๊ธฐ๋ฅผ ์กฐ์ •ํ•ฉ๋‹ˆ๋‹ค... ๊ทธ๋ฆฌ๊ณ  โ€“ ์Šน๋ฆฌ! ๐Ÿ™‚ ๊ฒฐ๊ณผ๋Š” ์˜์ƒ์— ์žˆ์Šต๋‹ˆ๋‹ค.

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

๊ฒฐ๊ณผ ๋ฐ ๊ฐœ๋ฐœ์ž ๋ฐ˜์‘

๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ํ•ด์ปค๋Š” UC ๋ธŒ๋ผ์šฐ์ €์˜ ์•ˆ์ „ํ•˜์ง€ ์•Š์€ ๊ธฐ๋Šฅ์„ ์ด์šฉํ•ด ์•…์„ฑ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ๋ฐฐํฌํ•˜๊ณ  ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋Š” ๋ธŒ๋ผ์šฐ์ €์˜ ์ปจํ…์ŠคํŠธ์—์„œ ์ž‘๋™ํ•˜๋ฏ€๋กœ ๋ชจ๋“  ์‹œ์Šคํ…œ ๊ถŒํ•œ์„ ๋ฐ›๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. ๊ฒฐ๊ณผ์ ์œผ๋กœ ํ”ผ์‹ฑ ์ฐฝ์„ ํ‘œ์‹œํ•˜๋Š” ๊ธฐ๋Šฅ๊ณผ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ์ €์žฅ๋œ ๋กœ๊ทธ์ธ, ๋น„๋ฐ€๋ฒˆํ˜ธ ๋ฐ ์ฟ ํ‚ค๋ฅผ ํฌํ•จํ•˜์—ฌ ์ฃผํ™ฉ์ƒ‰ ์ค‘๊ตญ ๋‹ค๋žŒ์ฅ์˜ ์ž‘์—… ํŒŒ์ผ์— ๋Œ€ํ•œ ์•ก์„ธ์Šค ๊ธฐ๋Šฅ์ด ์ œ๊ณต๋ฉ๋‹ˆ๋‹ค.

์šฐ๋ฆฌ๋Š” UC ๋ธŒ๋ผ์šฐ์ € ๊ฐœ๋ฐœ์ž์—๊ฒŒ ์—ฐ๋ฝํ•˜์—ฌ ์šฐ๋ฆฌ๊ฐ€ ๋ฐœ๊ฒฌํ•œ ๋ฌธ์ œ์— ๋Œ€ํ•ด ์•Œ๋ฆฌ๊ณ  ์ทจ์•ฝ์ ๊ณผ ์œ„ํ—˜์„ฑ์„ ์ง€์ ํ•˜๋ ค๊ณ  ๋…ธ๋ ฅํ–ˆ์ง€๋งŒ ๊ทธ๋“ค์€ ์šฐ๋ฆฌ์™€ ์•„๋ฌด๋Ÿฐ ๋…ผ์˜๋„ ํ•˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค. ํ•œํŽธ, ๋ธŒ๋ผ์šฐ์ €๋Š” ๋ˆˆ์— ์ž˜ ๋„๋Š” ์œ„ํ—˜ํ•œ ๊ธฐ๋Šฅ์„ ๊ณ„์†ํ•ด์„œ ๊ณผ์‹œํ–ˆ์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ์ผ๋‹จ ์ทจ์•ฝ์ ์˜ ์„ธ๋ถ€์‚ฌํ•ญ์ด ๊ณต๊ฐœ๋˜์ž ๋” ์ด์ƒ ์˜ˆ์ „์ฒ˜๋Ÿผ ์ด๋ฅผ ๋ฌด์‹œํ•  ์ˆ˜ ์—†์—ˆ์Šต๋‹ˆ๋‹ค. 27์›” XNUMX์ผ์€
HTTPS๋ฅผ ํ†ตํ•ด ์„œ๋ฒ„์— ์•ก์„ธ์Šคํ•˜๋Š” UC Browser 12.10.9.1193์˜ ์ƒˆ ๋ฒ„์ „์ด ์ถœ์‹œ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. puds.ucweb.com/upgrade/index.xhtml.

๋˜ํ•œ "์ˆ˜์ •" ์ดํ›„ ์ด ๊ธฐ์‚ฌ๋ฅผ ์ž‘์„ฑํ•  ๋•Œ๊นŒ์ง€ ๋ธŒ๋ผ์šฐ์ €์—์„œ PDF๋ฅผ ์—ด๋ ค๊ณ  ํ•˜๋ฉด "์ฃ„์†กํ•ฉ๋‹ˆ๋‹ค. ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ–ˆ์Šต๋‹ˆ๋‹ค!"๋ผ๋Š” ํ…์ŠคํŠธ์™€ ํ•จ๊ป˜ ์˜ค๋ฅ˜ ๋ฉ”์‹œ์ง€๊ฐ€ ํ‘œ์‹œ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. PDF๋ฅผ ์—ด๋ ค๊ณ  ํ•  ๋•Œ ์„œ๋ฒ„์— ๋Œ€ํ•œ ์š”์ฒญ์ด ์ด๋ฃจ์–ด์ง€์ง€ ์•Š์•˜์ง€๋งŒ ๋ธŒ๋ผ์šฐ์ €๊ฐ€ ์‹œ์ž‘๋  ๋•Œ ์š”์ฒญ์ด ์ด๋ฃจ์–ด์กŒ์Šต๋‹ˆ๋‹ค. ์ด๋Š” Google Play ๊ทœ์น™์„ ์œ„๋ฐ˜ํ•˜์—ฌ ์‹คํ–‰ ๊ฐ€๋Šฅํ•œ ์ฝ”๋“œ๋ฅผ ๊ณ„์† ๋‹ค์šด๋กœ๋“œํ•  ์ˆ˜ ์žˆ์Œ์„ ์•”์‹œํ•ฉ๋‹ˆ๋‹ค.

์ถœ์ฒ˜ : habr.com

์ฝ”๋ฉ˜ํŠธ๋ฅผ ์ถ”๊ฐ€