Frida로 라이브러리 로드 정리 ( 내용추가 )

홈 > 안드로이드 > 안드로이드 > FRIDA
안드로이드

Frida로 라이브러리 로드 정리 ( 내용추가 )

9 BeastB 77 14058 4

1. 동작중인 패키지의 특정 라이브러리를 후킹하고 싶을 경우. ( 메소드명 )

var moduleName = "libil2cpp.so";

var hookFunctions = [

    {

        name: "_ZN9Character17calculateCoolTimeEf", //후킹할 메서드명 입력

        onEnter: function(args){

            // TODO: your code here

        },

        onLeave: function(ret){

            // TODO: your code here

        }

    },  

   {

        name: "sample1", //후킹할 메서드명 입력

        onEnter: function(args){

            // TODO: your code here

            console.log('hi')

        },

        onLeave: function(ret){

            // TODO: your code here

        }

    },

   {

        name: "sample2", //후킹할 메서드명 입력

        onEnter: function(args){

            // TODO: your code here

            console.log('hi')

        },

        onLeave: function(ret){

            // TODO: your code here

        }

    },

];

hookNative();

function hookNative(){

    for(var i = 0; i < hookFunctions.length; i++){

        Interceptor.attach(Module.findExportByName(moduleName, hookFunctions[i].name),{

            onEnter: hookFunctions[i].onEnter,

            onLeave: hookFunctions[i].onLeave

        });

    }

}


1-1. 동작중인 패키지의 특정 라이브러리를 후킹하고 싶을 경우. ( 주소값 ) 

var moduleName = "libil2cpp.so";

var hookFunctions = [

    {

        offset: "0x8456", // 오프셋 입력

        onEnter: function(args){

            // TODO: your code here

        },

        onLeave: function(ret){

            // TODO: your code here

        }

    },  

];


hookNative();


function hookNative(){

    var base_offset = Module.getBaseAddress(moduleName);

    for(var i = 0; i < hookFunctions.length; i++){

        var offset = base_offset.add(hookFunctions[i].offset) 

        Interceptor.attach(offset, {

            onEnter: hookFunctions[i].onEnter,

            onLeave: hookFunctions[i].onLeave

        });

    }

}

2. 특정 라이브러리가 로드 되었을 때, 후킹하고 싶을 경우. ( 메소드명 )

var moduleName = "libMyGame.so"; 

var moduleLoaded = 0

var hookFunctions = [

    {

        name: "_ZN9Character17calculateCoolTimeEf", //후킹할 메서드명 입력

        onEnter: function(args){

            // TODO: your code here

        },

        onLeave: function(ret){

            // TODO: your code here

        }

    },  

   {

        name: "sample1", //후킹할 메서드명 입력

        onEnter: function(args){

            // TODO: your code here

            console.log('hi')

        },

        onLeave: function(ret){

            // TODO: your code here

        }

    },

   {

        name: "sample2", //후킹할 메서드명 입력

        onEnter: function(args){

            // TODO: your code here

            console.log('hi')

        },

        onLeave: function(ret){

            // TODO: your code here

        }

    },

];

Interceptor.attach(Module.findExportByName(null, "android_dlopen_ext"), {

    onEnter: function (args) {

        var path = Memory.readUtf8String(args[0]);

        // console.log("[*] android_dlopen_ext( " + path + " )");

        if(path.indexOf(moduleName) != -1){

            moduleLoaded = 1

        }

    },

    onLeave: function(args) {

        if(moduleLoaded ==  1) {

            moduleLoaded = 0

            hookNative();

        }

    }

});

Interceptor.attach(Module.findExportByName(null, "dlopen"), {

    onEnter: function (args) {

        var path = Memory.readUtf8String(args[0]);

        // console.log("[*] dlopen( " + path + " )");

        if(path.indexOf(moduleName) != -1){

            moduleLoaded = 1

        }

    },

    onLeave: function(args) {

        if(moduleLoaded ==  1) {

            moduleLoaded = 0

            hookNative();

        }

    }

});

function hookNative(){

    for(var i = 0; i < hookFunctions.length; i++){

        Interceptor.attach(Module.findExportByName(moduleName, hookFunctions[i].name),{

            onEnter: hookFunctions[i].onEnter,

            onLeave: hookFunctions[i].onLeave

        });

    }

}

2-2. 특정 라이브러리가 로드 되었을 때, 후킹하고 싶을 경우. ( 주소값 ) 

var moduleName = "libMyGame.so"; 

var moduleLoaded = 0

var hookFunctions = [

    {

        offset: "0x8456", // 오프셋 입력

        onEnter: function(args){

            // TODO: your code here

        },


        onLeave: function(ret){

            // TODO: your code here

        }

    },  

];


Interceptor.attach(Module.findExportByName(null, "android_dlopen_ext"), {

    onEnter: function (args) {

        var path = Memory.readUtf8String(args[0]);

        // console.log("[*] android_dlopen_ext( " + path + " )");

        if(path.indexOf(moduleName) != -1){

            moduleLoaded = 1

        }

    },


    onLeave: function(args) {

        if(moduleLoaded ==  1) {

            moduleLoaded = 0

            hookNative();

        }

    }

});


Interceptor.attach(Module.findExportByName(null, "dlopen"), {

    onEnter: function (args) {

        var path = Memory.readUtf8String(args[0]);

        // console.log("[*] dlopen( " + path + " )");

        if(path.indexOf(moduleName) != -1){

            moduleLoaded = 1

        }

    },


    onLeave: function(args) {

        if(moduleLoaded ==  1) {

            moduleLoaded = 0

            hookNative();

        }

    }

});


function hookNative(){

    var base_offset = Module.getBaseAddress(moduleName);

    for(var i = 0; i < hookFunctions.length; i++){

        var offset = base_offset.add(hookFunctions[i].offset) 

        Interceptor.attach(offset, {

            onEnter: hookFunctions[i].onEnter,

            onLeave: hookFunctions[i].onLeave

        });

    }

}


설명 : hookFunctions 안이 Array로 되어있으니 첫번쨰 예제처럼 쭈욱 추가하시면 각각의 메서드를 후킹 하실수 있습니다.

1번째 방식은 attach 방식으로 실행하시면 되겠고, 2번쨰 방식은 Spawn 방식(-f 옵션)으로 실행하시면 될것 같습니다.


+ 내용추가

Method 명 이외의 Offset 기반의 코드를 추가했습니다.

Offset기반은 테스트를 못해봐서 문제있을시 댓글부탁드립니다


77 Comments
1 afdsaf 2020.09.06 08:55  
.....

Congratulation! You win the 14 축하드립니다! 당첨되셨어요~!

1 afdsaf 2020.09.06 08:56  
.....
1 afdsaf 2020.09.06 08:56  
.....
1 afdsaf 2020.09.06 08:56  
.....
1 afdsaf 2020.09.06 08:56  
.....
1 afdsaf 2020.09.06 08:56  
.....
1 afdsaf 2020.09.06 08:56  
.....
9 BeastB 2020.09.07 19:01  
이분 차단좀 부탁드립니다 이상한사람이네
9 선우아빠 2020.09.07 10:34  
와우 정말 감사힙니다. 궁금한게 두 번째 spawn 방식도 ilibil2cpp.so 후킹이 가능할까요?

Congratulation! You win the 9 축하드립니다! 당첨되셨어요~!

9 BeastB 2020.09.07 11:48  
안녕하세요 libil2cpp.so 랑 libMyGame.so  모두 후킹 가능합니다.
1번 , 2번 모두 소스 첫번쨰 라인인
var moduleName = "libMyGame.so"; 에 후킹할 라이브러리 명을 변경해주시면 됩니다.
9 선우아빠 2020.09.07 13:13  
첫 번째 스크립트 해보니 변화가 없네요.
il2cpp는 함수들이 가려져 있어서 보통 offset을 더하는데, 이 스크립트처럼 함수명을 입력하면 함수를 몾찾아서 후킹이 힘들지 않을까요?
9 BeastB 2020.09.07 15:53  
안녕하세요 ;) 선우아빠님 말씀하신 offset 기반의 코드를 추가했습니다.
시간이 없어서 테스트를 못해봤네요 선우아빠님이 결과 알려주셨음 좋겟습니다.
9 선우아빠 2020.09.07 17:10  
오 감사합니다. 해볼게요. 근데 자꾸 ㅠㅠ 제 환경도 문제라는 생각이 듭니다
9 선우아빠 2020.09.07 17:17  
저도 왜인지 무심코 하긴 했는데 인터센터 코드 없이 힘들지 않을까요? - > 아 밑에까지군요. 다시 해보겠습니다 ㅋㅋ
9 선우아빠 2020.09.07 18:03  
Error: unable to find module 'libil2cpp.so'
    at frida/runtime/core.js:222
    at hookNative (/basehookil2cpp.js:33)
    at /basehookil2cpp.js:28

    at /basehookil2cpp.js:28 이 부분은 hookNative(); 부분이고요

  at hookNative (/basehookil2cpp.js:35) 이 부분은  var base_offset = Module.getBaseAddress(moduleName); 요고 입니다.
9 BeastB 2020.09.07 18:58  
우선 1번방식쓸때 apk가 동작하고 있는 중에 실행하신것 맞는지 확인해 보시구요.
동작중에 난 에러가 맞다고 하면,

2번 방식인 spawn 방식으로 libil2cpp.so 라이브러리가 로드될때 후킹하는 방식을 시도해보셔야 할것 같습니다.

저는 방금 spawn 방식으로 정상적으로 후킹 작동하는거 확인했습니다
9 선우아빠 2020.09.07 19:12  
아 BeastB님이 되신다면, 전 뭔가 스크립트를 로드 하는 방식부터 글러먹었군요. (NOx 환경)
확인하는 방법 중 하나가 저 코드를 var moduleName = "libil2cpp.so"; 부터 그대로 js파일로 만든 다음에
게임을 켜고 frida -U -l 스크립트이름.js com.habby.archero 이런 식으로 스크립트를 로드하는 것이 아닌가요?

이 방식 말고 RMS라는 툴에서 attach나 spawn해서 스크립트 로드 방식으로 해도 에러는 발생하지 않는데 변경은 되지 않더라구요.
(코드를 그대로 써서 로드, Java.perform으로 감싸서 로드 두 가지 방법으로 해봤습니다)

파이썬 바인딩은 안해봤으나, RMS도 비슷한 방식일 것 같은데 혹시 파이썬 바인딩 방식으로 하시나요 ㅠㅠ?
9 BeastB 2020.09.07 19:19  
아 Nox 에뮬레이터를 사용하신다면 안되는게 맞아요.
Nox는 x86 기반 에뮬레이터기 때문에  libhoudini.so 라이브러리를 사용해서 libil2cpp.so 를 로드하기 때문에 frida에서 후킹이 안된다고 보시면 되구요. ( 혹시 방법아시는분 댓글좀 부탁드립니다 (굽신) )

실제로 frida 후킹하실떄 libhoudini.so 라이브러리가 로드되는지 확인해보세요 로드된다면 100%입니다
libil2cpp.so 의 baseAddress 를 가지고 올수가 없어요.

실기기에다가 magisk 같은걸로 루팅하시구 frida 올리고 테스트 해보시면 될거에요.
저같은 경우는 실기기에서 테스트를 완료했습니다.

그래서 린엔진을 사용한다면 됬는데 녹스에뮬레이터로 하면 안됐던거 같습니다..
9 선우아빠 2020.09.07 23:16  
와 정말 자세한 말씀 감사합니다. 빛과 같은 말씀을 ㅠㅠ

LD 3.8 버전대 사용을 하는데 프라다를 사용하면 앱이 자꾸 죽어서 녹스로 헸고요.
실단말기도 (pixelXl 7.1.1) 이유는 모르지만, 계속 재부팅이되서 또 녹스로 했는데 아흑 결국 실단말기가 필요한 것이었군요
처음에 배운 강의가 Nox를 이용한 강의라서 Nox로 계속 했어요 ㅠㅠ.

정말 고맙습니다.
얼마나 많은 스크립트를 넣어봤는지 셀 수 가 없군요-_-;;

루팅된 실단말기 하나 구해봐야겠네요. 정말 감사합니다~!!
9 선우아빠 2020.09.07 23:22  
혹시 Frida 공부에 대한 추천 자료 있을까요~? 불법적인 일을 하는 사람은 아닙니다!!
9 BeastB 2020.09.08 16:55  
저도 frida를 시작한지 얼마되지 않아서 ㅠㅠ 실제로 많이 해보는수 밖엔 없는것 같습니다
frida 스니펫 보고 분석한다던가 실제로 여러가지 앱들을 깔아보고 후킹해보고 그랬습니다.
직무가 개발쪽이라서 frida 코드 읽고 쓰기는 크게 어렵지 않았던거 같아요.
9 선우아빠 2020.09.08 17:46  
아하? frida 코드를 그냥 보시면서 공부하신건가요?
9 BeastB 2020.09.10 03:48  
자세한건 저한테 디코주세요 ^^
9 선우아빠 2020.09.10 09:47  
정말 감사합니다 ㅠㅠ
1 린엔진09 2020.09.15 15:21  
안녕하세요!!
3 가보자가보자 2020.09.16 20:29  
선생님 혹시 cocos2d-x 기반도 후킹이 가능한가요?
9 BeastB 2020.09.16 22:12  
위에보시면 libMyGame.so 로도 테스트 해보았습니다.
3 가보자가보자 2020.09.17 12:09  
아아...감사합니다 선생님.
1 동동키 2020.09.19 14:11  
감사합니다 il2cpp후킹시에 적용해봐야겠습니다!
1 파르르르 2020.09.21 17:44  
감사합니다 잘 적응해봐야겠습니다
1 민둘레 2020.09.24 12:41  
좋은정보 감사합니다^^
1 qsdfg 2020.10.04 17:41  
좋은정보 감사합니다
1 jtrwns 2020.10.06 00:11  
아직 이해가 잘 안 가지만 나중에는 이해할 수 있겠지요? 좋은 글 감사합니다.^^
1 ghkdwp 2020.10.06 15:34  
봐도 뭔지 모르겠네요 공부를 해야겠네요 감사합니다
1 강고동 2020.10.08 10:24  
감사합니다.
2 빙수 2020.10.08 16:00  
좋은정보 감사합니다~~!!
1 qweads 2020.10.08 17:28  
좋은정보 감사합니다!!!!!~!
2 LiRa 2020.10.10 12:37  
감사합니다
1 문명고고 2020.10.10 22:53  
좋은 정보 감사합니다
2 겜린이등장 2020.10.14 22:59  
봐도 뭔지 모르는거 아직 더 배워야한다는걸 깨닫게 됩니다..
1 moguri359 2020.10.16 23:34  
좋은 정보 감사합니다ㅎㅎ
1 지존 2020.10.17 22:29  
좋은 정보 감사용
1 hanabi 2020.10.23 10:31  
감상삽니다
같은방법으로 우선 공부하는것이가능해서 좋습니다
1 jjoonn 2020.10.24 22:02  
감사합니다
1 킁컹이 2020.10.25 18:18  
좋은정보 감사합니다
1 jeniaro 2020.11.08 03:21  
감사합니다
1 uijin 2020.11.12 11:47  
감사합니다
1 쿠랴깅 2020.11.14 08:18  
이거군요 ㅋㅋㅋ
1 Dntks 2020.11.29 13:36  
감사합니다
1 jiyu 2020.12.01 15:44  
좋은정보 감사합니다
1 휘날리는풀잎 2020.12.06 00:17  
좋은정보 감사합니다
1 koca 2020.12.12 21:07  
감사합니다
1 akcjvh 2020.12.23 11:04  
감사합니다
1 디멘치트 2020.12.26 02:00  
감사합니다
1 대교연 2021.01.06 18:51  
감사합니다
1 찌주루 2021.01.07 12:47  
감사합니다. 잘배워갑니다.!
2 Protainless 2021.01.10 23:35  
으억.. 엄청난 정보 감사합니다.

Congratulation! You win the 10 축하드립니다! 당첨되셨어요~!

1 웬리이 2021.01.14 16:48  
감사합니다
4 hooder 2021.01.19 14:06  
짱짱맨 감사합니다
1 cr0n 2021.01.19 17:55  
좋은 정보 감사합니다.
2 nz3ro 2021.01.23 16:26  
감사합니다!

Congratulation! You win the 2 축하드립니다! 당첨되셨어요~!

1 dnn1223 2021.01.25 21:37  
감사합니다
1 hpmx 2021.01.26 13:07  
감사합니다
1 푸른눈의백룡 2021.01.26 15:55  
감사합니다
5 킹왕짱 2021.02.02 04:42  
솔직히 지금은 잘 모르겠어요.
하지만 반복하다 보면 알게 되겠죠.
감사합니다

Congratulation! You win the 9 축하드립니다! 당첨되셨어요~!

1 omng 2021.02.04 08:38  
감사합니다
1 네온사인 2021.02.10 13:54  
좋은정보 감사합니다.
1 김유빈 2021.02.25 01:29  
감사합니다
1 응애 2021.03.05 15:21  
와우...
1 TTCL 2021.03.16 03:21  
좋은 정보 감사합니다
2 메시스 2021.04.09 23:33  
감사합니다
2 토커티브 2021.05.05 21:40  
onMatch 와 onEnter의 차이점이 어떤건가요??
2 토커티브 2021.05.05 21:41  
onEnter를 사용해도 후킹이되고 onMatch를 사용해도 후킹이되서 차이점을 찾는데 아직 이해가되지않네요
1 hgzone 2022.01.07 12:40  
좋은 정보 감사합니다!
2 디지털프라자 2022.02.16 03:13  
감사합니다

Congratulation! You win the 9 축하드립니다! 당첨되셨어요~!

2 leeSSi 2022.04.06 12:19  
감사합니다!
1 린린린 2023.03.25 01:19  
감사합니다