LIAPP 보호 솔루션 분석(Bypass)

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

LIAPP 보호 솔루션 분석(Bypass)

M LIN 10 443 2

Liapp 보호 솔루션 분석자료 입니다.


개요


- 보호 솔루션 보안성 검토 


분석


977ad473688c1b0b72f60b9a3268622b_1572669867_0528.png


- 앱 실행시 앱 샌드박스 영역 내 /files/.temp 에 로드에 필요한 파일들을 저장해둔다.


977ad473688c1b0b72f60b9a3268622b_1572669867_0711.png 


- 실제 실행시에는 DEX 및 jar, so 등이 로드되며 핵심적인 파일은 위 두 라이브러리 파일로 예상된다.

- LIAPPClient.sc : 안티디버깅 작동 및 핵심 모듈로드

- .tmp.0.?????(랜덤한 문자열) : 핵심 보호 솔루션 모듈


6cb870d0304ebf30f0aa1c01eac3d37e_1572593536_0026.png


- LIAPPClient.sc 라이브러리가 가장 먼저 로드된다.

- LIAPPClient.sc 초기 동작 흐름은 먼저 libc.so를 dlopen()한 뒤 시스템 함수들의 실제 위치를 dlsym()으로 가져오는것을 확인할 수 있다.

- 정적 분석을 방해하기 위한 꼼수로 볼수 있으며, 구조체에 담아 호출하여 사용된다.


6cb870d0304ebf30f0aa1c01eac3d37e_1572593536_0187.png


- 천천히 동작 로직들을 따라가다보면 안티 디버깅 작동 함수를 볼 수 있다.

- 스레드를 생성하는 부분이다.


6cb870d0304ebf30f0aa1c01eac3d37e_1572593536_0403.png


- fork()를 이용하여 자식프로세스가 부모프로세스에게 ptrace로 선점하여 디버깅을 방지하는 방법이 아닌 linker라는 실행 파일을 생성한 뒤 system() 함수를 이용하여 실행한다. 해당 프로세스는 메인 프로세스에게 ptrace 선점하여 안티디버깅 역할을 한다. 


6cb870d0304ebf30f0aa1c01eac3d37e_1572593536_0689.png


- ptrace 선점 안티디버깅 기능 우회 방법은 간단하다.

- 해당 프로세스가 종료되면 exit()를 호출하기 되는데 exit() 함수를 후킹하거나 분기(branch)문을 nop로 변경하면 우회할 수 있다.

- 그외에도 status, stat 등을 확인하는것을 확인할 수 있다. 분석안하고 후킹으로도 쉽게 우회된다. 뒤에 보면 알겠지만 후킹을 탐지하는게 아닌 단순히 frida 모듈이 로드되어 있는지만 체크한다.


6cb870d0304ebf30f0aa1c01eac3d37e_1572593536_0938.png


- 핵심 모듈인 ".tmp.0.?????" 와 같이 랜덤한 파일이름으로 생성되며 dlopen()을 이용하여 라이브러리를 로드하고, dlsym()으로 LIAPPFUNCTION 주소값을 가져오고 호출한다.

- 로드이후에는 파일을 삭제하는데 이때 remove 함수를 후킹하거나 dlopen 시점에서 파일을 가져오면 된다.

- Java_com_lockincomp_liapp_LC_I1() ->  dlopen(/data/data/패키지명/files/.tmp.0.YTZvoUnJG) 로드


6cb870d0304ebf30f0aa1c01eac3d37e_1572593536_12.png


- 핵심 라이브러리 또한 마찬가지로 libc.so dlopen -> dlsym으로 함수의 실제 주소를 함수 포인터로 호출하여 사용한다.


6cb870d0304ebf30f0aa1c01eac3d37e_1572593536_1408.png


- frida 탐지 로직은 위와 같으며 단순히 maps내에 frida 단어가 포함이 되어 있는지 체크한다.

- strstr, strcpy 등 함수 이름은 직접 이름을 복구하였다. 함수 포인터로 사용하기 때문에 구조체에 어떤 함수가 담기는지 분석해야 한다.

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

            onEnter: function(args) {

                this.arg1 = Memory.readUtf8String(args[1]);

            },

            onLeave: function(retval) {

                if (this.arg1.indexOf("frida") !== -1) { // && a == 0) {

                    retval.replace(0);

                }

                return retval;

            }

        });

- 이러한 간단한 스크립트로 쉽게 우회할 수 있다.

- 참고로 린엔진의 프리다 연동 기능은 이름이 변경되어 로드되기 때문에 이러한 단순한 탐지 구문 모두 우회할 수 있다.


6cb870d0304ebf30f0aa1c01eac3d37e_1572598433_046.png
 

- 메인 탐지로직은 위에 sub_3E540 탐지 메시지 출력하는 부분을 리턴시키면 쉽게 우회된다.

- 또한 해당 로직을 따라가보면 디버깅 체크(status, stat), 무결성 검사 등 핵심 탐지 로직을 확인할 수 있다.


결론


- blackmod, androidRepublic, PlatinMods 등 해외 모드앱 사이트들이 쉽게 우회할 수 있을것으로 추측된다. 

    - 실제 LIAPP 적용 게임들이 모드앱 사이트에 올라온것을 확인할 수 있었다. 

    - 게임 라이브러리 메모리 무결성 검사하는 기능도 없고 자체 보호 기능도 너무 단순하다.

- 리앱은 리버싱 문제 푸는 느낌이나서 재밌다. (알리바바, 텐센트 보호 솔루션을 보다 오면...)

- 보호 솔루션의 동작 방식 및 원리를 공부하고 싶다면 분석을 추천한다. 

    - 참고로 린엔진은 ptrace 선점 안티디버깅을 우회하기 때문에 모든 보호 솔루션을 우회할 수 있다.

10 Comments
3 하이큐 11.02 16:31  
와... 좋은 자료 감사합니다.
6 하늘사자 11.02 20:05  
클래스가 역시 다르네요~ . 좋은 자료 공유 감사합니다.
5 아수라발발이 11.02 23:35  
오우 밥 든든히 먹고 확인해바야겠군요 ㅋㅋㅋ
S 코드몽키 11.03 10:13  
보호솔루션 분석 +_+
3 뾰족 11.04 10:34  
멋지군요;
2 arahan 11.04 17:43  
먼저 좋은 분석 글 감사드립니다.

LIAPP  보호솔루션 앱을 구글링을 해바도 구할수가 없어서, 정식 홈페이지 가보니 가격도 만만치가 않아서.,..

혹시 분석 당시 사용했던 앱을 보내주실순 없는지요...

감사합니다.

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

M LIN 11.04 18:17  
댓글내용 확인
2 arahan 11.05 09:53  
댓글내용 확인
3 Haclthesoul 11.05 11:44  
댓글내용 확인
3 파파엄마 11.06 16:04  
우왕 리앱분석이라니 ㅋㅋㅋ 감사합니다 정독하고 따라해봐야겠네요