html 난독화는 가능한가 (Android Assets APK 압축해제)
Assets이라는 외부리소스 폴더에 html, js, css 등의 파일들을 넣고
해당 경로를 읽어 보여주는 웹뷰 형태로 안드로이드 앱을 개발한 후 APK를 생성하였다
APK는 알집 7집 등 여러 압축해제 프로그램으로 압축해제가 가능하며 압축을 해제하면 Assets 속의 파일이 그대로 보여진다
어떻게하면 html 파일을 제대로 볼 수 없게 할것인가를 고민해보았다
1. 파일 자체를 암호화 후 복호화해서 보여준다 (쉽게 복호화가 가능한 base64등의 인코딩이 아니라면 가장 확실한 방법인 것 같다)
2.귀찮으니까 바로 알아보기 어렵게만 작업해보자
1) 안드로이드 웹뷰를 생성할때 헤더 속 User-Agent 값을 변경할 수 있는데 특정 문자열을 삽입해봤다
webview.getSettings().setUserAgentString(webSettings.getUserAgentString()
.replace("Android", "niphyang 6developer Android"));
- User-Agent의 문자열 중 "Android"를 "niphyang 6developer Android"로 변경하였다
- 곧 이 값을 읽어올 예정이다
2) user-agent 값을 체크하여 "6developer"라는 문자열이 없으면 html 태그를 날려버리는 스크립트를 작성한다
function checkDevice(){
var userAgent=navigator.userAgent.toLowerCase();
if(userAgent.indexOf('6developer')>-1){
}else{
document.getElementsByTagName("html")[0].remove();
}
}
checkDevice();
- 위 소스에서 볼 수 있듯이 checkDevice() function을 실행하면 userAgent값을 체크하고 특정 값이 없으면 html태그를 삭제한다
var _0x550c=['userAgent','toLowerCase','indexOf','6developer','html','remove'];(function(_0x2bd3c3,_0x5b1d8b){var _0x279f6e=function(_0x471e05){while(--_0x471e05){_0x2bd3c3['push'](_0x2bd3c3['shift']());}};_0x279f6e(++_0x5b1d8b);}(_0x550c,0x1e6));var _0x56ae=function(_0xee206e,_0x405e6a){_0xee206e=_0xee206e-0x0;var _0x3e3658=_0x550c[_0xee206e];return _0x3e3658;};function checkDevice(){var _0x4b81bb=navigator[_0x56ae('0x0')][_0x56ae('0x1')]();if(_0x4b81bb[_0x56ae('0x2')](_0x56ae('0x3'))>-0x1){}else{document['getElementsByTagName'](_0x56ae('0x4'))[0x0][_0x56ae('0x5')]();}}checkDevice();
- 일단 js를 알아보기 어렵게 변경했더니 조금 어려워 졌고 이 소스를 모든 js파일에 넣고 모든 html파일에 넣었다
- 내 웹뷰가 아닌곳에서 실행되면 빈화면이 보여진다. 아직 부족하다
3) html 파일에 있는 모든 내용을 UTF-16 코드 유닛으로 변경하였다
<script language=javascript>document.write(String.fromCharCode(60,47,120,109,112,62,60,104,116,109,108,62,10,60,104,101,97,100,62,10,60,47,104,101,97,100,62,10,60,98,111,100,121,62,10,32,97,115,100,102,32,97,115,100,102,32,97,115,100,102,32,97,115,100,102,32,97,59,108,107,115,106,100,102,108,59,107,97,106,115,100,102,10,32,60,112,62,32,60,47,112,62,10,60,115,112,97,110,62,32,60,47,115,112,97,110,62,10,60,47,98,111,100,121,62,10,60,47,104,116,109,108,62,32));</script>
- 후에 UTF-16 코드 유닛을 다시 문자열로 변경 후 document.write로 뿌려줬다
- 해당 문자열에는 당연히 userAgent 값을 체크하여 html 태그를 삭제하는 로직이 들어가있다
첫번째 방법이 가장 확실하겠지만
내 소스를 탐내는 누군가가 그래도 어느정도 수고는 해야하지 않겠나 싶어서 주저리 주저리 적어보았다
이 밖에도 각종 난독화 도구들이 많이 있다 찾아보자
'개발 > Android' 카테고리의 다른 글
구글 플레이 기기 및 네트워크 악용 정책 위반 - 유튜브 백그라운드 (2) | 2019.11.20 |
---|---|
Android 루팅 여부, 루트 권한 체크하기 (0) | 2019.11.08 |
Android NetworkOnMainThreadException 해결 (0) | 2019.10.28 |
FCM 푸시 메시지를 구현하며 발생한 문제들을 모두 해결해보았다 (0) | 2019.10.07 |
구글 플레이스토어 지원하는 기기 0대 안드로이드 앱 배포 후 (4) | 2019.09.04 |