Запустите команду cmd через браузер и запустите steam

Go
Запустите команду cmd через браузер и запустите steam

Это 9-й день моего участия в Gengwen Challenge.Подробности мероприятия смотрите:Обновить вызов

Посмотрим на эффект реализации, вводим в браузереping so.com

cmd_ping

Попробуйте открыть калькулятор, начатьsteam

cmd_steam

Для достижения этого эффекта на самом деле используется пользовательский протокол браузера. Мы можем открыть WECHAT, кнопку и приложения Emali через пользовательский протокол и подождите. Например, в системе обслуживания Web Customer, она обычно используетсяtencent://Пользовательский протокол предоставляет кнопку для чата, и когда мы нажимаем ее, браузер запускает внешнее приложение.

После того, как мы запишем пользовательский протокол в реестр, браузер запустит наше пилотное приложение в соответствии с протоколом, как показано ниже.tencent://Протокол инициируетTimwp.exe,Timwp.exeЗапустите предыдущую службу после разбора параметра URL.

image-20210629225401310

Так что мы можем зарегистрироваться самиcmdпротокол для запуска нашего приложения. Мы будем такимиurlCmd.regИмпорт файла реестра в реестрHKEY_CLASSES_ROOTКонечно, это также может быть достигнуто путем ручного добавления элементов и строк в реестр.Мы сообщаем реестру, что я хочу зарегистрироватьURL Protocol, его структура каталоговHKEY_CLASSES_ROOT\cmd\shell\open\command.

Windows Registry Editor Version 5.00

[HKEY_CLASSES_ROOT\cmd]
@="URL: cmd protocol"
"URL Protocol"=""

[HKEY_CLASSES_ROOT\cmd\shell]

[HKEY_CLASSES_ROOT\cmd\shell\open]

[HKEY_CLASSES_ROOT\cmd\shell\open\command]
@="C:\\Windows\\system32\\urlCmd.exe \"%1\""

Вот так выглядит после импорта пилотное приложение, которое мы хотим запустить:C:\Windows\system32\urlCmd.exe

image-20210629225551325

Далее мы собираемся написатьurlCmd.exeДля достижения нужных нам функций здесь мы пишем через go, а переданный URL разбираем как<command> <arg>form, а затем вызовите cmd для выполнения. Обратите внимание, что параметры закодированы в URL, в следующемurlCmd.goМы занимаемся только расшифровкой пробелов.

//urlCmd.go

package main

import (
	"fmt"
	"log"
	"os"
	"os/exec"
	"strings"
	"time"
)

func main() {
	var cmd_args, cmd_com string                        //        带参数                     不带参
	cmd_all := os.Args[1:]                              //  [cmd://<command>%20<arg>]  [cmd://<command>/]
	cmd_cmd := strings.Split(string(cmd_all[0]), "//")  //  [cmd: <command>%20<arg>]   [cmd: <command>/]
	cmd_pre := strings.Split(string(cmd_cmd[1]), "%20") //  [<command> <arg>]          [<command>/]

	if len(cmd_pre) == 1 {
		cmd_args = "" // 参数为空
	} else {
		cmd_args = strings.Replace(cmd_pre[1], "/", "", 1)
	}
	cmd_com = strings.Replace(cmd_pre[0], "/", "", 1)

	fmt.Printf("\ncommand: %v\nargs: %v\n", cmd_com, cmd_args)
	cmd := exec.Command("cmd", "/c", cmd_com, cmd_args)
	cmd.Stdout = os.Stdout
	cmd.Stderr = os.Stderr
	err := cmd.Run()
	if err != nil {
		log.Fatalf("err:%v", err)
	}
	time.Sleep(2 * time.Second)
}

Соберём и скомпилируем в exe файл

go bulid urlCmd.go

будетurlCmd.exeставитьC:\Windows\system32\каталог, поэтому мы можем использовать браузер дляcmd://URL-адреса, открытые протоколом, будут перенаправлены в это приложение.

cmd_chrome


Я закончил школу, а ты?urlCmd.goЕсть еще много возможностей для улучшения, и заинтересованные студенты могут попробовать это, создав свой собственный парсер.


Если в статье есть недостатки, просьба указать их в комментариях.

Лайки, лайки и вопросы приветствуются. Следуйте за топ-менеджерами водораспределителей, которые иногда занимаются чем-то другим, кроме горячей воды.