0< /* :: @echo off set /a min = 15 set /a max = 45 :loop CScript //nologo //E:JScript "%~F0" "+{F15}" set /a rand = (%RANDOM% * (%max% - %min% + 1) / 32768) + %min% + 1 ping -n %rand% -w 1 127.0.0.1 > NUL goto :loop */ 0; WScript.CreateObject("WScript.Shell").SendKeys(WScript.Arguments(0));
잠시 시간을 내어 여기서 무슨 일이 일어나고 있는지 알아보세요.
계속하세요. 15~45초 정도 기다린 후 Shift F15 키 조합을 보내겠습니다.
F15 키는 존재하지만 대부분의 키보드에는 더 이상 없기 때문에 Shift F15를 누르면 일반적으로 키 조합을 누르는 역할을 하여 대부분의 경우 컴퓨터가 절전 모드로 전환되지 않도록 하는 것 외에는 아무 작업도 수행할 수 없습니다(일부 VDI 설정 제외). ).
일부 관리자는 JScript를 비활성화하지만 관리자 권한 없이 바닐라 Windows 설치에서도 작동합니다.
0< /* ::는 파일 설명자 0에 대한 파일로부터의 입력 리디렉션입니다. 이는 특수한 경우이며 표준 입력(STDIN)을 참조합니다. 예를 들어, 0< test.txt가 "hello"를 찾으면 쉘은 실제로 find "hello" 0 그러면 어떤 문자열이든지 거기에 /*를 사용할 수 있는 이유는 무엇일까요? 이는 javascript/jscript 블록 주석의 시작이고 jscript 인터프리터는 /*와 */ 사이의 일괄 스크립팅을 구문 분석하려고 시도할 필요가 없기 때문입니다. 그렇다면 jscript 인터프리터는 이 코드 덩어리를 어떻게 볼 수 있을까요? 0<부터 전체 블록을 읽습니다. /* ::에서 */ 0; 다음과 같이: 0 < 0; 이는 false로 평가되지만 중요하지 않습니다. 이는 유효한 jscript이고 부작용이 없으며 주요 장애물이 달성되었습니다. 즉, 어떤 인터프리터가 파일을 읽고 있는지에 따라 배치 스크립트 또는 jscript를 선택적으로 구문 분석하는 방법입니다. 에코 끄기, 변수 설정 및 레이블 루핑은 건너뛰겠습니다. 이는 매우 간단한 개념이지만 재미있는 사실은 ECMAScript에도 레이블이 있다는 것입니다. 다음으로 중요한 줄은 이 .bat 파일을 CScript로 보내는 CScript //nologo //E:JScript "%~F0" " {F15}"입니다. CScript는 여러 스크립트 엔진 선택 항목(이 경우 JScript)을 사용하여 명령줄 환경에서 스크립트를 시작합니다. WScript는 유사하지만 Windows GUI에서 스크립트를 실행하며 이 컨텍스트에서는 배치 파일의 마지막 줄과 완전히 관련되지 않습니다. $~F0은 현재 실행 중인 배치 파일의 전체 경로, 파일 이름 및 확장자입니다. {F15}는 Shift이고 SendKeys의 경우 F15 키입니다. 다시 말하면 이 배치 파일이 전송되면 전체 배치 스크립트가 0<0으로 표시됩니다. 그런 다음 유효한 JScript인 마지막 줄을 실행합니다. set /a rand = (%RANDOM% * (%max% - %min% 1) / 32768) %min% 1에 대한 유일한 흥미로운 점은 %RANDOM%이 정수를 생성하는 내장 변수라는 것입니다. 0에서 32767(포함)까지 set /a를 사용하면 항상 반올림되며 마지막 1은 특히 다음 줄에 사용됩니다. sleep 또는 timeout을 사용할 때는 1을 추가하지 않습니다. 다음 줄, ping -n %rand% -w 1 127.0.0.1 > NUL은 절전 및 시간 초과보다 프로세서 사용량이 적은 타이머를 만드는 오래된 방법입니다. 기본적으로 각 시도 사이에 1초 간격으로 자신에게 %rand% 번 핑을 보냅니다. 이전 줄의 1은 첫 번째 핑 전에 대기 시간이 없기 때문입니다. > NUL은 표준 출력을 NUL로 리디렉션하며 NUL은 이를 폐기합니다. 이 스크립트에 무한 루프가 없다면 goto :eof를 */ 0; 앞에 두는 것이 좋습니다. 배치 스크립트가 유효한 스크립트가 아닌 파일의 나머지 부분을 건너뛰도록 합니다. 마침내 실제 JScript인 WScript.CreateObject("WScript.Shell").SendKeys(WScript.Arguments(0));에 도달합니다. JScript는 대략 JavaScript 1.5/ECMAScript3과 동일하며 VBScript와 대략 유사한 WScript API를 가지고 있습니다. 아마 이런 식으로 하면 안 될 것 같아요. 하지만 어쩌면 원할 수도 있고 이제 그 중 일부가 이해가 됩니다. 위 내용은 이 Windows 스크립트는 도움을 청하는 것이 아닙니다.의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!
마무리