windows 常用命令
一、网络
查看谁在侦听端口
1 | netstat -np <protocol> | find "port #" |
打开 Internet 网络设置
1 | inetcpl.cpl |
其它的控制命令
1 | appwiz.cpl |
Visual Studio 提高效率方法和工具
为多行注释开头添加空格
一般情况下可以通过快捷键 CTRL+K+C
来添加注释:
1 | //A |
但是,我更习惯在每行内容的开头添加一个空格:
1 | // A |
这是一个实现的方法:How to comment multiple lines with space or indent
编译 CEF
项目与分支
内容来自官方文档BranchesAndBuilding
背景
CEF 是 Chromium 项目的一个扩展,跟踪其分支。可通过自动工具或手动编译。
开发
CEF 的 master 分支跟踪 Chromium 的 master 分支,不建议用其产品化。
下载开发版 CEF
CEF3 - https://bitbucket.org/chromiumembedded/cef/src?at=master
CEF1 已不再支持。
发布(Release)分支
CEF 的发布分支跟踪 Chromium 的 release 里程碑(milesone)MXX 分支,推荐使用其产品化:
- 基于 Chromium release
- 更好的测试
- CEF API 维护不变,仅做 bug 和安全修复
- CEF 必要时可包含 Blink 补丁
- 不受 CEF master 分支推进影响
CEF 版本 X.YYYY.A.gHHHHHHH:
- X:主版本号(当前为 3)
- YYYY:Chromium 分支
- A:自增值,反映当前分支的版本值。可表示基于同一分支,各版本的顺序,用于修复 bug 等的版本提升
- gHHHHHHH:7位字符反映 git 提交哈希,便于定位 git 历史
版本的详细信息保存在 include/cef_version.h
头文件中,也可以通过生成的应用访问 about:version
查看。
CEF release 分支下载规则,YYYY 对应4位 Chromium release 分支号:
比如: https://bitbucket.org/chromiumembedded/cef/src/2623?at=2623
编译 CEF
下载文档
首先要下载文档仓库
1 | git clone https://bitbucket.org/chromiumembedded/cef.git/wiki |
然后将文档检出到需要编译的版本,比如 2623
1 | git checkout 0625af2618b7f15660146acd769142144e5a48c9 |
生成项目文件
1 | cd src\cef |
编译
1 | cd src |
运行测试
编译成功之后,运行 out\Release\cefclient.exe
打包导出
执行打包脚本
1 | cd src\cef\tools |
打包成功后,在 src/cef/binary_distrib
目录会生成二进制的包
常见问题
NPAPI 启用情况
查看当前版本 NPAPI 是否已经启用,可以打开 Dev Tools
-> Console
执行:
1 | navigator.plugins |
检查每个插件的情况,一般 NPAPI 插件会以 np 开头。
附录
Chrome 扩展之: Content Script
1 介绍
1.1 使用场景
Content Script
是一个很神奇的东西。它可以读取和修改页面内容。比如一些应用场景
- 过滤广告:将页面中的广告区块过滤掉,只显示主要内容
- 翻译页面中的外语
- 分享页面内容到社交平台
1.2 限制
- Use chrome.* APIs, with the exception of:
- extension ( getURL , inIncognitoContext , lastError , onRequest , sendRequest )
- i18n
- runtime ( connect , getManifest , getURL , id , onConnect , onMessage , sendMessage )
- storage
- 不能使用扩展页面中的变量和方法
- 不能使用定义在其它扩展的 Content Script 中的变量和方法
2 使用
2.1 Manifest
1 | { |
2.2 注入
2.2.1 与 browserAction
配合
注入并执行一段代码:
1 | chrome.browserAction.onClicked.addListener(function(tab) { |
执行上面的代码先获取权限:
1 | "permissions": [ |
或直接执行一个文件:
1 | chrome.tabs.executeScript(null, {file: "content_script.js"}); |
blocking
会将回调函数设置为同步处理,请求会等待回调完成。使用该参数需要在 permission
中添加 webRequestBlocking
权限。
2.2.2 获取资源文件 URL
1 | /Code for displaying <extensionDir>/images/myimage.png: |
3 要点
3.1 ContentScript 在独立环境运行
3.2 注入的方式
3.2.1 整个文件
1 | var s = document.createElement('script'); |
注意: 将 script.js
加入到 “web_accessible_resources”
3.2.2 代码片段
1 | var actualCode = `// Code here. |
3.2.3 更多方式
参见: Insert code into the page context using a content script
3.3 注入的时机
3.3.1 document_start
- 在
document.readyState
事件前被触发。 document.head 和 document.body 还不可用,只有 documentElement
1
2
3
4var s = document.createElement ("script");
s.src = "http://ajax.googleapis.com/ajax/libs/jquery/2.1.0/jquery.min.js";
s.async = false;
document.documentElement.appendChild (s);1
2
3
4var s = document.createElement ("script");
s.src = chrome.extension.getURL ("MyPwnCode.js");
s.async = false;
document.documentElement.appendChild (s);如果需要操作其它 DOM,可以等待
DOMContentLoaded
事件1
2
3
4
5
6
7document.addEventListener('DOMContentLoaded', fireContentLoadedEvent, false);
function fireContentLoadedEvent () {
console.log ("DOMContentLoaded");
// PUT YOUR CODE HERE.
//document.body.textContent = "Changed this!";
}
3.3.2 document_end
- DOM 已解析完成
- 资源如 image 和 frame 还没有加载(onload)
3.3.3 document_idle
- 晚于 document_end,
- 也晚于 window.onload
- DOM 已解析完成
Chrome 扩展之: 使用 webRequest 替换页面资源
请求事件
首先,一个请求的生命周期是这样的:
利用 webRequest 接口,可以监听图中的事件,插入自己的处理。
知识点:
1. webRequest 需要在 background 中使用
2. 调用方式
1 | var callback = function(details) {...}; |
3. blocking
参数
blocking
会将回调函数设置为同步处理,请求会等待回调完成。使用该参数需要在 permission
中添加 webRequestBlocking
权限。
举例: 替换网站的 JS 文件
1. 声明权限
编辑 manifest.json
,添加 permission
1 | "permissions": [ |
2. 添加后端 文件
首先在 manifest.json
中添加 background 文件
1 | "background": { |
3. webRequest 脚本
1 | chrome.webRequest.onBeforeRequest.addListener( |
解释一下上面的后端代码:
- 监听 符合规定请求 的
onBeforeRequest
事件 - 这2个参数是回调函数,通过参数
details
来判断每一个请求url
,如果以origin.js
结尾,将用扩展中准备好的fake.js
替换。换句话说,将原始网站的 JS 替换为假的 JS - 对于用户来讲,通过查看源码,看到的仍然是
<script src="origin.js"></script>
- 通过 DevTools 的 network 查看,会发现
url
已经变为fake.js
- 第3个参数过滤被监听的请求,支持通配符
*
- 第4个参数为扩展参数,
blocking
说明这是 同步 处理,请求会等待回调函数完成
设置 WebBrowser Document Mode
编辑注册表
1 | HKEY_CURRENT_USER\SOFTWARE\Microsoft\Internet Explorer\Main\FeatureControl\FEATURE_BROWSER_EMULATION |
设置值
值 | 说明 |
---|---|
10001 (0x2711) | Internet Explorer 10。网页以IE 10的标准模式展现,页面!DOCTYPE无效 |
10000 (0x02710) | Internet Explorer 10。在IE 10标准模式中按照网页上!DOCTYPE指令来显示网页。Internet Explorer 10 默认值。 |
9999 (0x270F) | Windows Internet Explorer 9. 强制IE9显示,忽略!DOCTYPE指令 |
9000 (0x2328) | Internet Explorer 9. Internet Explorer 9默认值,在IE9标准模式中按照网页上!DOCTYPE指令来显示网页。 |
8888 (0x22B8) | Internet Explorer 8,强制IE8标准模式显示,忽略!DOCTYPE指令 |
8000 (0x1F40) | Internet Explorer 8默认设置,在IE8标准模式中按照网页上!DOCTYPE指令展示网页 |
7000 (0x1B58) | 使用WebBrowser Control控件的应用程序所使用的默认值,在IE7标准模式中按照网页上!DOCTYPE指令来展示网页。 |
举例:
DuiLib 的使用
下载代码
本文下载的是 Redrain 维护的版本,原始的 DuiLib 版本从这里下载。
以库方式使用
打开并升级工程文件
打开 DuiLib_vs2010.sln
,我安装的 IDE 是 VS2015
,会提示升级,按提示完成。
编译全部动态库
打开菜单 Build > Batch Build…
选择编译所有配置:
保存编译的结果:
- DuiLib.dll
- DuiLib.lib
- DuiLib_d.dll
- DuiLib_d.lib
以及 DuiLib 库的定义目录: DuiLib
当创建新工程时,把 lib 文件添加到 link 依赖里,把 DuiLib 目录添加到 inluce 路径中,最后把 dll 库放到导出目录中,便配置好了一个 DuiLib 工程。
以源码方式使用
1. 创建一个空工程
2. 将源码中的 DuiLib 目录添加到工程根目录中
3. 导入 DuiLib 项目
在工程上右键,选择:Add > Existing Project…,找到 DuiLib 项目文件导入
4. 设置依赖 DuiLib
在主项目上右键,选择:Build Dependencies > Project Dependencies…,设置依赖 DuiLib 项目。
这样,在编译主项目时会先编译依赖的 DuiLib 项目。
CEF 的使用
下载代码
http://opensource.spotify.com/cefbuilds/index.html
CEF
cefsimple 示例
- 编译
libcef_dll_wrapper
静态库 - 创建新的项目
- 设置 include 目录到 cef 头文件目录
- 设置链接库 comctl32.lib, shlwapi.lib, rcprt4.lib, libcef_dll_wrapper.lib, libcef.lib, cef_sandbox.lib
- 添加 resource.rc
- 添加 cefsimple.exe.manifest 和 compatibility.manifest
- 绑定编译事件 post build: 将 cef debug 或 release 目录,Resources 目录复制到输出目录
常见问题
CefSettings
当嵌入到 windows 消息循环和 DuiLib 消息循环时,要设置 multi_threaded_message_loop
CefBrowser 和 CefFrame
CefBrowser 可以包含多个 CefFrame
CefApp
待补充
CefClient
是否支持 crx
1 | // 加载测试扩展,如果是 windows 或 linux,可以加上 --use-views 获得更好效果 |
Proxychains4 问题
Timeout 问题
1 | proxychains4 curl https://www.twitter.com/ |
解决办法
1. 重启系统进入维护模式(Recovery Mode)
按住 ‘Command’ 和 ‘R’ 启动系统
2. 打开终端(Terminal)
3. 禁用 csrutil
1 | csrutil disable |