DEX 추출 스크립트

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

DEX 추출 스크립트

M LIN 20 14386 0

 //代码在android os: 7.1.2上测试通过

//32位的libart.so 

var openmemory = Module.findExportByName("libart.so", "_ZN3art7DexFile10OpenMemoryEPKhjRKNSt3__112basic_stringIcNS3_11char_traitsIcEENS3_9allocatorIcEEEEjPNS_6MemMapEPKNS_10OatDexFileEPS9_");


console.log("openmemory addr: "+openmemory);

Interceptor.attach(openmemory, {

    onEnter: function (args) {

      

        //dex起始位置

        var begin = args[1]

        console.log(begin);

        //打印magic

        console.log("magic : " + Memory.readUtf8String(begin))

        //dex fileSize 地址

        var address = parseInt(begin,16) + 0x20

        //dex 大小

        var dex_size = Memory.readInt(ptr(address))


        console.log("dex_size :" + dex_size)

        //dump dex 到/data/data/pkg/目录下

        var file = new File("/sdcard/unpack/" + dex_size + ".dex", "wb")

        file.write(Memory.readByteArray(begin, dex_size))

        file.flush()

        file.close()

    },

    onLeave: function (retval) {

        if (retval.toInt32() > 0) {

            

        }

    }

});




//64位的libart.so 

var openmemory = Module.findExportByName("libart.so","_ZN3art7DexFile10OpenMemoryEPKhmRKNSt3__112basic_stringIcNS3_11char_traitsIcEENS3_9allocatorIcEEEEjPNS_6MemMapEPKNS_10OatDexFileEPS9_");

console.log("openmemory addr: "+openmemory);

Interceptor.attach(openmemory, {

    onEnter: function (args) {

      

        //dex起始位置

        //64位这里获取的args[1]有bug,这里直接读取r0寄存器

        var begin = this.context.x0

        //console.log(this.context.x0);

        //打印magic

        console.log("magic : " + Memory.readUtf8String(begin))

        //dex fileSize 地址

        var address = parseInt(begin,16) + 0x20

        //dex 大小

        var dex_size = Memory.readInt(ptr(address))


        console.log("dex_size :" + dex_size)

        //dump dex 到/data/data/pkg/目录下

        var file = new File("/sdcard/unpack/" + dex_size + ".dex", "wb")

        file.write(Memory.readByteArray(begin, dex_size))

        file.flush()

        file.close()

    },

    onLeave: function (retval) {

        if (retval.toInt32() > 0) {

            

        }

    }

});

20 Comments
2 벌레 2019.11.19 15:24  
오.. 감사합니다!
3 50nday 2019.11.19 16:12  
함수명이 os별로 조금씩 다른데 확인 하시는것도 좋아요
5 파파엄마 2019.11.20 17:17  
아.. ㅎㅎ 감사합니다 !!
4 hekadan 2019.12.03 14:41  
감사합니다!!
4 신사 2019.12.07 02:01  
어렵기한데 감사합니다 항상 수고하셔요
2 username 2019.12.13 03:22  
매우 감사합니다
4 순수어린이 2019.12.17 14:00  
와 감사합니다.
6 Haclthesoul 2020.01.06 16:38  
var file = new File("/sdcard/unpack/" + dex_size + ".dex", "wb")
이 코드에서 아래와 같은 에러가 나는데 해결하신분 있으신가요?
Error: failed to open file (Permission denied)

파일을 직접 만들고(이미 만들어두고) 기록을 하면 되는데 그냥 frida로는 안되네요
6 Haclthesoul 2020.01.06 16:52  
하...ㅋㅋ
/data/data/pkg 경로로 하면 되네요...젠장 ㅋ
2 우아이요바바바비 2020.04.29 17:05  
/data/data/pkg 경로로해도 안되네요 젠장.. 자꾸 권한에러 나오네요
9 단향 2020.01.12 12:04  
8.0부터는 openmemory 함수가 없는데 어떻게 덤프해야하나요??
7 래바리 2020.04.03 18:37  
감사합니다.
1 sdfadf 2020.04.05 21:01  
너무 어려워서 천천히 공부해봐야겠네요
3 Linjjang 2020.04.09 11:35  
감사합니다
2 우아이요바바바비 2020.04.22 14:04  
솔루션중에 dex 올리고 삭제하는 솔루션이 있어서 해당 스크립트 사용해봤는데,
덤프는 성공하지만 메모리 내 쓰레기값들도 포함되어있어 그런지 jeb에서 제대로 된 디컴파일이 안되네요,,,
4바이트 nop 코드들이 중간중간 들어가있어 jeb에서 해석을 못하는거 같습니다
2 우아이요바바바비 2020.04.22 14:05  
그래서 솔루션이 dex 파일 삭제하기전에 멈춰 수동으로 추출한 결과랑 많이 달라서 린님도 이 스크립트로 제대로 덤프 떠지는지 궁금합니다.
M LIN 2020.04.22 14:57  
솔루션마다 방식이 제 각각이라 확실히 보시려면 디버거 붙인다음 art.so DexFile 로드하는쪽 브레이크 포인트 걸어서 확인해보셔요
3 Linjjang 2020.05.24 21:20  
감사합니다
1 2Doll 2020.07.19 15:34  
원하는 도구를 드디어 감사합니다 :)

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

1 박박박 2022.10.18 14:24  
감사합니다!