방법

2016-10-08 1 views
2

나는이 보이는 자바 스크립트 해제 당황하게하는 방법을 알아 퍼즐 노력하고 있어요 :방법

https://jsfiddle.net/douglasg14b/4951br9f/2/

var testString = 'Test | String' 
 

 
var wf6 = { 
 
fq4: 'su', 
 
k8d: 'bs', 
 
l8z: 'tri', 
 
cy1: 'ng', 
 
t5j: 'te', 
 
ol: 'stS', 
 
x3q: 'tri', 
 
l9x: 'ng', 
 
gh: 'xO' 
 
}; 
 

 

 
//Obfuscated 
 
let test1 = testString[wf6.fq4 + wf6.k8d + wf6.l8z + wf6.cy1](4,11); 
 

 
//Normal 
 
let test2 = testString.substring(4,11); 
 
let test3; 
 

 
//More complex obfuscation 
 
(function moreComplex(){ 
 
\t let h = "i", 
 
     w = "nde", 
 
     T0 = "f", 
 
     hj = '|', 
 
     a = eval(wf6.t5j + wf6.ol + wf6.x3q + wf6.l9x).length; 
 
    //Obfuscated 
 
    test3 = testString[wf6.fq4 + wf6.k8d + wf6.l8z + wf6.cy1](testString[h + w + wf6.gh + T0](hj), a); 
 
    
 
    //Normal 
 
    let test4 = testString.substring(testString.indexOf('|'), testString.length); 
 
     
 
})(); 
 

 
$('.span1').text(test1); 
 
$('.span2').text(test3);
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> 
 
<span class="span1"></span><br> 
 
<span class="span2"></span>

이것은 작은 예제입니다. 제가 사용하고있는 파일은 ~ 60k 라인이며, 이런 종류의 난독 화입니다. 문자열을 속성 이름으로 사용할 수있는 모든 곳에서는 이러한 종류의 난독 화가 사용됩니다.

내가 이것을 할 수있는 방법은 모든 문자열 연결을 평가하여 읽을 수있는 동등한 것으로 변환하는 것입니다. 그러나, 나는 이것에 대해 어떻게 가고 모든 연결 사이에 존재하는 모든 다른 작업 코드를 무시할 지 모르겠다.

생각하십니까?

보너스 질문 :이 종류의 난독 화에 대해 검색을 좀 더 쉽게 할 수있는 일반적으로 사용되는 이름이 있습니까?

편집 : 더 복잡한 예가 추가되었습니다.

답변

4

당신은 기본 아이디어가 있습니다 : 당신은 프로그램을 partially-evaluate해야하고 모든 상수 계산을 미리 계산해야합니다. 귀하의 경우, 주요 관심사에 대한 지속적인 계산은 변경되지 않는 값에 대한 연결 단계입니다.

이렇게하려면 program transformation system (PTS)이 필요합니다. 이 도구는 지정된 언어에 대한 소스 코드를 읽고 파싱하고 추상 구문 트리를 작성하고 AST에 대한 변환 및 분석을 지정하고 실행 한 다음 수정 된 AST를 소스 코드로 다시 추출하는 도구입니다.

귀하의 경우, 드물게 자바 스크립트를 알기 위해 유선 된 PTS 또는 자바 스크립트에 대한 설명을 수락하고 기꺼이 자바 스크립트를 읽을 수있는 의사를 분명히 드리고 싶습니다. 또는 자바 스크립트 설명을 쉽게 얻을 수 있습니다. [나는 JavaScript 설명을 사용할 수있는 PTS를 만들었고, 내 글을 참고하십시오]. 손에 그와

, 당신은 필요에 :

  • 코드 그 표현이 일정 있는지 확인하기 위해 표현식에서 발견 된 각 변수를 검사 분석기 (예를 들어, "WF6"). 변수 정의를 찾으려면 변수 정의를 찾아서 변수 정의에 사용 된 모든 값이 그 자체로 상수인지 확인해야합니다. 둘 이상의 변수 정의가있는 경우, 모든 정의가 동일한 값을 생성하는지 점검해야합니다. 변수에 대한 부작용이 있는지 확인해야합니다 (예 : 변수의 값을 수정할 수있는 "foo (..., wf6, ...)"함수 호출이 없음). 이러한 부작용을 수행하는 eval 명령이 있는지 여부를 걱정할 필요가 있습니다.이 작업은 사실상 불가능합니다. 따라서 종종 evals를 무시하고 그런 작업을 수행하지 않는다고 가정해야합니다. 많은 PTSes에는 이러한 분석기를 구축 할 수있는 방법이 있습니다. 일부는 다른 것보다 쉽습니다.
  • 모든 상수 값 변수에 대해 해당 코드의 변수 값을
  • 으로 대체하십시오. 이러한 대체 후에 모든 상수 값 하위 표현식에 대해 해당 표현식의 결과를 "fold"(계산)하고 해당 값으로 대체하십시오 접미사를 더 이상 사용할 수 없을 때까지 반복합니다. 분명히 적어도 모든 "+"연산자에 대해이 작업을 수행하려고합니다.[방공호가 그의 예를 수정했습니다. 그는 모든 피연산자가 상수 일 때도 "eval"연산자를 사용하기를 원할 것입니다.
  • 당신은 변수가 지금

위의 과정이 컴파일러 문헌에 "일정한 전파"이라고 상수 값을 가지고 있음이 분명 할 수있는 표현을 접이식으로,이 과정을 반복해야하고 기능입니다 수 있습니다 많은 컴파일러의.

경우에 따라 상수 접기를 문자열 연결로만 제한 할 수 있습니다. 그러나 일단 상수 값 전파를 수행 할 수있는 적절한 기계가 있으면 상수에 대해 모든 연산자 또는 대부분의 연산자를 수행하는 것이 그리 어렵지 않습니다. 이 작업중인 코드에서 사용되는 난독 화 스타일 인 것처럼 보이기 때문에 상수와 관련된 다른 난독 화를 취소하려면이 옵션이 필요할 수 있습니다.

당신은 마지막 단계로

var.string(args) 

var['string'](args) 

을 변환하는 특별한 규칙이 필요합니다.

또 다른 문제가 있습니다. 즉, 상수 값 변수를 생성하는 데 필요한 JavaScript가 모두 있다는 것입니다. 단일 웹 페이지에는 많은 JavaScript 덩어리가 포함될 수 있습니다. 변수에 부작용이 없다는 것을 증명하기 위해 모든 변수가 필요합니다. 나는 네가 그걸 가지고 있다고 확신한다.

알려진 상수 값을 생성하는 것과 관련하여 까다로운 경우, 즉 상수가 아닌 피연산자로부터 상수 값을 생성하는 표현식에 대해 걱정할 수 있습니다. 난독 화 된 표현이 다음과 같았다고 가정 해보십시오.

x=random(); // produce a value between 0 and 1 
    one=x+(1-x); // not constant by constant propagation, but constant by algebraic relations 
    teststring['st'[one]+'vu'[one+1]+'bz'[one]+...](4,11) 

'substring'은 항상 속성으로 계산됩니다. 알려진 정수를 계산하는 데 사용되는 각 대수 트릭에 대한 규칙과 같이 "1"을 계산하는 데 사용 된 트릭을 이해하는 변환 규칙을 추가 할 수 있습니다. 불행히도 여러분에게는 상수를 제조하는 데 사용할 수있는 무한한 대수 정리가 있습니다. 얼마나 많은 코드가 예제 코드에서 실제로 사용됩니까? [똑똑한 적과 리버스 엔지니어링 문제에 오신 것을 환영합니다.]

아니,이 "쉬운". 아마도 이것이 난독 화 방법 이 사용 된 이유입니다.

+0

작성한 도구를 연결할 수 있습니까? 여기서 물어 보는 것을 할 수 있습니까? – Bergi

+0

수동으로 constness 분석을 할 수 있다면 (obfuscators는 대부분 상수 만 사용하기 때문에 일반적으로 간단합니다) 수동으로 [코드에서 정규식 바꾸기] (http : // stackoverflow)를 통해 "평가"를 수행 할 수 있습니다. com/q/30879056/1048572) – Bergi

+0

@Bergi :이 도구는 "DMS Software Reengineering Toolkit"이라고합니다. http://www.semanticdesigns.com/Products/DMS/DMSToolkit.html을 참조하십시오. –