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 태그를 삭제하는 로직이 들어가있다

 

 

첫번째 방법이 가장 확실하겠지만

내 소스를 탐내는 누군가가 그래도 어느정도 수고는 해야하지 않겠나 싶어서 주저리 주저리 적어보았다

 

이 밖에도 각종 난독화 도구들이 많이 있다 찾아보자