꿈을꾸는 파랑새

오늘은 성인 사이트로 위장해서 악성코드 유포하는 안드로이드 악성코드인 LUTASNGEOAS.apk에 대해 글을 적어 보겠습니다. 해당 악성코드는 탐지를 피하고자 플랫폼 간 프레임워크 및 난독화를 사용을 하고 있으며 일단 기본적으로 한국에 사는 사람들을 타켓으로 만들어진 악성코드입니다. 일단 해당 사이트는 가짜 성인 사이트로 위장하고 있으면 악성코드가 감염되는 방법은 다음과 같습니다.
https://www.nude-tv(.)net/->https://www.nude-tv(.)net/LUTASNGEOAS.apk 식으로 악성코드가 다운로드가 되는 과정을 볼 수가 있었으면 해당 사이트를 구글에서 검색해 보니 대략 2010년부터 사이트가 존재했던 것을 볼 수가 있었습니다.

성인 사이트로 위장한 악성코드 유포 사이트
악성코드 유포 사이트

그리고 해당 웹사이트 웹 소스를 열어 보면 다음과 같이 돼 있는 것을 확인할 수가 있습니다.

<!--重置样式--> <!--스타일 재설정--> 
!--页面样式-->!--페이지 스타일--> 
<!--设置字体大小-->  <!--글꼴 크기 설정--> 
</head> 
 <body ontouchstart="" onmouseover=""> 
  <div class="mobile-wrap center"> 
   <main> 
    <div class="appItem"> 
     <div class="left">
      <img src="2020/03/31/GQ4upF.png" alt="">
     </div> 
     <div class="right"> 
      <strong>Nude TV</strong> 
      <!--<p>第 1 名</p> -->
      <div class="installBox"> 
       <a class="down" href="LUTASNGEOAS(.)apk">무료받기</a> 
       <!--<p class="doubt">?</p>  -->

일단 해당 사이트에 접속하면 Nud? TV이라는 제목과 그리고 구글 플레이 스토어 처럼 생긴 사이트를 볼 수가 있습니다. 여기서 앱 설명에서는 다음과 같이 적혀져 있습니다.

악성코드 유포 웹 소스
악성코드 유포 웹 소스

애플소개
•100만 회원이 추천한 신개념 화상채팅,영상채팅 NudeTV에서 캠톡 왕이 되어보세요~
•ScreenShield 기술로 영상녹화/사진캡쳐 NO
•솔로라 외로우셨나요? 거리,맛집,영화관에서 커플들 보실때 부러우셨죠?NudeTV 하나면 솔로탈출 가능합니다.
•나만의 이상형이 세상에 있을가 고민하셨나요? 회원님의 이상형은 바로 여기에 있습니다. 바로NudeTV에~
•하루는 24시간, 오늘 하루는 언제나 너무나 짧습니다. 빠르게 이성을 선택하고 실시간으로 마음껏 즐톡하세요.
•NudeTV에서는 회원가입시 가입포인트와 출석체크포인트, 수많은 무료충전소를 통한 수익으로 무료로 채팅을 즐기실 수 있습니다.
•수많은 화상채팅, 영상채팅 어플들에 질리셨나요?누?캠이 그 질리신 마음을 신개념 즐거움에로 이끌어드립니다.
뭐~대충 외로우신 분들 채팅을 하는 앱으로 위장을 하고 있으면 해당 사이트 웹 소스를 열어 보면 다음과 같이 구성이 돼 있는 것을 볼 수가 있습니다.
먼저 해당 악성코드의 해쉬값은 다음과 같습니다.

악성코드 안드로이드 권한
악성코드 안드로이드 권한

파일명: LUTASNGEOAS.apk
사이즈:4.07 MB
CRC32:1a53c6db
MD5:87141122720d2b3af06f2da9806f6894
SHA-1:0b0d86dee0bb84ff936ed9ceb91915b382c747cf
SHA-256: f6312547a2e70e98e0f97bf5f73ac7e8c5f5c30ef197464eec6642ca55206293
SHA-512: 43807bb7532b4e25c6d134d01430f907dc0176144448fe86d3f222b1423bf87799377b533091fbc1fe08c1da090f334857b194373210575fadfffb77f54440f4
바이러스 토탈 2021-11-27 19:13:23 UTC 기준으로 다음과 같은 보안 업체들이 탐지하고 있습니다.
Ad-Aware:Trojan.GenericKD.38125649
Avast-Mobile:APK:RepSandbox [Trj]
BitDefender:Trojan.GenericKD.38125649
Emsisoft:Trojan.GenericKD.38125649 (B)
eScan:Trojan.GenericKD.38125649
FireEye:Trojan.GenericKD.38125649
Fortinet:Android/Agent.B675!tr
GData:Trojan.GenericKD.38125649
Ikarus:Trojan-Dropper.AndroidOS.Agent
MAX:Malware (ai Score=88)
McAfee:Artemis!87141122720D
McAfee-GW-Edition:Artemis!Trojan
Tencent:A.privacy.SexInfoSteal
Trustlook:Android.PUA.General
입니다.
앱 이름: nude-tv
패키지 이름: plus.H581B4819
악성코드 안드로이드 권한은 다음과 같습니다.

안드로이드 악성코드 실행
안드로이드 악성코드 실행

<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/>
<uses-permission android:name="android.permission.INSTALL_PACKAGES"/>
<uses-permission android:name="android.permission.REQUEST_INSTALL_PACKAGES"/>
<uses-permission android:name="android.permission.GET_ACCOUNTS"/>
<uses-permission android:name="android.permission.READ_CONTACTS"/>
<uses-permission android:name="android.permission.WRITE_CONTACTS"/>
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>
<uses-permission android:name="com.huawei.android.launcher.permission.CHANGE_BADGE"/>
<uses-permission android:name="com.vivo.notification.permission.BADGE_ICON"/>

기본적으로 인터넷 연결,외장 디스크 쓰기,네트워크 상태 확인 권한,와이파이 상태 확인 권한,PackageInstallerService의 API를 사용하여 APK를 설치, 기기의 계정 목록을 가져, 연락처 쓰기, 위치 정보 액세스 권한 요청, 포그라운드 위치의 필요성을 선언 등을 확인할 수가 있습니다.

그리고 해당 악성코드를 실행을 시키면 계정을 만들기 위해서 휴대폰 인증을 하라고 하지만 그냥 대충 넣어도 해당 악성코드는 동작을 합니다.즉 개인적인 생각으로 전화번호를 탈취 하기 위한 작전이 아닐까? 생각 이 됩니다.

악성코드 친구 초대 코드 입력
악성코드 친구 초대 코드 입력

그리고 최종 단계에서는 친구 초대 코드 입력 이라는 메세지가 나오는 것을 볼수가 있습니다.

p028io.dcloud.common.adapter.p030ui.webview.WebLoadEvent 에서는 SMS(문자) 관련 코드를 확인할 수가 있습니다.

public boolean shouldOverrideUrlLoading(WebView webView, String str) {
        if (this.mAdaWebview == null) {
            return false;
        }
        Logger.m367e(TAG, "shouldOverrideUrlLoading url=" + str);
        AdaWebview adaWebview = this.mAdaWebview;
        adaWebview.mProgressIntValue = 0;
        adaWebview.mRecordLastUrl = str;
        if (adaWebview.checkOverrideUrl(str)) {
            Logger.m367e(TAG, "检测拦截回调shouldOverrideUrlLoading url=" + str);
            AdaFrameView adaFrameView = this.mAdaWebview.mFrameView;
            adaFrameView.dispatchFrameViewEvents(AbsoluteConst.EVENTS_OVERRIDE_URL_LOADING, "{url:'" + str + "'}");
            return true;
        }
        if (this.mAdaWebview.mFrameView.getFrameType() == 5 || (this.mAdaWebview.mFrameView.getFrameType() == 2 && directPageIsLaunchPage(this.mAdaWebview.obtainApp()))) {
            this.mAdaWebview.obtainApp().updateDirectPage(str);
        }
        if (!shouldRuntimeHandle(str) && this.mAdaWebview.mFrameView.getFrameType() != 6) {
            try {
                if (str.startsWith("sms:")) {
                    int indexOf = str.indexOf("sms:");
                    int indexOf2 = str.indexOf("?");
                    if (indexOf2 == -1) {
                        this.mAdaWebview.getActivity().startActivity(new Intent("android.intent.action.VIEW", Uri.parse(str)));
                        return true;
                    }
                    String substring = str.substring(indexOf + 4, indexOf2);
                    String substring2 = str.substring(indexOf2 + 1);
                    Intent intent = new Intent("android.intent.action.VIEW", Uri.parse("sms:" + substring));
                    intent.putExtra("address", substring);
                    intent.putExtra("sms_body", substring2);
                    this.mAdaWebview.getActivity().startActivity(intent);
                } else if (str.startsWith("intent://")) {
                    Intent parseUri = Intent.parseUri(str, 1);
                    parseUri.addCategory("android.intent.category.BROWSABLE");
                    parseUri.setComponent(null);
                    if (Build.VERSION.SDK_INT >= 15) {
                        parseUri.setSelector(null);
                    }
                    if (this.mAdaWebview.getActivity().getPackageManager().queryIntentActivities(parseUri, 0).size() > 0) {
                        this.mAdaWebview.getActivity().startActivityIfNeeded(parseUri, -1);
                    }
                } else {
                    AdaWebview adaWebview2 = this.mAdaWebview;
                    if (!(adaWebview2 == null || adaWebview2.getActivity() == null || !this.mAdaWebview.obtainApp().checkSchemeWhite(str))) {
                        this.mAdaWebview.getActivity().startActivity(new Intent("android.intent.action.VIEW", Uri.parse(str)));
                    }
                }
            } catch (Exception unused) {
                Logger.m367e(TAG, "ActivityNotFoundException url=" + str);
            }
            return true;
        } else if (!PdrUtil.isEmpty(this.mdcloudwebviewclientlister)) {
            return this.mdcloudwebviewclientlister.shouldOverrideUrlLoading(webView, str);
        } else {
            return false;
        }
    }

그리고 코드에 보면 检测拦截回调 이라는 중국어가 있는 것을 볼 수가 있으면 한국어로 번역하면 탐지 가로채기 콜백 이라는 것을 확인할 수가 있습니다.

p290io.p291dcloud.p333feature.p338barcode2.p339camera.C4260CameraManager 
에서는 카메라 관련 코드

C4260CameraManager
C4260CameraManager&nbsp;

/* renamed from: startPreview */
    public void mo14347startPreview() {
        try {
            Camera camera = this.f22399camera;
            if (camera != null && !this.f22406previewing) {
                camera.startPreview();
                this.f22406previewing = true;
            }
        } catch (Exception unused) {
        }
    }

    /* renamed from: stopPreview */
    public void mo14348stopPreview() {
        try {
            Camera camera = this.f22399camera;
            if (camera != null && this.f22406previewing) {
                if (!this.f22407useOneShotPreviewCallback) {
                    camera.setPreviewCallback(null);
                }
                this.f22399camera.stopPreview();
                this.f22405previewCallback.mo14355setHandler(null, null, 0, f22394mIsVerticalScreen);
                this.f22398autoFocusCallback.mo14326setHandler(null, 0);
                this.f22406previewing = false;
            }
        } catch (Exception unused) {
        }
    }

p290io.p291dcloud.p333feature.p338barcode2.p339camera.C4261FlashlightManager 에서는 setFlashlight(손전등 상태 설정) 부분이 들어가져 있는 것을 확인할 수가 있습니다

/* renamed from: setFlashlight */
    private static void m27101setFlashlight(boolean z) {
        Camera cameraHandler = C4260CameraManager.m27073get().mo14336getCameraHandler();
        Camera.Parameters parameters = cameraHandler.getParameters();
        if (z) {
            parameters.setFlashMode("torch");
        } else {
            parameters.setFlashMode("off");
        }
        cameraHandler.setParameters(parameters);
        if (C3866DeviceInfo.f20081sBrand.equalsIgnoreCase(C3887MobilePhoneModel.f20205XIAOMI) && Build.VERSION.SDK_INT == 19) {
            cameraHandler.stopPreview();
            cameraHandler.startPreview();
            cameraHandler.autoFocus(C4260CameraManager.m27073get().mo14335getAutoFocusCallback());
        }
    }
}

스마트폰 손전등 상태 설정
스마트폰 손전등 상태 설정

그리고 io.dcloud.feature.barcode2.decoding.CaptureActivityHandler 에서는 바코드, QR 코드 관련 코드들이 있는 것을 볼 수가 있습니다.

public final class CaptureActivityHandler extends Handler {
    public static final int CODE_AUTO_FOCUS = 1000;
    public static final int CODE_DECODE = 1004;
    public static final int CODE_DECODE_FAILED = 1001;
    public static final int CODE_DECODE_SUCCEEDED = 1002;
    public static final int CODE_DECODE_landscape = 1006;
    public static final int CODE_DECODE_portrait = 1005;
    public static final int CODE_QUIT = 1003;
    private static final String TAG = "CaptureActivityHandler";
    private final IBarHandler activity;
    private final DecodeThread decodeThread;
    private State state = State.SUCCESS;

    /* access modifiers changed from: private */
    public enum State {
        PREVIEW,
        SUCCESS,
        DONE
    }

    public CaptureActivityHandler(IBarHandler iBarHandler, Vector<BarcodeFormat> vector, String str, boolean z) {
        this.activity = iBarHandler;
        DecodeThread decodeThread2 = new DecodeThread(iBarHandler, vector, str, new ViewfinderResultPointCallback(iBarHandler.getViewfinderView()), z);
        this.decodeThread = decodeThread2;
        decodeThread2.start();
        resume();
    }

    public static Bitmap convertToBMW(Bitmap bitmap, int i, int i2, int i3) {
        int width = bitmap.getWidth();
        int height = bitmap.getHeight();
        int[] iArr = new int[(width * height)];
        bitmap.getPixels(iArr, 0, width, 0, 0, width, height);
        for (int i4 = 0; i4 < height; i4++) {
            for (int i5 = 0; i5 < width; i5++) {
                int i6 = (width * i4) + i5;
                int i7 = iArr[i6];
                int i8 = (i7 & -16777216) >> 24;
                int i9 = (16711680 & i7) >> 16;
                int i10 = (65280 & i7) >> 8;
                int i11 = 255;
                int i12 = i7 & 255;
                int i13 = i9 > i3 ? 255 : 0;
                int i14 = i12 > i3 ? 255 : 0;
                if (i10 <= i3) {
                    i11 = 0;
                }
                iArr[i6] = i14 | (i8 << 24) | (i13 << 16) | (i11 << 8);
                if (iArr[i6] == -1) {
                    iArr[i6] = -1;
                } else {
                    iArr[i6] = -16777216;
                }
            }
        }
        Bitmap createBitmap = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888);
        createBitmap.setPixels(iArr, 0, width, 0, 0, width, height);
        return ThumbnailUtils.extractThumbnail(createBitmap, i, i2);
    }

    public static Result decode(Bitmap bitmap, boolean z) {
        Result decode = DecodeHandler.decode(bitmap, z);
        if (decode != null) {
            return decode;
        }
        Result trySmallerBitmap = trySmallerBitmap(bitmap, true, z);
        if (trySmallerBitmap != null) {
            return trySmallerBitmap;
        }
        return tryBiggerBitmap(bitmap, z);
    }

    public static Result tryBiggerBitmap(Bitmap bitmap, boolean z) {
        if (bitmap == null) {
            return null;
        }
        int width = bitmap.getWidth();
        int height = bitmap.getHeight();
        if (width < 1200 && height < 1200) {
            Bitmap createBitmap = Bitmap.createBitmap(width + ItemTouchHelper.Callback.DEFAULT_DRAG_ANIMATION_DURATION, height + ItemTouchHelper.Callback.DEFAULT_DRAG_ANIMATION_DURATION, Bitmap.Config.ARGB_8888);
            Canvas canvas = new Canvas(createBitmap);
            canvas.drawColor(-1);
            canvas.drawBitmap(bitmap, 100.0f, 100.0f, new Paint());
            bitmap = createBitmap;
        }
        return DecodeHandler.decode(convertToBMW(bitmap, bitmap.getWidth(), bitmap.getHeight(), SubsamplingScaleImageView.ORIENTATION_180), z);
    }

    public static Result trySmallerBitmap(Bitmap bitmap, boolean z, boolean z2) {
        Bitmap bitmap2;
        Result result;
        int i;
        Bitmap bitmap3;
        Result result2;
        int i2;
        Bitmap bitmap4;
        Result result3;
        if (bitmap == null) {
            return null;
        }
        int width = bitmap.getWidth();
        int height = bitmap.getHeight();
        if (width >= 200 && height >= 200) {
            boolean z3 = width <= height;
            if (z3) {
                bitmap2 = Bitmap.createBitmap(bitmap, 0, 0, width, height / 2);
            } else {
                bitmap2 = Bitmap.createBitmap(bitmap, 0, 0, width / 2, height);
            }
            final ArrayList arrayList = new ArrayList();
            if (z) {
                result = DecodeHandler.decode(bitmap2, new ResultPointCallback() {
                    /* class io.dcloud.feature.barcode2.decoding.CaptureActivityHandler.AnonymousClass1 */

                    @Override // com.dcloud.zxing2.ResultPointCallback
                    public void foundPossibleResultPoint(ResultPoint resultPoint) {
                        arrayList.add(resultPoint);
                    }
                }, z2);
            } else {
                result = DecodeHandler.decode(bitmap2, z2);
            }
            if (result != null) {
                return result;
            }
            if (z) {
                i = arrayList.size();
                arrayList.clear();
            } else {
                i = 0;
            }
            if (z3) {
                int i3 = height / 2;
                bitmap3 = Bitmap.createBitmap(bitmap, 0, i3, width, i3);
            } else {
                int i4 = width / 2;
                bitmap3 = Bitmap.createBitmap(bitmap, i4, 0, i4, height);
            }
            if (z) {
                result2 = DecodeHandler.decode(bitmap3, new ResultPointCallback() {
                    /* class io.dcloud.feature.barcode2.decoding.CaptureActivityHandler.AnonymousClass2 */

                    @Override // com(.)dcloud.zxing2.ResultPointCallback
                    public void foundPossibleResultPoint(ResultPoint resultPoint) {
                        arrayList.add(resultPoint);
                    }
                }, z2);
            } else {
                result2 = DecodeHandler.decode(bitmap3, z2);
            }
            if (result2 != null) {
                return result2;
            }
            if (z) {
                i2 = arrayList.size();
                arrayList.clear();
            } else {
                i2 = 0;
            }
            if (z3) {
                bitmap4 = Bitmap.createBitmap(bitmap, 0, height / 8, width, (height / 4) * 3);
            } else {
                bitmap4 = Bitmap.createBitmap(bitmap, width / 8, 0, (width / 4) * 3, height);
            }
            if (z) {
                result3 = DecodeHandler.decode(bitmap4, new ResultPointCallback() {
                    /* class io.dcloud.feature.barcode2.decoding.CaptureActivityHandler.AnonymousClass3 */

                    @Override // com(.)dcloud.zxing2.ResultPointCallback
                    public void foundPossibleResultPoint(ResultPoint resultPoint) {
                        arrayList.add(resultPoint);
                    }
                }, z2);
            } else {
                result3 = DecodeHandler.decode(bitmap4, z2);
            }
            if (result3 != null) {
                return result3;
            }
            if (z) {
                int size = arrayList.size();
                arrayList.clear();
                if (i > size && i > i2) {
                    return trySmallerBitmap(bitmap2, false, z2);
                }
                if (size > i2 && size > i) {
                    return trySmallerBitmap(bitmap4, false, z2);
                }
                if (i2 > size && i2 > i) {
                    return trySmallerBitmap(bitmap3, false, z2);
                }
            }
        }
        return null;
    }

    public void autoFocus() {
        CameraManager.get().requestAutoFocus(this, 1000);
    }

    public void handleMessage(Message message) {
        Bitmap bitmap;
        switch (message.what) {
            case 1000:
                Log.d(TAG, "Got auto-focus message");
                if (this.state == State.PREVIEW) {
                    CameraManager.get().requestAutoFocus(this, 1000);
                    return;
                }
                return;
            case 1001:
                Log.d(TAG, "CODE_DECODE_FAILED");
                this.state = State.PREVIEW;
                CameraManager.get().requestPreviewFrame(this.activity, this.decodeThread.getHandler(), 1004);
                return;
            case 1002:
                Log.d(TAG, "Got decode succeeded message");
                this.state = State.SUCCESS;
                Bundle data = message.getData();
                if (data == null) {
                    bitmap = null;
                } else {
                    bitmap = (Bitmap) data.getParcelable(DecodeThread.BARCODE_BITMAP);
                }
                this.activity.handleDecode((Result) message.obj, bitmap);
                if (bitmap != null) {
                    bitmap.recycle();
                    System.out.println("barcode.recycle");
                    return;
                }
                return;
            default:
                return;
        }
    }

    public void quitSynchronously() {
        this.state = State.DONE;
        CameraManager.get().stopPreview();
        Message.obtain(this.decodeThread.getHandler(), 1003).sendToTarget();
        try {
            this.decodeThread.join();
        } catch (InterruptedException unused) {
        }
        stopDecode();
    }

    public void restartPreviewAndDecode() {
        if (this.state == State.SUCCESS) {
            this.state = State.PREVIEW;
            CameraManager.get().requestPreviewFrame(this.activity, this.decodeThread.getHandler(), 1004);
            autoFocus();
        }
    }

    public void resume() {
        CameraManager.get().startPreview();
        this.activity.drawViewfinder();
        restartPreviewAndDecode();
    }

    public void stopDecode() {
        removeMessages(1002);
        removeMessages(1001);
        CameraManager.get().removeAutoFocus();
        this.state = State.SUCCESS;
    }
}

해당 악성코드 인증서 내용은 다음과 같습니다.
Signer MUFVBW.RSA (META-INF/MUFVBW.SF)
Type: X.509
Version: 3
Serial number: 0x2c262ffd
Subject: CN=CRoaxvBw, OU=nXvEtffd, O=OakgyEET, L=uNkybIpT, ST=dKzlNpKx, C=cn
Valid from: Fri Nov 26 08:05:35 GMT+09:00 2021
Valid until: Sun Nov 02 08:05:35 GMT+09:00 2121
Public key type: RSA
Exponent: 65537
Modulus size (bits): 1024
Modulus: 136485123865703111246222152585766344885262526231984662525984031755343056633503677951019873508707194799103704393610799921689119275198947708453545917158936730389789723836662608795805001597092009479257263655120728898818405890026474018465874350348887338744153525155620462842802311924937557964876752708262442703749
Signature type: SHA256withRSA
Signature OID: 1.2.840.113549.1.1.11
MD5 Fingerprint: F7 69 31 1E 7C 3C A7 47 CC 16 D4 60 0F 0E FD B0 
SHA-1 Fingerprint: 67 E6 0F D6 B8 06 3D 46 D3 59 BA B7 F3 7A 67 79 F4 41 A0 87 
SHA-256 Fingerprint: A7 33 A5 56 09 4D FD D0 64 0C 2E 77 CC 7F 0A 1B D6 3F 04 87 FE 1B 66 BC 96 D7 3B 1A 07 56 5E 65 

그리고 앱 실행 시 연결되는 인터넷 주소 및 ASN Name 정보는 다음과 같습니다.
121.199.166(.)100  China CNNIC-ALIBABA-CN-NET-APHangzhouAlibabaAdvertisingCoLtd 
121.41.178(.)115  China CNNIC-ALIBABA-CN-NET-APHangzhouAlibabaAdvertisingCoLtd
173.242.112(.)17 Canada IT7NETCA

악성코드에 포함된 주소는 다음과 같습니다.

http://ask.dcloud.net(.)cn/article/282
http://ask.dcloud.net(.)cn/article/283
http://ask.dcloud.net(.)cn/article/287
http://ask.dcloud.net(.)cn/article/35058
http(:)//localhost
http://m3w(.)cn/s/
http://schemas.android(.)com/apk/res/android
https://96f0e031-f37a-48ef-84c7-2023f6360c0a.bspapp(.)com/http/rewarded-video/report?p=a&t=
https://96f0e031-f37a-48ef-84c7-2023f6360c0a.bspapp(.)com/http/splash-screen/report
https://ask.dcloud.net(.)cn/article/35627
https://ask.dcloud.net(.0cn/article/35877
https(:)//localhost
https://service.dcloud.net(.)cn/sta/so?p=a&pn=%s&ver=%s&appid=%s
https://stream.dcloud.net(.)cn/
https://stream.mobihtml5(.)com/

요약
1.구글 플레이 스토어 및 공식 스토어 이외에 어플 설치하지 말 것
2.공신력 있는 백신 앱(안티바이러스 앱) 설치해서 실시간 감시 및 실시간 업데이트할 것(AV-TEST 참고)
3.구글 안드로이드 스마트폰에서는 외부 앱을 설치를 하려고 하면 경고 메시지가 나오는데 해당 경고 메시지처럼 외부 앱 설치하지 말 것
4.스팸 차단앱 후후,후스콜,T 전화 같은 것을 사용하면 이런 앱을 활용을 하면 이런 보이스피싱 피해를 줄일 수가 있습니다.
5.소개팅 어플에서 어떤 어플을 다운로드 해서 설치하라고 하면 100% 악성코드입니다.
기본적인 보안 수칙을 지킨다고 하면 이런 스미싱 피해는 줄일 수가 있습니다. 특히 이름 있는 백신 어플을 사용을 하면 기본적으로 악성코드가 유포되는 사이트 및 악성코드를 사전에 차단할 수가 있습니다. 
즉 공식 출처가 아니면 앱을 설치하는 것을 자제하고 그리고 공신력 있는 백신앱을 설치해서 사용하는 것이 안전하게 스마트폰을 사용하는 방법일 것입니다. 즉 해당 악성코드는 문자, 위치, 연락처에 권한을 부여해서 개인정보를 훔치는 기능을 합니다.

그리드형

공유하기

facebook twitter kakaoTalk kakaostory naver band