NUL aller à : boucle */"/> NUL aller à : boucle */">
Maison > Article > interface Web > Ce script Windows n'est pas un appel à l'aide
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));
Prenez un moment et voyez si vous pouvez comprendre ce qui se passe ici.
Continuez. J'attendrai 15 à 45 secondes, puis j'enverrai la combinaison de touches Shift F15.
Parce que la touche F15 existe mais que la plupart des claviers ne l'ont plus, il est donc très peu probable qu'appuyer sur Shift F15 fasse autre chose que d'agir comme une combinaison de touches enfoncée en général, empêchant l'ordinateur de dormir dans la plupart des cas (sauf certaines configurations VDI). ).
Cela fonctionne sans droits d'administrateur et sur une installation Windows Vanilla, bien que certains administrateurs désactivent JScript.
0< /* :: est la redirection d'entrée depuis un fichier pour le descripteur de fichier 0, ce qui est un cas particulier et fait référence à l'entrée standard (STDIN). Par exemple, si vous avez exécuté 0< test.txt find "hello", le shell exécuterait en fait find "hello" 0 Alors pourquoi le /* alors que n'importe quelle chaîne peut y aller ? Parce que c'est le début d'un commentaire de bloc javascript/jscript et que l'interpréteur jscript n'a pas besoin d'essayer d'analyser le script batch entre le /* et le */. Mais alors, comment l’interpréteur jscript voit-il ce morceau de code ? Il lit le bloc entier de 0< /* :: à */ 0; comme : 0 &Lt ; 0 ; qui est évalué à faux, mais cela n'a pas d'importance - c'est un jscript valide et n'a aucun effet secondaire et le principal obstacle a été franchi : un moyen d'analyser sélectivement le script batch ou le jscript en fonction de l'interpréteur qui lit le fichier. Je vais sauter la désactivation de l'écho, la définition des variables et le bouclage des étiquettes, car ce sont des concepts assez simples, bien que fait amusant - ECMAScript a également des étiquettes. La prochaine ligne importante est CScript //nologo //E:JScript "%~F0" " {F15}", qui envoie ce fichier .bat à CScript. CScript démarre un script dans un environnement de ligne de commande avec plusieurs choix de moteur de script (JScript dans ce cas). WScript est similaire mais exécute un script dans une interface graphique Windows et, dans ce contexte, n'est pas complètement lié à la dernière ligne du fichier batch. $~F0 est le chemin complet, le nom de fichier et l'extension du fichier batch en cours d'exécution. {F15} est Shift et la touche F15 pour SendKeys. Pour réitérer, lorsque ce fichier batch est envoyé, il voit l'intégralité du script batch comme juste 0<0; puis exécute la dernière ligne, qui est également un JScript valide. La seule chose intéressante à propos de set /a rand = (%RANDOM% * (%max% - %min% 1) / 32768) %min% 1 est que %RANDOM% est une variable intégrée qui produit un entier de 0 à 32767 (inclus), l'utilisation de set /a arrondit toujours à l'inférieur et le dernier 1 est spécifiquement pour la ligne suivante ; lorsque vous utilisez sleep ou timeout, vous n'ajouterez pas le 1 supplémentaire. La ligne suivante, ping -n %rand% -w 1 127.0.0.1 > NUL est une ancienne façon de créer une minuterie moins gourmande en processeur que la mise en veille et le délai d'attente. En gros, vous vous cinglez %rand% fois avec 1 seconde entre chaque tentative ; le 1 de la ligne précédente est dû au fait qu'il n'y a pas d'attente avant le premier ping. > NUL redirige la sortie standard vers NUL, qui bien sûr la supprime simplement. Si ce script n'avait pas de boucle infinie, vous voudriez avoir un goto :eof avant */ 0; pour que votre script batch ignore le reste du fichier qui n'est pas un script valide. Et nous arrivons enfin à la fin et au JScript proprement dit : WScript.CreateObject("WScript.Shell").SendKeys(WScript.Arguments(0));. JScript est à peu près équivalent à JavaScript 1.5/ECMAScript3 et possède une API WScript à peu près analogue à VBScript. Ne faites probablement pas les choses de cette façon. Mais peut-être que vous le voudriez, et maintenant certaines d'entre elles ont du sens. Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!
Conclure