三水非冰 发表于 2019-1-2 13:19

Chrome插件离线安装方法及编程思路

本帖最后由 三水非冰 于 2019-1-2 14:54 编辑

# 前言

  本帖由我的个人博客原创文章修改整理而来,菜鸟技术,大神莫喷。
> 转载请注明作者及出处,如:
吾爱破解论坛 三水非冰
SanShuiFeiBing's Blog 三水非冰

# 开始

  在看这篇文章之前,你可以有两个选择:

1. 网上下载`Chrome插件伴侣`这一工具,一键离线安装插件(**注意:博主非工具作者,不保证此工具安全性,请自行分析**),然后关闭此文章。
2. 继续看下去搞懂原理,然后自己手动离线安装插件或编写一个属于自己的离线安装工具。

## 手动化安装方法

  首先进入`Chrome`扩展程序的管理页面,在地址栏敲入`chrome://extensions/`即可进入。

  然后把右上角的`开发者模式`打开(刚不是说无需这个模式吗?别急,暂时的。),拖入插件进行添加,复制插件的`ID`后关闭`开发者模式`即可。如图所示:



  接着关闭`Chrome`,将以下内容复制粘贴到记事本上保存,将文本后缀名`.txt`改为`.reg`,双击运行。   

```
Windows Registry Editor Version 5.00


"1"="ijaojehcgjneognjmhdiidbfhpgfkkgp"
```

  若要添加多个插件,`"1"="ijaojehcgjneognjmhdiidbfhpgfkkgp" `以此类推往下添加`"2"="插件ID" `、`"3"="插件ID" `……

  最后重新打开`Chrome`后插件就可以正常使用了,如安装的插件没有立即启用,可直接到扩展程序管理页面里手动开启。

## 自动化编程思路

### 获取插件公钥和版本号   

  这里需要从`.crx`包头提取公钥和版本号以作备用。

#### CRX 包的头信息

  头信息包含作者的公共密钥和扩展程序的签名,签名以`SHA-1`算法使用作者的私有密钥从`.zip`文件生成。头信息要求字节顺序为小端序并以4字节对齐。下表按顺序描述`.crx`的头信息:

| 字段 | 类型 | 长度 |值| 描述 |
| :--- | :--- | :--- | :--- | :--- |
| magic number | char[]      | 32 位 | Cr24 | Chrome 要求每一个 .crx 包的开头包含此常量。|
| version | unsigned int | 32 位 | 2 | *.crx 文件格式的版本(当前为2)。|
| public key length | unsigned int      | 32 位 | pubkey.length | RSA 公共密钥的长度,以字节为单位。|
| signature length | unsigned int      | 32 位 | sig.length | 签名的长度,以字节为单位。 |
| public key | byte[] | pubkey.length | pubkey.contents | 作者的 RSA 公共密钥内容,以 X509 SubjectPublicKeyInfo 块的格式表示。|
| signature | byte[] | sig.length | sig.contents | ZIP 内容使用作者私有密钥的签名,该签名使用 RSA 算法以及 SHA-1 散列函数创建。 |

  例子:

```
43 72 32 34   # "Cr24" -- the magic number
02 00 00 00   # 2 -- the crx format version number
A2 00 00 00   # 162 -- length of public key in bytes
80 00 00 00   # 128 -- length of signature in bytes
...........   # the contents of the public key
...........   # the contents of the signature
...........   # the contents of the zip file
```

### 获取插件ID

  插件的`ID`可以从插件的公钥得到,经过如下计算:

```
graph LR
公钥 --> Base64
Base64 --> SHA256
SHA256 --> Base16
Base16 --> 插件ID
```

  示例代码:

```
def build_id(pub_key_pem):
    pub_key_der = base64.b64decode(pub_key_pem)
    sha = hashlib.sha256(pub_key_der).hexdigest()
    prefix = sha[:32]      
    extension_id = ""
    ord_a = ord('a')
    for old_char in prefix:
      code = int(old_char, 16)
      new_char = chr(ord_a + code)
      extension_id += new_char
    return extension_id
```

### 重命名和移动插件

  将插件重命名为`插件ID.crx`,移动到`AppData\Local\ChromeExtensionCache`(没有就新建)处作为插件存放路径。

### 部署安装

  在注册表添加插件信息,`chrome`启动时会自动安装。

  在注册表`HKEY_CURRENT_USER\Software\Google\Chrome\Extensions`添加以插件ID命名的项,以及插件存放路径`path`、插件版本号`version`两个字符串值,而`version`值就是从`.crx`包头获取的版本号。如图:



### 添加白名单

  在注册表`HKEY_LOCAL_MACHINE\SOFTWARE\Policies\Google\ExtensionInstallWhitelist`添加以数字命名的字符串值,其数值数据为插件ID。(与上述的手动化安装方法中导入`.reg`一样,只是编程时直接操作注册表即可)

# 后记

  如果安装插件部署安装成功后又卸载掉了插件,第二次安装时就不会自动安装,这是因为`AppData\Local\Google\Chrome\User Data\Default`目录下的`Secure Preferences`记录了该插件的卸载信息,要想解决这个问题,一是直接删除`Secure Preferences`文件(这会导致`Chrome`的个人设置偏好丢失,即恢复出厂设置),二是修改`Secure Preferences`,将该插件的卸载信息剔除掉(太麻烦)。

  博主个人觉得比较舒服的做法是重新打包插件,即每次安装该插件前,都经过`解包-->打包`这一步骤。因为插件在不指定密钥进行打包时会自动生成随机密钥,而公钥又是从密钥中获得,所以插件ID也会是随机的,随着插件ID的更新,`Secure Preferences`中该插件对应的插件ID卸载信息就会失效,从而达到每次安装都是`第一次`的效果。

  和手动打包不同,通过编程的方式打包当然不可能傻傻地去操作`Chrome`界面,这里用到一个`Chrome`的打包命令,可指定一个密钥打包,也可不指定,这会随机生成一个后缀为`.pem`的密钥(当然,也可以自己生成一个)。命令如下:

```
chrome.exe --pack-extension=C:\myext --pack-extension-key=C:\myext.pem
```

三水非冰 发表于 2019-1-2 17:52

cx911322 发表于 2019-1-2 17:41
大神我有个困惑,我是用360极速,之前极速自己的商城里没有的插件我去谷歌商店下的也可以用,但有个问题如 ...

360极速浏览器好像不备份插件的吧。然后如果你要上传你的插件到360扩展中心的话戳这里:http://open.chrome.360.cn/extension_dev/upload.html

三水非冰 发表于 2019-1-2 18:15

cx911322 发表于 2019-1-2 18:06
大神还有其他方法吗?不用梯子直接备份CRX?

我以为你要上传你的插件到商城里... 你只是要备份自己所使用的插件的话,网上搜个插件备份的工具,或者自己手动复制粘贴不就好了.. 上传到自己网盘里。

kenorizon 发表于 2019-1-2 13:51

学习了,感谢分享。

一直到以后 发表于 2019-1-2 14:00

谢谢分享值得学习

ufoboyxj 发表于 2019-1-2 14:08

谢谢分享。为但要会用,而且要学

bachelor66 发表于 2019-1-2 14:20

感谢楼主分享的好经验                                          

豪气冲天 发表于 2019-1-2 14:21

很不错的思路,MAKE一下。

诗雨晴天 发表于 2019-1-2 14:24


谢谢分享值得学习

duanjia0912 发表于 2019-1-2 14:35

首先,你标题中的单词就拼错了,,是chrome

el888 发表于 2019-1-2 14:36


谢谢分享值得学习{:1_893:}

KevinHacker 发表于 2019-1-2 14:43

{:301_992:}{:301_992:}Chrome插件伴侣了解一下
页: [1] 2 3 4 5 6 7 8 9 10
查看完整版本: Chrome插件离线安装方法及编程思路