1

난 deobfuscated 자바 스크립트를 수집하는 크롬 디버거를 실행하려고하지만 그것은 스크립트에 대한 큰 청크를 반환합니다. 크롬이 하나의 JavaScript 파일을 여러 개의 청크로 나누는 방법을 알고 싶습니다. 스크립트의 덩어리는 정확히 무엇입니까?Debugger.getScriptSource는 어떻게 작동합니까?

각 스크립트 파일, 스크립트 태그 및 eval() 함수에 대해 별도의 청크가 생성된다는 사실을 알고 있습니다. 난 그냥 청크가 만들어지는 모든 가능한 경우를 정확하게 지적하고자합니다. 예를 들어 lazy parsing도 일부 기능에 대해 청크를 생성합니까?

프로세스가 작동하는 방법에 대해 누군가가 어떤 문서를 가르쳐 줄 수 있다면 좋을 것입니다.

Chrome debugging protocol API used

+0

이 함수는 [id에 의한 스크립트를 가져옵니다] (https://cs.chromium.org/chromium/src/v8/src/inspector/v8-debugger-agent-impl.cc?l=662&rcl=f212dbeaa1c0b0c97ef1d01c4cf61a2d920157b8) . 따라서 V8 엔진이 어떻게 소스 코드에서 추론 할 수있는 ID를 할당하는지에 대한 질문이 있습니다. – wOxxOm

답변

2

Debugger.scriptParsed 이벤트를 찾을 각 스크립트에 대한 scriptId를 생성하는 것입니다. 파싱 ​​된 각 스크립트 파일은 이벤트를 발생시키고 고유 한 ID를 수신해야합니다. 개별 스크립트 파일뿐만 아니라 페이지 소스 내의 <script> 태그의 각 인스턴스는 고유 한 ID를 갖습니다.

이벤트 콜백이 전달되는 매개 변수가 많이 있습니다. arguments 개체를 로그 아웃하여 모든 인수를 검사 할 수 있습니다. 예를 들어, 스크립트 파일의 경우 url이 반환되고 startLine은 HTML 리소스에 나타나는 <script> 태그의 오프셋을 제공합니다.

on('Debugger.scriptParsed', function() { 
    console.log(JSON.stringify(arguments, null, 2)(
}); 

조사

업데이트 된 질문에 대한 응답에서, 나의 이해는 디버거 모드에서 전체 구문 분석을 시도하고 사전에 구문 분석과 최적화하려고하지 않는 것입니다. v8 코드 기반을 실제로 이해할 수 없었지만 약간의 테스트를 수행했습니다.

버튼과 별도의 스크립트 파일로 HTML 페이지를 만들었습니다. 페이지로드 직후에 하나의 함수를 실행했습니다. 버튼 클릭시 다른 기능이 실행됩니다.

document.addEventListener("DOMContentLoaded",() => { 
    document.getElementById('clickMe').addEventListener('click',() => clicked); 
}); 

나는 Debugger.scriptParsed에서 출력을 검사했다. 스크립트 파일을 바로 파싱했습니다. 버튼을 클릭하면 추가 출력 항목이 없습니다. eval을 사용하여 동적으로 호출되는 clicked을 호출하도록 처리기를 변경 한 경우 새로운 스크립트 청크가 출력됩니다.

eval('clicked()'); 

이것은 파서가 실행될 때까지 파서가 그것에 대해 알 수있는 방법이 없으므로 의미가 있습니다. 동일한 내용이 인라인 핸들러에도 적용됩니다. onclick="doSomething()"

다른 확장 기능은 Chrome 확장 URI 및 내부 URL입니다.

+0

Debugger.scriptParsed는 scriptId를 매개 변수로 사용합니까? 각 스크립트 파일, 스크립트 태그 및 eval() 함수는 별도의 청크로 구문 분석된다는 사실을 알고 있습니다. 난 그냥 청크가 만들어 질 모든 가능한 경우를 정확하게 지적하고 싶다. 예를 들어, 지연 구문 분석은 일부 기능에 대해 청크도 생성합니까? –

+0

아니요, 'Debugger.scriptParsed'는 V8 내부 함수에 의해 트리거되는 이벤트입니다. 반면 디버거.getScriptSource'는 (다른 매개 변수들 중에서)'scriptId'를 받아들이는 함수입니다, 그래서 당신은 보통 파싱 콜백에서 호출합니다. 나는 몇 가지 추가 노트를 추가했습니다. –