오픈 소스가 아닌 JavaScript 응용 프로그램을 만들고 싶기 때문에 JS 코드를 난독 화하는 방법을 배우고 싶습니다. 이것이 가능한가?
오픈 소스가 아닌 JavaScript 응용 프로그램을 만들고 싶기 때문에 JS 코드를 난독 화하는 방법을 배우고 싶습니다. 이것이 가능한가?
답변:
난처:
YUI 압축기를 사용해보십시오 . Yahoo UI 팀이 개발, 개선 및 유지 관리하는 매우 인기있는 도구입니다.
다음을 사용할 수도 있습니다.
업데이트 :이 질문은 원래 10 년 이상 전에 요청되었으며 YUI는 더 이상 유지되지 않습니다. Google Closure Compiler는 여전히 사용 중이며 노드 패키지 관리자를 통해 UglifyJS를 로컬로 실행할 수 있습니다.npm install -g uglify-js
개인 문자열 데이터 :
문자열 값을 비공개로 유지하는 것은 다른 관심사이며 난독 화는 실제로 큰 도움이되지 않습니다. 물론 소스를 깨져서 최소화 된 엉망으로 패키징하면 모호함을 통해 가벼운 보안 버전을 얻을 수 있습니다 됩니다. 대부분의 경우 소스를 보는 것은 사용자이며 클라이언트의 문자열 값은 사용 목적이므로 개인 문자열 값이 필요하지 않은 경우가 많습니다.
사용자가보고 싶지 않은 값을 실제로 가지고 있다면 몇 가지 옵션이 있습니다. 먼저 페이지로드시 해독되는 일종의 암호화를 수행 할 수 있습니다. 그것은 아마도 가장 안전한 옵션 중 하나 일뿐 만 아니라 불필요한 많은 작업 일 것입니다. 아마도 일부 문자열 값을 base64로 인코딩 할 수 있으며 더 쉬울 것입니다. 그러나 실제로 해당 문자열 값을 원하는 사람은 쉽게 해독 할 수 있습니다 . 암호화는 모든 사람이 데이터에 액세스하지 못하도록 막는 유일한 방법이며, 대부분의 사람들은 필요 이상으로 보안을 강화합니다.
사이드 노트 :
Javascript의 난독 화는 일부 버그를 일으키는 것으로 알려져 있습니다. 난 독자 들은 그것에 대해 조금 더 나아지고 있지만, 많은 복장들은 그들이 축소 하고 찌그러 뜨리는 것으로 부터 충분한 이익을 볼 것이라고 결정하고 , 난독 화의 추가 절약이 항상 문제의 가치가있는 것은 아닙니다 . 소스를 보호하려는 경우 코드를 읽기 어렵게 만드는 것이 가치가 있다고 판단 할 수 있습니다. JSMin 은 좋은 대안입니다.
--preserve-semi
. 개인 변수를 a, b, c 등으로 다시 쓰는 것이 일반적으로 안전합니다. 내가하는 또 다른 일은 코드에서 각 세미콜론 다음에 축소 기가 줄 바꿈을하도록하는 것입니다 --line-break 0
. 그런 다음 프로덕션에서 오류가 발생하면 작업 할 수있는 유효한 참조 줄이 없으며 개발 사본에서 해당 코드를 찾을 수 있습니다. 그렇지 않으면 방대한 코드 줄에 오류가 발생하고 오류의 위치를 알 수 없습니다.
구글 클로저 컴파일러에 대해 언급 한 사람이 아무도 없다 . 축소 / 압축뿐만 아니라 사용되지 않는 코드를 찾아 제거하기 위해 분석하고 최대 축소를 위해 다시 작성합니다. 또한 유형 검사를 수행 할 수 있으며 구문 오류에 대해 경고합니다.
JQuery는 최근 YUI Compresser에서 Closure Compiler로 전환하여 "고급 개선 "
난독 화는 실제로 작동하지 않습니다. 실제로 코드를 얻고 싶은 사람이라면 속도가 빨라집니다. 더 나쁜 것은 사용자가 버그를 수정하지 못하도록하고 수정 사항을 사용자에게 다시 전달하지 못하게하며 현장의 문제를 진단하기 어렵게 만듭니다. 시간과 돈을 낭비합니다.
지적 재산권 법과 귀하의 법적 선택에 대해 변호사와 상담하십시오. "오픈 소스" 는 "사람이 소스를 읽을 수 있음"을 의미하지 않습니다. 대신 오픈 소스는 코드를 자유롭게 사용하고 수정할 수있는 권한을 부여하는 특정 라이센스 모델입니다. 그러한 라이센스를 부여하지 않으면 코드를 복사하는 사람들이 위반되며 (대부분의 경우) 라이센스를 중지 할 수있는 법적 옵션이 있습니다.
코드를 실제로 보호 할 수있는 유일한 방법은 코드를 제공하지 않는 것입니다. 중요한 코드를 서버 측으로 옮기고 공개 Javascript 코드가 Ajax를 호출하도록하십시오.
당신이 원하는 모든 자바 스크립트 소스를 난독 화 할 수 있지만 클라이언트 시스템에서 실제로 모든 소스 코드를 실행해야하기 때문에 항상 리버스 엔지니어링 할 수 있습니다 ... 내가 생각할 수있는 가장 좋은 옵션은 모든 처리를 완료하는 것입니다. 서버 측 코드와 함께 자바 스크립트가 수행하는 모든 클라이언트 코드는 서버 자체에 처리 요청을 보냅니다. 그렇지 않으면 누구나 코드가 수행하는 모든 작업을 항상 추적 할 수 있습니다.
누군가 문자열을 안전하게 유지하기 위해 base64를 언급했습니다. 이것은 끔찍한 생각입니다. Base64는 코드를 리버스 엔지니어링하려는 사람들이 즉시 인식 할 수 있습니다. 그들이 할 첫 번째 일은 인코딩을 풀고 그것이 무엇인지 확인하는 것입니다.
자유롭게 사용할 수있는 많은 JavaScript 난독 화 도구가 있습니다. 그러나 JavaScript를 역 엔지니어링 할 수없는 수준으로 난독 처리하기가 어렵다는 점에 유의해야한다고 생각합니다.
이를 위해 어느 정도 초과 근무 시간에 사용했던 몇 가지 옵션이 있습니다.
유이 압축기 . Yahoo!의 JavaScript 압축기는로드 시간을 향상시키는 코드를 잘 압축합니다. 비교적 잘 작동하는 작은 난독 화 수준이 있습니다. 본질적으로 Compressor는 함수 이름을 변경하고 공백을 제거하며 지역 변수를 수정합니다. 이것이 내가 가장 자주 사용하는 것입니다. 이것은 오픈 소스 Java 기반 도구입니다.
JSMin 은 Douglas Crockford가 작성한 도구로 JavaScript 소스를 축소하려고합니다. 크록 포드 자신의 말에 따르면, "JSMin은 난독하지 않지만 어설프게 나타납니다." 기본 목표는 브라우저에서 더 빠르게로드 할 수 있도록 소스 크기를 최소화하는 것입니다.
무료 JavaScript Obfuscator . 이것은 실제로 코드를 인코딩하여 코드를 난독 처리하려는 웹 기반 도구입니다. 인코딩 방식 (혹은 난독 화)의 형태에 대한 절충은 파일 화 비용을 초래할 수 있다고 생각합니다. 그러나 그것은 개인적인 취향의 문제입니다.
[ZER0O00OIFY, ZER0000OIFY, ZEROO00OIFY, ZEROOO0OIFY]
적어도 [var1, var2,..]
1 분 안에 여러 가지를 찾을 수 없거나 교체 할 수없는 단일 프로그래머를 모른다 . 문자 그대로 2 분 안에 var 이름을 제거하고, 들여 쓰기하고, var 이름을 검색 / 대체 할 수 있습니다. 그리고 아뇨, 저는 평균적인 Jr. Dev보다 똑똑합니다. 간단한 사실은 클라이언트 쪽 JS를 가리는 방법이 없다는 것입니다. 최대 5 분만 구매할 수 있지만 소용이 없습니다. 이 항목은 실제로 추가 된 "보안"에 대한 코드를 모르는 사람을 판매하기위한 것입니다. JS 라인을 작성한 사람은 그 쓰레기를 사지 않을 것입니다.
내가 할 것 :
A. 해커를 트롤하십시오!
이것은 두 번째 부분에서 가짜 / 난독 화 된 비밀 자바 스크립트 코드 런처입니다. 소스 코드에서 볼 수있는 것.
이 코드는 무엇입니까?
var ajax=function(a,b,d,c,e,f){
e=new FormData();
for(f in d){e.append(f,d[f]);};
c=new XMLHttpRequest();
c.open('POST',a);
c.setRequestHeader("Troll1","lol");
c.onload=b;
c.send(e);
};
window.onload=function(){
ajax('Troll.php',function(){
(new Function(atob(this.response)))()
},{'Troll2':'lol'});
}
B. 코드를 약간 난독 처리
그게 뭐야?
(new Function(atob('dmFyIGFqYXg9ZnVuY3Rpb24oYSxiLGQsYyxlLGYpe2U9bmV3IEZvcm1EYXRhKCk7Zm9yKGYgaW4gZCl7ZS5hcHBlbmQoZixkW2ZdKTt9O2M9bmV3IFhNTEh0dHBSZXF1ZXN0KCk7Yy5vcGVuKCdQT1NUJyxhKTtjLnNldFJlcXVlc3RIZWFkZXIoIlRyb2xsMSIsImxvbCIpO2Mub25sb2FkPWI7Yy5zZW5kKGUpO307d2luZG93Lm9ubG9hZD1mdW5jdGlvbigpe2FqYXgoJ1Ryb2xsLnBocCcsZnVuY3Rpb24oKXsgKG5ldyBGdW5jdGlvbihhdG9iKHRoaXMucmVzcG9uc2UpKSkoKX0seydUcm9sbDInOidsb2wnfSk7fQ==')))()
C 실제 코드를 사용하여 PHP 파일을 표시하기 어렵게 만듭니다.
이 PHP 코드는 무엇입니까?
모든 것이 정상이라면 올바른 코드를 표시하거나 가짜 코드 또는 IP 금지를 표시합니다. 페이지를 닫으십시오.
<?php
$t1=apache_request_headers();
if(base64_encode($_SERVER['HTTP_REFERER'])=='aHR0cDovL2hlcmUuaXMvbXkvbGF1bmNoZXIuaHRtbA=='&&$_POST['Troll2']=='lol'&&$t1['Troll1']='lol'){
echo 'ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKSkuaW5uZXJUZXh0PSdBd2Vzb21lJzsNCg==';//here is the SECRET javascript code
}else{
echo 'd2luZG93Lm9wZW4oJycsICdfc2VsZicsICcnKTt3aW5kb3cuY2xvc2UoKTs=';
};
?>
base64 리퍼러 = http://here.is/my/launcher.html
비밀 자바 스크립트 = document.body.appendChild(document.createElement('div')).innerText='Awesome';
가짜 = window.open('', '_self', '');window.close();
이제 .. SECRET 자바 스크립트에서 이벤트 핸들러를 정의하는 경우 아마도 액세스 할 수 있습니다. 시작 코드를 사용하여 외부에서 중첩 된 SECRET 함수를 가리켜 서 정의해야합니다.
그래서 ... 코드를 얻는 쉬운 방법이 있습니까?
document.body.appendChild(document.createElement('div')).innerText='Awesome';
이것이 작동하는지 확실하지 않지만 크롬을 사용하고 요소, 리소스, 네트워크, 소스, 타임 라인, 프로필, 감사를 사용하고 있지만 위의 줄을 찾지 못했습니다.
참고 1 : Inspect element-> network에서 Troll.php URL을 크롬으로 열면 가짜 코드가 표시됩니다.
참고 2 : 전체 코드는 최신 브라우저 용으로 작성되었습니다. polyfill에는 더 많은 코드가 필요합니다.
편집하다
launcher.html
<!doctype html><html><head><meta charset="utf-8"><title></title><script src="data:application/javascript;base64,KG5ldyBGdW5jdGlvbihhdG9iKCdkbUZ5SUdGcVlYZzlablZ1WTNScGIyNG9ZU3hpTEdRc1l5eGxMR1lwZTJVOWJtVjNJRVp2Y20xRVlYUmhLQ2s3Wm05eUtHWWdhVzRnWkNsN1pTNWhjSEJsYm1Rb1ppeGtXMlpkS1R0OU8yTTlibVYzSUZoTlRFaDBkSEJTWlhGMVpYTjBLQ2s3WXk1dmNHVnVLQ2RRVDFOVUp5eGhLVHRqTG5ObGRGSmxjWFZsYzNSSVpXRmtaWElvSWxSeWIyeHNNU0lzSW14dmJDSXBPMk11YjI1c2IyRmtQV0k3WXk1elpXNWtLR1VwTzMwN2QybHVaRzkzTG05dWJHOWhaRDFtZFc1amRHbHZiaWdwZTJGcVlYZ29KMVJ5YjJ4c0xuQm9jQ2NzWm5WdVkzUnBiMjRvS1hzZ0tHNWxkeUJHZFc1amRHbHZiaWhoZEc5aUtIUm9hWE11Y21WemNHOXVjMlVwS1Nrb0tYMHNleWRVY205c2JESW5PaWRzYjJ3bmZTazdmUT09JykpKSgp"></script></head><body></body></html>
트롤 .php
<?php $t1=apache_request_headers();if(/*base64_encode($_SERVER['HTTP_REFERER'])=='PUT THE LAUNCHER REFERER HERE'&&*/$_POST['Troll2']=='lol'&&$t1['Troll1']='lol'){echo 'ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKSkuaW5uZXJUZXh0PSdBd2Vzb21lJzsNCg==';}else{echo 'd2luZG93Lm9wZW4oJycsICdfc2VsZicsICcnKTt3aW5kb3cuY2xvc2UoKTs=';}; ?>
JScrambler을 사용해보십시오 . 나는 최근에 그것을 스핀하고 그것에 감동했다. 세부 정보에 신경 쓰지 않고 신속하게 처리하려는 사람들을 위해 사전 정의 된 설정으로 난독 처리를위한 템플릿 세트를 제공합니다. 원하는 변환 / 기술을 선택하여 사용자 정의 난독 화를 생성 할 수도 있습니다.
인터프리터 언어의 문제점은 소스를 전송하여 소스 코드를 작동시키는 것입니다 (컴파일러가 바이트 코드로 작성되지 않은 한 다시 디 컴파일하는 것은 쉽지 않습니다).
따라서 성능을 희생하지 않으려면 예를 들어 변수 및 함수 이름에 대해서만 작업 할 수 있습니다. 그것들을 a, b ... aa, ab ... 또는 a101, a102 등으로 교체하십시오. 물론, 가능한 많은 공간 / 개행을 제거하십시오 (JS 압축기라고하는 것).
난독 화 문자열은 실시간으로 암호화하고 해독해야하는 경우 성능이 저하됩니다. 또한 JS 디버거는 최종 값을 표시 할 수 있습니다 ...
YUI Compressor에 대해 제안하는 다른 답변 대부분과는 반대로; Google Closure 를 사용해야합니다 .
압축률이 높지 않기 때문에 a = [1,2,3,];
IE를 haywire로 만드는 것과 같은 자바 스크립트 오류를 잡을 수 있기 때문입니다 .
클라이언트 측 코드를 보호 할 수 없습니다. Chrome에서 F12 키를 누르고 자바 스크립트 실행을 일시 중지 하면 모든 문자열, 심지어 암호화 된 문자열을 얻게됩니다. 그것을 아름답게 하고 변수의 이름을 바꾸면 거의 원래 코드를 얻을 수 있습니다.
서버 측 자바 스크립트 (예 : NodeJS)를 작성하는 사람이 누군가 서버에 해킹하는 것을 두려워하고 해커의 작업을 더 어렵게 만들고 다시 액세스 할 수있는 시간을 더 준다면 javacript 컴파일러 를 사용 하십시오 .
모든 파일 / 모듈에서 변수를 사용하는 경우에도 모든 변수의 이름을 바꾸는 유일한 도구이므로 고급 컴파일에서 폐쇄 컴파일러를 사용해야합니다. 그러나 그것은 단지 문제가 있습니다 : 그것은 당신이 코딩 스타일로 쓰는 경우에만 작동합니다 .
JavaScript Utility를 추천 할 수 있습니다Patrick J. O'Neil의 를 . 난독 화 / 압축 및 압축 할 수 있으며 이것에 꽤 좋은 것 같습니다. 즉, 나는 그것을 어떤 종류의 빌드 스크립트로 통합하려고 시도하지 않았습니다.
난독 화 대 축소-나는 전직 팬이 아닙니다. 디버깅이 불가능합니다 (1 행의 오류 ... "한 줄만 있습니다"). 항상 압축을 풀 때 시간이 걸립니다. 하지만 필요한 경우 ...
먼저 YUI Compressor와 같은 것으로 축소하고 http://www.javascriptobfuscator.com/ 과 같은 것을 사용하여 모든 문자열과 숫자를 16 진수 값으로 변환하는 것이 좋습니다 .
이를 통해 코드를 이해하기가 거의 불가능 해지며이 단계에서 해커가 코드를 처음부터 다시 작성하는 것보다 실제로 코드를 다시 작성하는 데 시간이 더 걸릴 것으로 생각합니다. 재 작성 및 복제는 실제로 멈출 수없는 것입니다. 결국 우리는 자유인입니다!
Dean Edward 's Packer는 훌륭한 난독 화 장치이지만 코드 내에 포함 된 문자열 요소가 아니라 코드를 난독 처리합니다.
온라인 Javascript 압축 도구를 참조 하고 드롭 다운에서 Packer (Dean Edwards)를 선택하십시오.
이 도구를 사용해보십시오 JavaScript Obfuscator
HTML5 게임에서 크기를 950KB에서 150으로 줄 였을뿐만 아니라 소스 코드를 읽을 수없는 클로저 컴파일러와 축소 장치를 뒤집을 수있게 만들었습니다.이 난독 화를 뒤집는 방법을 개인적으로 모른다.
나는 Jasob 을 몇 년 동안 사용해 왔으며 최고의 난 독자 입니다.
고급 UI가 있지만 여전히 직관적이며 사용하기 쉽습니다.
HTML 및 CSS 파일도 처리합니다.
그것을 사용하는 가장 좋은 방법은 모든 개인 변수 앞에 밑줄과 같은 접두어를 붙인 다음이 sort
기능을 사용하여 모두 그룹화하고 난독 화 대상으로 확인 하는 것입니다.
사용자는 여전히 소스를 볼 수 있지만 개인 변수가 같은에서 변환 될 때 그것은 암호문 해독에 훨씬 더 어려운 일 _sUserPreferredNickName
에 a
.
엔진은 대상 변수의 수를 자동으로 집계하여 최대 압축을 얻기 위해 우선 순위를 정합니다.
나는 Jasob에서 일하지 않고 그들을 홍보하는 것에서 아무 것도 얻지 못하고 친절한 조언을 제공합니다.
단점은 무료가 아니며 약간 비싸지 만 대안과 비교할 때 여전히 가치가 있다는 것입니다. '무료'옵션은 가깝지 않습니다.
Bananascript 사용해 보셨습니까 ? 압축률이 높고 읽을 수없는 코드를 생성합니다.
eval()
에 마지막 줄에 console.log()
당신의 콘솔이 모든 일을 뱉어
Java 스크립트 난독 처리를 위해 Closure-Compiler 유틸리티를 사용하고 있습니다. 코드를 축소하고 난독 처리를위한 더 많은 옵션이 있습니다. 이 유틸리티는 아래 URL의 Google 코드에서 사용할 수 있습니다.
폐쇄 도구
그러나 지금 나는 UglifyJS에 대해 많이 듣고 있습니다. Uglify가 승자로 보이는 Closure Compiler와 UglifyJS의 다양한 비교를 찾을 수 있습니다.
UglifyJS : 폐쇄와 동등한 Node.js를위한 새로운 JavaScript 압축기
곧 나는 UglifyJS에 기회를 줄 것이다.
JavaScript / HTML / CSS 난독 화기 / 압축기로 Patu Digua를 사용해 볼 수도 있습니다 .
이것은 축소 하지만 난독 화하지는 않습니다. 명령 행 Java를 사용하지 않으려면 Javascript를 웹 양식에 붙여 넣을 수 있습니다.
Obfuscriptor를 살펴보십시오. .
YUI Compressor 또는 Google Closure 와 같은 다른 도구에서 본 일반적인 Javascript 축소 트릭을 뛰어 넘습니다. .
난독 처리 된 코드는 암호화 된 것처럼 보입니다. 내가 전에 본 것과는 다릅니다.
JavaScript 라이브러리를 사용하는 경우 클로저 컴파일러의 고급 모드 컴파일과 호환되는 (조금 수정 후) Dojo 툴킷을 고려하십시오.
Dojo – 클로저 컴파일러와 호환되는 유일한 JavaScript 라이브러리
전체 코드베이스 (라이브러리 포함)가 난독 화 되어 클로저 고급 모드로 컴파일 된 코드는 리버스 엔지니어링하기가 거의 불가능합니다 . 평균 25 %도 작습니다.
단순히 축소 된 JavaScript 코드 (YUI Compressor, Uglify 등)는 미화기를 통과 한 후 리버스 엔지니어링하기 쉽습니다.
나는 이것을 과거에 사용해 왔으며 잘 작동합니다. 무료는 아니지만 확실히 살펴보십시오.
JavaScript Obfuscator 및 인코더