PowerShell 난독화 해제
난독화된 PowerShell 명령이나 스크립트를 붙여넣으세요. 브라우저에서 계층별로 디코딩됩니다 — 업로드 없음, 실행 없음 — 결과는 비활성 텍스트로 표시되고, 의심스러운 패턴은 확인할 단서로 나열됩니다.
PowerShell 난독화는 스크립트의 동작을 여러 계층 뒤에 숨깁니다. Base64 -EncodedCommand, gzip 압축, 문자 코드, 문자열 연결, -f 형식 연산자, 백틱 이스케이프 — 각 계층을 차례로 벗겨 읽을 수 있는 텍스트가 남거나, 정적 해제가 멈추는 지점에 도달합니다. 이 도구는 계층을 하나씩 벗기며 각 단계를 보여주므로, 실행하지 않고도 스크립트의 내용을 볼 수 있습니다. 스크립트가 Windows 이벤트 로그에서 왔다면 EVTX 뷰어가 .evtx 파일을 읽고 4104 이벤트에 플래그를 지정합니다. 다른 텍스트 로그에는 로그 파서가 중요한 행을 찾습니다. 함께 제공되는 글 PowerShell 스크립트 난독화 해제 방법에서는 각 계층과 안전한 작업 흐름을 글로 설명합니다.
마지막 업데이트:
이벤트 4104(PowerShell 스크립트 블록 로깅)는 긴 스크립트를 번호가 매겨진 조각으로 나눕니다. 조각을 붙여넣으면 — 헤더 순서는 상관없습니다 — ScriptBlockId별로 그룹화하고 MessageNumber 순으로 정렬한 뒤 결합합니다. 빠진 부분에는 플래그가 지정되며, 재조립된 텍스트는 난독화 해제 도구로 보낼 수 있습니다.
🔒 스크립트는 브라우저에서 풀리며 기기를 떠나지 않습니다. 계정 없음, 업로드 없음, 서버 호출 없음 — 그리고 여기의 어떤 것도 실행되지 않습니다.
붙여넣은 스크립트의 처리 방식
브라우저를 떠나는 것은 아무것도 없습니다. 스크립트는 이 페이지의 JavaScript로 로컬에서 풀립니다. 업로드 없음, 서버 호출 없음, 저장 없음, 계정 없음. 이는 중요합니다. 의심스러운 스크립트는 채팅에 붙여넣으면 안 됩니다 — 채팅이 실행하거나 인용하거나 저장할 수 있습니다 — 그리고 무엇을 하는지 보려고 실행해서도 안 됩니다. 페이지를 닫으면 버려집니다.
깨끗한 결과가 증명하지 않는 것
깨끗한 결과는 안전의 증거가 아닙니다. 알려진 계층이 적용되지 않았고 지표가 일치하지 않았다는 뜻일 뿐입니다. 동적으로 만들어지는 문자열, 암호화된 페이로드, 런타임에만 존재하는 값은 정적으로 풀 수 없으며, 지표가 없는 스크립트도 악성일 수 있습니다.
지표 일치는 악의의 증거가 아닙니다. 다운로드 크레이들, IEX, 인코딩된 명령은 관리와 배포에서도 정당하게 사용됩니다. 각 일치는 맥락에서 확인할 단서이지 판결이 아닙니다.
알 수 없는 스크립트를 무엇을 하는지 알아보려고 실행하지 마세요. 비활성 상태로 디코딩하고 결과를 EDR이나 샌드박스에 넘긴 뒤, 디코딩된 텍스트도 인코딩된 형태와 같은 의심으로 대하세요 — 그것은 증거이지 안전 증명서가 아닙니다.
해제 작동 방식
도구는 여덟 개 계층을 순서대로, 한 번에 한 단계씩 시도하며, 계층이 더 이상 적용되지 않거나 열 개 계층을 벗길 때까지 반복합니다. -EncodedCommand 추출(Base64를 UTF-16LE로, 실패 시 UTF-8), 순수 Base64 blob, gzip 또는 deflate 압축 해제(입력은 먼저 Base64로 감싸져 있을 수 있음), [char] 및 [char[]] 코드 시퀀스, 혼합 따옴표와 여러 줄에 걸친 문자열 연결, -f 형식 연산자, 백틱 이스케이프 제거, 그리고 ${...}와 $변수 플레이스홀더 목록 — 플레이스홀더는 절대 해결되지 않습니다. 값은 런타임에만 존재하기 때문입니다. 각 단계마다 변환 전후 텍스트와 문자 수가 표시됩니다.
도구가 하지 않는 일: 아무것도 실행하지 않습니다 — 결과는 비활성 텍스트이며, 페이지가 실수로도 실행할 수 없습니다. 동적으로 만들어지는 문자열, 암호화된 페이로드, 런타임에만 존재하는 값을 풀 수 없으며, 스크립트가 안전한지 판단하지도 않습니다. 지표는 패턴 일치일 뿐이며, 모든 계층을 뚫은 스크립트는 "더 이상 풀 수 없음"으로 보고되고 깨끗하다고 절대 말하지 않습니다.
스크립트 블록 로깅(이벤트 4104)은 PowerShell이 실제로 실행한 스크립트 텍스트를 기록하지만, 긴 스크립트는 약 4KB 조각으로 나뉘며 각 조각에는 ScriptBlockId, MessageNumber, MessageTotal이 붙습니다. 재조립 탭은 조각을 ScriptBlockId별로 그룹화하고 MessageNumber 순으로 정렬한 뒤 결합하고, 빠진 부분을 표시합니다 — 3개 중 2개이고 2번 조각이 빠진 그룹은 불완전하며, 빠진 텍스트는 추측할 수 없습니다. 재조립된 텍스트는 같은 난독화 해제 도구로 들어갑니다.
자주 묻는 질문
결과가 실행 가능한 스크립트가 아니라 비활성 텍스트로 표시되는 이유는 무엇인가요?
난독화 해제의 목적은 의심스러운 스크립트를 읽는 것이지 실행하는 것이 아니기 때문입니다. 디코딩된 텍스트는 여전히 페이로드를 다운로드하고 실행할 수 있습니다 — 복사 버튼이 있는 비활성 텍스트로 표시하면 검사하고 EDR이나 샌드박스와 공유할 수 있으며, 더블클릭의 위험을 감수하지 않아도 됩니다.
도구가 "더 이상 풀 수 없음"에서 멈췄습니다. 어떻게 해야 하나요?
남은 텍스트는 이 도구가 모르는 계층을 사용하거나, 런타임에 문자열을 만들거나, 암호화되어 있습니다 — 정적 해제는 한계에 도달했습니다. 알아보려고 실행하지 마세요. 인코딩된 형태와 부분 디코딩을 EDR이나 샌드박스에 넘기고, 알 수 없는 계층은 깨끗한 결과가 아니라 의심의 이유로 다루세요.
지표는 어떻게 활용하나요?
각각을 답이 아니라 질문으로 다루세요. 다운로드 크레이들은 URL이 어디를 가리키고 그 호스트가 예상된 것인지 묻고, AMSI 우회 패턴은 왜 스크립트가 스캐너를 무력화하려 하는지 묻고, 인코딩된 명령은 인코딩이 무엇을 숨겼는지 묻습니다. 무엇이든 결정하기 전에 EDR, 로그, 스크립트가 온 머신에서 맥락에 따라 하나씩 확인하세요.