JS 역 혼동
10813 단어 혼동
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. 관련 도구 소개
우선 현재 자주 사용 되 는 혼동 도 구 를 살 펴 보 자.
혼동 방지 도구:
더 많은 것 을 알 고 있 습 니 다. 참고 하 십시오. 몇 가지 흔히 볼 수 있 는 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) 등 코드 세 션 을 읽 기 어렵 게 만 들 수 있 습 니 다.
간단 한 예 를 들 면 더 잘 이해 할 수 있 습 니 다.
여기까지 와 서 나 는 이미 머리 가 핑 돌 았 다.깊이 이해, estools 보조 혼동 자바 script 사용
마지막
JavaScript 는 함수 식 을 핵심 으로 하 는 다 중 모드 동적 약 한 유형의 스 크 립 트 언어 로 서 유연성 때문에 소스 코드 가 일부 압축 도구 처 리 를 거 친 후에 복원 하기 가 매우 어려워 졌 다.
우리 가 복원 하려 고 애 쓰 는 코드 는 소스 코드 운행 절차 와 일치 하 는 또 다른 코드 일 수도 있 습 니 다.물론 우 리 는 미 지 의 영역 을 계속 탐색 하고 발굴 할 수 있다.
7. 더 알 아 보기
전재 자 주석:
온라인 헷 갈 리 는 사이트
1.http://jsnice.org/
2.http://tool.chinaz.com/js.aspx JS 혼동 암호 화 압축 -- > 복호화
3.https://beautifier.io/
4.http://relentless-coding.org/projects/jsdetox/ 온라인 버 전 없 음
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
JS 역 혼동이러한 혼동 의 관건 은 실행 해 야 할 코드 를 인 코딩 하고 실행 할 때 브 라 우 저가 실행 할 수 있 는 합 법 적 인 스 크 립 트 를 복원 한 다음 에 실행 하 는 것 이다.실행 가능 한 파일 의 케이스 ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.