JS 역 혼동

10813 단어 혼동
특정한 플러그 인 을 사용 하 는 과정 에서 대량의 개성 화 된 수 요 를 만족 시 키 지 못 해서 나 는 소스 코드 를 바 꾸 려 는 충동 이 생 겼 다.모든 구석 을 뒤 져 서 압축 이 혼 란 스 러 운 js 파일 만 찾 았 습 니 다. 헷 갈 릴 수 있 는 지 여 부 는 이 절 토론 의 중점 입 니 다.
1. 장면 재현
먼저 몇 가지 우리 가 소스 코드 를 급히 알 아야 하 는 상황 을 말 해 보 자. 1. 소스 코드 를 읽 고 물론 대부분의 소스 코드 는 직접 볼 수 있다.2. 특정한 플러그 인 에 대한 개성 화 된 수요 변경 을 할 때 압축 되 지 않 은 코드 를 보고 싶 습 니 다.3. 코드 분석의 난이 도 를 높이 기 위해 혼동 (obfuscate) 도 구 는 많은 악성 소프트웨어 (예 를 들 어 0day 트레일러, 크로스 오 버 공격 등) 에 응용 되 었 다.분석가 들 은 악성 소프트웨어 의 베일 을 벗 기기 위해 먼저 스 크 립 트 를 혼동 (deobfuscate) 처리 해 야 한다.4. 다른 사람의 코드 를 베 끼 려 고 할 때 이 건 설명 할 수 없습니다.
본 고 는 앞의 두 장면 의 조건 에서 js 의 반 혼동 문 제 를 탐색 한다 고 가정 한다.
2. 방안 을 모색 한다.
문 제 를 신속하게 해결 하기 위해 서 우 리 는 먼저 기 존 방안 을 시도 해 보 자. 1. jsnice 2. aliasing 1 의 간단 한 예:
1
2
3
4
5
6
7
8
9
10
11
12
13
function chunkData(e, t) {
  var n = [];
  var r = e.length;
  var i = 0;
  for (; i < r; i += t) {
    if (i + t < r) {
      n.push(e.substring(i, i + t));
    } else {
      n.push(e.substring(i, r));
    }
  }
  return n;
}

 
분석 후:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
/**
 * @param {string} str
 * @param {number} step
 * @return {?}
 */
function chunkData(str, step) {
  /** @type {Array} */
  var colNames = [];
  var len = str.length;
  /** @type {number} */
  var i = 0;
  for (;i < len;i += step) {
    if (i + step < len) {
      colNames.push(str.substring(i, i + step));
    } else {
      colNames.push(str.substring(i, len));
    }
  }
  return colNames;
};

 
헷 갈 리 는 지 아 닌 지 는 가 독성 이 많이 강 해 졌 다.
2. js 코드 혼동 역장 도구 우 리 는 먼저 Lodash 에서 프 리 젠 테 이 션 코드 를 찾 습 니 다. 다음 과 같 습 니 다.
1
2
3
4
5
6
7
8
9
10
11
12
function arrayReduce(array, iteratee, accumulator, initAccum) {
  var index = -1,
      length = array == null ? 0 : array.length;

  if (initAccum && length) {
    accumulator = array[++index];
  }
  while (++index < length) {
    accumulator = iteratee(accumulator, array[index], index, array);
  }
  return accumulator;
}

 
보통 헷 갈 리 면 이렇게 된다.
1
function arrayReduce(RkeVlNGo1, ZPgGaWYOP2, uFMz3, dHyv4) {  var tTsFyC5 = -1,      sh6 = RkeVlNGo1 == null ? 0 : RkeVlNGo1["\x6c\x65\x6e\x67\x74\x68"];  if (dHyv4 && sh6) {    uFMz3 = RkeVlNGo1[++tTsFyC5];  }  while (++tTsFyC5 < sh6) {    uFMz3 = ZPgGaWYOP2(uFMz3, RkeVlNGo1[tTsFyC5], tTsFyC5, RkeVlNGo1);  }  return uFMz3;}

 
어떻게 헷 갈 리 는 지 테스트 하기 위해 서, 우 리 는 헷 갈 린 후 코드 를 복사 할 것 이다. jsnice :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
/**
 * @param {Object} collection
 * @param {?} callback
 * @param {Text} accumulator
 * @param {number} a
 * @return {?}
 */
function arrayReduce(collection, callback, accumulator, a) {
  /** @type {number} */
  var index = -1;
  var b = collection == null ? 0 : collection["length"];
  if (a && b) {
    accumulator = collection[++index];
  }
  for (;++index < b;) {
    accumulator = callback(accumulator, collection[index], index, collection);
  }
  return accumulator;
};

 
일반적으로 헷 갈 린 후에 도 코드 는 약간의 복원 을 할 수 있 음 을 알 수 있다.좋 습 니 다. 우 리 는 강 도 를 높 여 암호 화 압축 방식 을 사용 합 니 다.
1
eval(function(p,a,c,k,e,d){e=function(c){return(c35?String.fromCharCode(c+29):c.toString(36))};if(!''.replace(/^/,String)){while(c--)d[e(c)]=k[c]||e(c);k=[function(e){return d[e]}];e=function(){return'\\w+'};c=1;};while(c--)if(k[c])p=p.replace(new RegExp('\\b'+e(c)+'\\b','g'),k[c]);return p;}('b a(2,7,4,6){9 3=-1,5=2==8?0:2.5;e(6&&5){4=2[++3]}d(++3<5){4=7(4,2[3],3,2)}c 4}',15,15,'||array|index|accumulator|length|initAccum|iteratee|null|var|arrayReduce|function|return|while|if'.split('|'),0,{}))

 
이번 코드 는 현저히 많아 졌 고 jsnice 도 헷 갈 려 서 실 패 했 습 니 다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
eval(function(str, n, name, pair, func, opt_attributes) {
  /**
   * @param {number} i
   * @return {?}
   */
  func = function(i) {
    return(i < n ? "" : func(parseInt(i / n))) + ((i = i % n) > 35 ? String.fromCharCode(i + 29) : i.toString(36));
  };
  if (!"".replace(/^/, String)) {
    for (;name--;) {
      opt_attributes[func(name)] = pair[name] || func(name);
    }
    /** @type {Array} */
    pair = [function(timeoutKey) {
      return opt_attributes[timeoutKey];
    }];
    /**
     * @return {?}
     */
    func = function() {
      return "\\w+";
    };
    /** @type {number} */
    name = 1;
  }
  for (;name--;) {
    if (pair[name]) {
      /** @type {string} */
      str = str.replace(new RegExp("\\b" + func(name) + "\\b", "g"), pair[name]);
    }
  }
  return str;
}("b a(2,7,4,6){9 3=-1,5=2==8?0:2.5;e(6&&5){4=2[++3]}d(++3<5){4=7(4,2[3],3,2)}c 4}", 15, 15, "||array|index|accumulator|length|initAccum|iteratee|null|var|arrayReduce|function|return|while|if".split("|"), 0, {}));

 
이 코드 는 지구 인 들 이 이미 읽 을 수 없 을 정도 로 난잡 하 다.그렇다면 문제 가 생 겼 습 니 다. 암호 화 된 코드 는 정말 복원 할 방법 이 없 습 니까?
3. 사고 돌파
위의 프 리 젠 테 이 션 을 통 해 알 수 있 듯 이 암호 화 된 후의 혼동 은 이미 완전히 헷 갈 릴 수 없다.우리 가 알고리즘 을 헷 갈 리 는 것 을 알 지 않 는 한 헷 갈 리 는 방식 이 부지기수다. 헷 갈 리 는 방식 을 알 고 헷 갈 리 는 알고리즘 을 만들어 야 한다. 그러면 힘 들 어 죽 을 것 이다.
우리 가 그렇게 생각한다 면, 수렁 에 빠 져 자구 할 수도 없 을 것 이다.그렇다면 돌파 점 은 어디 일 까?
자 바스 크 립 트 는 해석 적 인 언어 로 관광 기 를 심각하게 의존 하 는 것 으로 알려 져 있다.자 바스 크 립 트 가 아무리 헷 갈 려 도 최종 브 라 우 저 는 가장 진실 한 코드 를 알 게 될 것 이다.그래서 우 리 는 브 라 우 저 를 돌파구 로 삼 을 수 있 었 다.
우선 원본 코드 를 동기 화 합 니 다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
function arrayReduce(array, iteratee, accumulator, initAccum) {
  var index = -1,
      length = array == null ? 0 : array.length;

if(typeof(iteratee) ==='function') throw 'jartto-test';

  if (initAccum && length) {
    accumulator = array[++index];
  }
  while (++index < length) {
    accumulator = iteratee(accumulator, array[index], index, array);
  }
  return accumulator;
}
arrayReduce();

 
그 다음 에 소스 코드 에 포함 되 어 있 는 지 확인 합 니 다.  eval  참고 코드 는 다음 과 같 습 니 다.
1
eval(function(p,a,c,k,e,d){e=function(c){return(c35?String.fromCharCode(c+29):c.toString(36))};if(!''.replace(/^/,String)){while(c--)d[e(c)]=k[c]||e(c);k=[function(e){return d[e]}];e=function(){return'\\w+'};c=1;};while(c--)if(k[c])p=p.replace(new RegExp('\\b'+e(c)+'\\b','g'),k[c]);return p;}('9 a(2,6,4,7){d 3=-1,5=2==e?0:2.5;8(b(6)===\'9\')h\'i-g\';8(7&&5){4=2[++3]}c(++3<5){4=6(4,2[3],3,2)}f 4}a();',19,19,'||array|index|accumulator|length|iteratee|initAccum|if|function|arrayReduce|typeof|while|var|null|return|test|throw|jartto'.split('|'),0,{}))

 
그리고 키 워드 를 찾 습 니 다.  throw 있 으 면 큰 걸음 에 성공 했다.마지막 으로 소스 코드 를 바 꾸 어 소스 코드 에 이상 을 던 지고 Eval 코드 가 실제 코드 를 복원 하도록 한다.
보 여 드 리 기 위해 서 우 리 는 소스 코드 에 어떤 특성 을 가지 게 하지만 실제 상황 은 이보다 훨씬 복잡 할 것 입 니 다.
사고 계몽: 헷 갈 린 자바 스 크 립 트 코드 를 해독 하 는 방법
4. 관련 도구 소개
우선 현재 자주 사용 되 는 혼동 도 구 를 살 펴 보 자.
  • YUI Compressor
  • Google Closure Compiler
  • UglifyJS
  • JScrambler

  • 혼동 방지 도구:
  • jsbeautifier
  • JSDetox

  • 더 많은 것 을 알 고 있 습 니 다. 참고 하 십시오. 몇 가지 흔히 볼 수 있 는 JavaScript 혼동 과 반 혼동 도구 분석 실전
    5. 혼동 수단 이해
    1. base 62 인 코딩 의 가장 뚜렷 한 특징 은 생 성 된 코드 가 eval (function (p, a, c, k, e, r) 로 시작 하 는 것 이다.
    여기 서 상기 역장 도구 의 암호 화 방식 을 보면 이해 하기 어렵 지 않다.
    이러한 혼동 의 관건 은 실행 해 야 할 코드 를 인 코딩 하고 실행 할 때 브 라 우 저가 실행 할 수 있 는 합 법 적 인 스 크 립 트 를 복원 한 다음 에 실행 하 는 것 이다.실행 가능 한 파일 의 케이스 와 비슷 해 보 입 니 다.Javascript 은 문자열 을 코드 로 실행 (evaluate) 하 는 능력 을 제공 합 니 다. Function 구조 기, eval, setTimeout, setInterval 을 통 해 문자열 을 js 엔진 에 전달 하여 해석 하고 실행 할 수 있 습 니 다.
     
    코드 가 어떻게 변형 되 든 간 에 최종 적 으로 eval 등 함 수 를 호출 해 야 합 니 다.복호화 방법 은 알고리즘 에 대한 분석 이 필요 하지 않 습 니 다. 이 최종 호출 을 간단하게 찾 아 console. log 또는 다른 방식 으로 바 꾸 고 프로그램 디 코딩 후의 결 과 를 문자열 로 출력 하면 됩 니 다.
    2. 암시 술 은 엄 밀 히 말 하면 혼동 이 라 고 할 수 없고 js 코드 를 특정한 미디어 에 숨 겼 을 뿐이다.최소 유효 비트 (LSB) 알고리즘 을 통 해 그림 에 삽 입 된 RGB 채널, 그림 EXIF 메타 데이터 숨 기기, HTML 공백 문자 숨 기기 등 이다.
    예 를 들 어 이 놀 라 운 의제: 는 그림 에 악성 프로그램 을 삽입 한 것 이 바로 가장 효과 적 인 비트 평면 알고리즘 을 사용 한 것 이다.HTML 5 의 canvas 나 바 이 너 리 데 이 터 를 처리 하 는 TypeArray 를 결합 하면 스 크 립 트 는 캐리어 에 숨겨 진 데 이 터 를 추출 할 수 있 습 니 다 (예 를 들 어 코드).
    암시 적 으로 쓰 는 방식 역시 디 코딩 프로그램 과 동적 으로 실행 되 어야 하기 때문에 해독 방식 은 전자 와 같 습 니 다. 브 라 우 저 컨 텍스트 에서 관건 적 인 함수 호출 행 위 를 납치 하고 텍스트 출력 으로 바 꾸 면 캐리어 에 숨겨 진 코드 를 얻 을 수 있 습 니 다.
    3. 복잡 한 표현 식 코드 혼동 은 반드시 eval 을 호출 하 는 것 이 아니 라 코드 에 잘못된 명령 을 채 워 코드 의 복잡 도 를 증가 시 켜 가 독성 을 크게 낮 출 수 있 습 니 다.Javascript 에는 미 친 듯 이 라 고 할 수 있 는 특성 이 많이 존재 합 니 다. 이러한 특성 을 조합 하면 원래 의 간단 한 글자 수 (Literal), 구성원 방문 (MemberExpression), 함수 호출 (CallExpression) 등 코드 세 션 을 읽 기 어렵 게 만 들 수 있 습 니 다.
    간단 한 예 를 들 면 더 잘 이해 할 수 있 습 니 다.
  • 한 대상 을 방문 하 는 구성원 은 두 가지 방법 이 있 습 니 다. 점 연산 자 와 아래 표 연산 자 입 니 다.window 의 eval 방법 을 호출 하면 window. eval () 로 쓸 수도 있 고 window [eval] 로 쓸 수도 있 습 니 다.
  • 코드 를 좀 더 변태 적 으로 만 들 기 위해 믹서 는 두 번 째 쓰기 방법 을 선택 한 다음 에 문자열 의 글자 크기 에 글 을 쓴다.먼저 문자열 을 몇 부분 으로 뜯 습 니 다. 'e' + 'v' + 'al';
  • 이렇게 보면 아직도 뚜렷 하 다. 하나의 디지털 진법 전환 기 교 를 이용 하 자. 14. toString (15) + 31. toString (32) + 0xf 1. toString (22);
  • 쉬 지 않 고 숫자 도 펼 칩 니 다. (0b 1110). toString (4 < 2) + ('. charCodeAt () - 1). toString (Math. log (0x 100000000) / Math. log (2) + 0xf 1. toString (11 < 1);
  • 마지막 효과: window (2 * 7). toString (4 < 2) + ('. charCodeAt () - 1). toString (Math. log (0x100000000) / Math. log (2) + 0xf1. toString (11 < 1)')
  • js 에서 이러한 상호 역 연산 을 많이 찾 을 수 있 습 니 다. 무 작위 로 생 성 된 방식 으로 조합 하여 사용 하면 간단 한 표현 식 을 무한 복잡 화 할 수 있 습 니 다.
    여기까지 와 서 나 는 이미 머리 가 핑 돌 았 다.깊이 이해, estools 보조 혼동 자바 script 사용
    마지막
    JavaScript 는 함수 식 을 핵심 으로 하 는 다 중 모드 동적 약 한 유형의 스 크 립 트 언어 로 서 유연성 때문에 소스 코드 가 일부 압축 도구 처 리 를 거 친 후에 복원 하기 가 매우 어려워 졌 다.
    우리 가 복원 하려 고 애 쓰 는 코드 는 소스 코드 운행 절차 와 일치 하 는 또 다른 코드 일 수도 있 습 니 다.물론 우 리 는 미 지 의 영역 을 계속 탐색 하고 발굴 할 수 있다.
    7. 더 알 아 보기
  • l1l = document. all 특징 JS 믹서 반 혼동 프로 세 스 상세 설명
  • 헷 갈 리 는 기교 와 방법
  • 프론트 엔 드 가 JS 에 어떻게 암호 화 되 는 지
  •  
    전재 자 주석:
    온라인 헷 갈 리 는 사이트
    1.http://jsnice.org/
    2.http://tool.chinaz.com/js.aspx   JS 혼동 암호 화 압축 -- > 복호화
    3.https://beautifier.io/
    4.http://relentless-coding.org/projects/jsdetox/    온라인 버 전 없 음

    좋은 웹페이지 즐겨찾기