libmain.so이 로드되는 원리??

홈 > 커뮤니티 > 질문 게시판
질문 게시판

libmain.so이 로드되는 원리??

5 Bugday 8 6728
유니티 게임 후킹 공부중입니다.
dlopen 함수가 so에서 다른 so를 로드할 때 쓰는 함수라고 알고 있습니다.
dlopen 함수를 후킹해서 로드되는 so 파일들을 보면 libmain.so -> libunity.so -> libil2cpp.so 순으로 로드되는데요.
그렇다면 libmain.so 는 어떻게 로드되는건가요??
자바에서 JNI를 이용하여 System.loadLibrary()로 so를 로드할 수 있다고 알고있는데
System.loadLibrary()와 System.load() 함수를 후킹해봐도 libmain.so을 로드하고 있지않네여
다음은 dlopen를 후킹했을때 로드되는 값들입니다.
load Library    /system/lib/libknoxvpnfdsender.so
load Library    /data/app/com.habby.archero-1/lib/arm/libmain.so
load Library    libc.so
load Library    libc.so
load Library    /data/app/com.habby.archero-1/lib/arm/libunity.so
load Library    /system/lib/hw/gralloc.msm8974.so
load Library    libc.so
load Library    libc.so
load Library    /data/app/com.habby.archero-1/lib/arm/libil2cpp.so
load Library    egl/eglsubAndroid.so
load Library    /vendor/lib/egl/libGLESv2S3D_adreno.so
load Library    /system/lib/hw/gralloc.msm8974.so
load Library    libadreno_utils.so
load Library    egl/libGLESv2_adreno.so
load Library    libsc-a3xx.so
load Library    libGLESv2.so
load Library    /system/lib/hw/gralloc.msm8974.so
load Library    /data/app/com.google.android.webview-1/lib/arm/libwebviewchromium.so
load Library    /system/lib/libwebviewchromium_plat_support.so
load Library    libc.so
load Library    libc.so
load Library    /data/app/com.habby.archero-1/lib/arm/libBugly.so
load Library    /data/app/com.habby.archero-1/lib/arm/libgpg.so
load Library    /data/app/com.habby.archero-1/lib/arm/libgpg.so
load Library    /data/app/com.habby.archero-1/lib/arm/libgpg.so
load Library    /data/app/com.habby.archero-1/lib/arm/libgpg.so
load Library    /data/app/com.habby.archero-1/lib/arm/libgpg.so
load Library    /data/app/com.habby.archero-1/lib/arm/libgpg.so
load Library    /data/app/com.habby.archero-1/lib/arm/libgpg.so
load Library    /data/app/com.habby.archero-1/lib/arm/libgpg.so
load Library    /data/app/com.habby.archero-1/lib/arm/libgpg.so
load Library    /data/app/com.habby.archero-1/lib/arm/libgpg.so
load Library    /data/app/com.habby.archero-1/lib/arm/libgpg.so
load Library    /data/app/com.habby.archero-1/lib/arm/libgpg.so
load Library    /data/app/com.habby.archero-1/lib/arm/libgpg.so
load Library    /data/app/com.habby.archero-1/lib/arm/libgpg.so
load Library    /data/app/com.habby.archero-1/lib/arm/libgpg.so
load Library    /data/app/com.habby.archero-1/lib/arm/libgpg.so
load Library    /data/app/com.habby.archero-1/lib/arm/libgpg.so
load Library    /data/app/com.habby.archero-1/lib/arm/libgpg.so
load Library    /data/app/com.habby.archero-1/lib/arm/libgpg.so
load Library    /data/app/com.habby.archero-1/lib/arm/libgpg.so
load Library    /data/app/com.habby.archero-1/lib/arm/libgpg.so
load Library    /data/app/com.habby.archero-1/lib/arm/libgpg.so
load Library    /data/app/com.habby.archero-1/lib/arm/libgpg.so
load Library    /data/app/com.habby.archero-1/lib/arm/libgpg.so
load Library    /data/app/com.habby.archero-1/lib/arm/libgpg.so
load Library    /data/app/com.habby.archero-1/lib/arm/libgpg.so
load Library    /data/app/com.habby.archero-1/lib/arm/libgpg.so
load Library    /data/app/com.habby.archero-1/lib/arm/libgpg.so
load Library    /data/app/com.habby.archero-1/lib/arm/libgpg.so
load Library    /data/app/com.habby.archero-1/lib/arm/libgpg.so
load Library    /data/app/com.habby.archero-1/lib/arm/libgpg.so
load Library    /data/app/com.habby.archero-1/lib/arm/libgpg.so
load Library    /data/app/com.habby.archero-1/lib/arm/libgpg.so
load Library    /data/app/com.habby.archero-1/lib/arm/libgpg.so
load Library    /data/app/com.habby.archero-1/lib/arm/libgpg.so
load Library    /data/app/com.habby.archero-1/lib/arm/libgpg.so
load Library    /data/app/com.habby.archero-1/lib/arm/libgpg.so
load Library    /data/app/com.habby.archero-1/lib/arm/libgpg.so
load Library    /data/app/com.habby.archero-1/lib/arm/libgpg.so
load Library    /data/app/com.habby.archero-1/lib/arm/libgpg.so
load Library    /data/app/com.habby.archero-1/lib/arm/libgpg.so
load Library    libGLESv2.so
load Library    libEGL.so
load Library    libsc-a3xx.so
load Library    egl/libGLESv2_adreno.so
load Library    libsc-a3xx.so
8 Comments
6 짤랑이 2020.02.13 13:02  
샘플을 어떤것을 보셨는지 모르겠지만, 대충 유니티 앱 까보니, UnityPlayer class에 static block으로 system.loadlibrary(“main”) 을 호출해서
Libmain.so 를 로딩 하고 있네요...
5 Bugday 2020.02.13 13:59  
감사합니다 샘플은 궁수의전설입니다
근데 System.loadLibrary 함수를 후킹해서 입력 인자값을 봐도 main은 로그가 안찍히네요
대신 lib/에 있는 libBugly.so, libgpg.so라는 파일은 로드되는게 찍힙니다
이유가 뭘까여...
6 짤랑이 2020.02.13 13:58  
아.. archero 샘플이었네요.. 다시 보니 제가 봤던 거랑 약간 다르네요.. ( 근데 결국 위 댓글과 같습니다.  )

archero 의 경우에는 com.unity3d.player 패키지 UnityPlayer class의
static block에 loadLibraryStatic(ParametersKeys.MAIN); 란 코드가 있습니다.  ( 내부적으로  System.loadLibrary에 파라메터를 넘김 )

위 함수의 파라메터인 ParametersKeys.MAIN는
com.ironsouce.sdk.constants 패키지의 ParametersKeys class에 아래와 같이 정의 되어있네요
public static final String MAIN = "main";

따라서 종합적으로 보면 앞선 댓글처럼 system.loadlibrary(“main”) 를 호출해서 로딩하는 코드랑 같습니다.
5 Bugday 2020.02.13 14:03  
오 답변 감사합니다. 그런데 다른 클래스의 변수 값을 불러와서 함수를 콜해도  System.loadLibrary를 후킹 했을 때 main을 호출하는 로그가 찍혀야되는거 아닌가요?... ㅠ
집가서 한번 더 해보겠습니다.
6 짤랑이 2020.02.13 17:23  
직접 System.loadlibrary api 후킹해서 확인 해보니 아래와 같이 라이브러리 로딩되는것이 확인 됩니다.
[Asus Nexus 7::com.habby.archero]-> System.loadLibrary("main")
System.loadLibrary("webviewchromium")
System.loadLibrary("webviewchromium_plat_support")
System.loadLibrary("Bugly")
System.load("/data/app/com.habby.archero-1/lib/arm/libgpg.so")
6 짤랑이 2020.02.13 17:31  
안드로이드 5.1에서는 frida script를 아래와 같이 하니 잘 확인이 됩니다.

Java.performNow(function() {
    const System = Java.use('java.lang.System');
    const Runtime = Java.use('java.lang.Runtime');
    const VMStack = Java.use('dalvik.system.VMStack');

    System.loadLibrary.implementation = function(library) {
        try {
            console.log('System.loadLibrary("' + library + '")');

            // android 버전에 따라 loadlibrary에서 쓰는 Runtime.getRuntime().loadLibrary 함수가 다르네요 이부분은 환경에 따라 수정해 주어야 합니다.
            Runtime.getRuntime().loadLibrary(library, VMStack.getCallingClassLoader());
         
        } catch(ex) {
            console.log(ex);
        }
    };

});
5 Bugday 2020.02.15 21:26  
답변 감사합니다.  알려주신 코드 참고 덕분에  System.loadLibrary 에서 libmain.so 올라오는거 확인했습니다!
4 신사 2020.02.14 04:37  
좋은글 감사합니다