频道
bg

Windows URI Schema

coding九月 10, 20201mins
Frontend

起因H1

开发项目起初本身不支持IE的,但是后来对接了单点登录系统。由于单点登录只支持IE,因此希望可以实现IE里打开本系统链接的时候使用Chrome。

思路H1

很对系统的URI Scheme可以实现定义自定义的Scheme前缀,针对该前缀打开特定的应用。 Windows下URI Scheme不仅仅可以打开特定的应用,他可以执行任意的命令

定义URI SchemeH2

HKEY_CLASSES_ROOT下定义自己scheme的项目,然后添加值URL Protocol = "" 以及shell/open/comand 下定义(Default) = xxx ,xxx为要执行的命令

bash

__HKEY_CLASSES_ROOT__
myscheme
(Default) = "URL:My Protocol"
URL Protocol = ""
DefaultIcon
(Default) = "myapp.exe,1"
shell
open
command
(Default) = "notepad" "%1"

https://d3u9fi9s7csg1s.cloudfront.net/blog-images/exploiting-custom-protocol-handlers-in-Windows-internal-image-2.png

https://d3u9fi9s7csg1s.cloudfront.net/blog-images/exploiting-custom-protocol-handlers-in-Windows-internal-image-3.png

实现H2

我们的目标不仅仅是打使用Chrome打开的特定的页面,还需要做一些逻辑处理:

  1. Chrome的安装路径可能会变化的,需要先查看Chrome执行文件的路径
  2. 如果没有安装Chrome需要提示用户安装Chrome
  3. 以上两步没问题,则使用Chrome打开传递的URL

理想情况是在command的值中把逻辑都实现了,但是由于直接在cmd语法实在诡异,一些逻辑在当行命令中无法实现,只能通过调用脚本来实现。

注册表定义H3

Chrome安装后,默认在HKEY_LOCAL_MACHINE\SOFTWARE\Classes\ChromeHTML定义了ChromeHTML 的scheme

bash

Windows Registry Editor Version 5.00
[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\ChromeHTML]
@="Chrome HTML Document""URL Protocol"=""
[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\ChromeHTML\shell\open\command]
@="C:\\\\WINDOWS\\\\SYSTEM32\\CMD.EXE /Q /C C:\\\\che.bat %1"
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Internet Explorer\ProtocolExecute\ChromeHTML]
"WarnOnOpen"=dword:00000000

其中还定义了一个WarnOnOpen 用来关闭打开链接时的警告

脚本定义H3

查找Chrome安装路径

bash

reg query "HKLM\Software\Microsoft\Windows\CurrentVersion\App Paths\Chrome.exe"

最终的脚本

bash

@echo off
reg query "HKLM\Software\Microsoft\Windows\CurrentVersion\App Paths\Chrome.exe" -ve >nul && FOR /F "tokens=*" %%g IN ('reg query "HKLM\Software\Microsoft\Windows\CurrentVersion\App Paths\Chrome.exe" -ve') do (SET chrome=%%g)
if "%chrome%"=="" (msg %username% 请先安装Chrome浏览器 && @exit)
set chrome=%chrome:~18%
set uri=%1
"%chrome%" %uri:~13%

参考:

  1. https://www.vdoo.com/blog/exploiting-custom-protocol-handlers-in-windows
  2. https://www.adamfowlerit.com/2015/05/how-to-launch-a-url-in-google-chrome/

评论


新的评论

匹配您的Gravatar头像

Joen Yu

@2022 JoenYu, all rights reserved. Made with love.