一个谷歌插件

今天同事推荐了我一个谷歌插件 Wappalyzer,

Wappalyzer 是一款浏览器插件,通过 Wappalyzer 可以识别出网站采用了那种 web 技术。它能够检测出 CMS 和电子商务系统、留言板、javascript 框架,主机面板,分析统计工具和其它的一些 web 系统。The company behind Wappalyzer 还能够收集 web 程序的一些信息用于统计分析,揭示出各种 web 系统的使用率即增长情况。实际 Wappalyzer 就是一个指纹识别工具。

效果图如下

那这是什么原理呢?

然后我就很好奇这个插件是怎么实现的,于是我就想看这个插件的源码。

既然是一个 chrome 插件,那么就是安装在本地的

我们浏览器输入

chrome://version

会看到如下截图

2

其中我们可以看到个人资料路径,我们进入这个路径

扩展程序就在当前路径下面的 Extensions 文件夹中, 我们可以看到很多乱码一样的文件夹名称,其实这些就是谷歌插件的 id

3

于是我们回到谷歌浏览器中输入 [chrome://extensions/](chrome://extensions/)

我们就可以看到 ID:gppongmhjkpfnbhagpmjfkannfbllamg

4

再回到刚刚打开的文件夹中,找到对应 id 的文件夹拖入到开发工具中

5

通过 manifest.json 文件我们可以知道插件会在后台运行 html/background.html 这个文件

打开此文件发现这个文件只是引入了四个 js

<script src="../node_modules/webextension-polyfill/dist/browser-polyfill.js"></script>
<script src="../js/wappalyzer.js"></script>
<script src="../js/driver.js"></script>
<script src="../js/lib/network.js"></script>

​ 第一个文件是 polyfill,先不看

weppalyzer.js 中我们可以看到他导出了一个类

if (typeof module === 'object') {module.exports = Wappalyzer
}

于是我们进去这个类,我通过vscode自带outline可以看出 方法分为analyze*parse*

6

我们先看analyze方法 可以看到以下核心的方法,遍历this.apps然后调用内部 this.analyze* 方法,

....省略一些代码
Object.keys(this.apps).forEach((appName) => {apps[appName] =this.detected[url.canonical] && this.detected[url.canonical][appName]? this.detected[url.canonical][appName]: new Application(appName, this.apps[appName])
  const app = apps[appName]promises.push(this.analyzeUrl(app, url))if (html) {promises.push(this.analyzeHtml(app, html))promises.push(this.analyzeMeta(app, metaTags))}if (scripts) {promises.push(this.analyzeScripts(app, scripts))}if (cookies) {promises.push(this.analyzeCookies(app, cookies))}if (headers) {promises.push(this.analyzeHeaders(app, headers))}
})
....省略一些代码

那么this.apps 是哪里来的呢, 我们可以从 driver.js 中

<script src="../js/driver.js"></script>// driver.js, 先new了一个Wappalyzer
const wappalyzer = new Wappalyzer()// 375行左右有一个Init   const response = await fetch('../apps.json')  const json = await response.json()   wappalyzer.apps = json.apps  wappalyzer.categories = json.categories   

我们可以看到是从 apps.json 我们可以看到很多没听过的 app,但是也有很多,

"Ant Design": {"cats": [12],"html": ["<[^>]*class=\"ant-(?:btn|col|row|layout|breadcrumb|menu|pagination|steps|select|cascader|checkbox|calendar|form|input-number|input|mention|rate|radio|slider|switch|tree-select|time-picker|transfer|upload|avatar|badge|card|carousel|collapse|list|popover|tooltip|table|tabs|tag|timeline|tree|alert|modal|message|notification|progress|popconfirm|spin|anchor|back-top|divider|drawer)",  "<i class=\"anticon anticon-"  ],  "icon": "Ant Design.svg",  "js": {  "antd": ""  },  "website": "https://ant.design" } 

比如 Ant Design 的配置,我们可以看到有一个html 里面是通过 html 来匹配的,于是我们看 wapplyzer.js中的 analyzeHtml 方法,发现他是通过正则来匹配的

伪造指纹

我们新建一个空白的 html

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>Document</title> </head> <body>  </body> </html> 

本地启动一个express服务,打开插件可以看到有下面几个

7

那如果我们页面上加一个 符合"<i class=\"anticon anticon-"的标签呢

<i class="anticon anticon-1"></i>

我们可以看到多了 Ant Design

8

到此文章就告一段落了,其实 Wappalyzer 里面还是有很多有意思的东西的 比如说 apps.json中的 implies 字段,

 "Element UI": {"cats": [12],"icon": "ElementUI.svg","implies": "Vue.js",  "html": [  "<(?:div|button) class=\"el-(?:table-column|table-filter|popper|pagination|pager|select-group|form|form-item|color-predefine|color-hue-slider|color-svpanel|color-alpha-slider|color-dropdown|color-picker|badge|tree|tree-node|select|message|dialog|checkbox|checkbox-button|checkbox-group|container|steps|carousel|menu|menu-item|submenu|menu-item-group|button|button-group|card|table|select-dropdown|row|tabs|notification|radio|progress|progress-bar|tag|popover|tooltip|cascader|cascader-menus|cascader-menu|time-spinner|spinner|spinner-inner|transfer|transfer-panel|rate|slider|dropdown|dropdown-menu|textarea|input|input-group|popup-parent|radio-group|main|breadcrumb|time-range-picker|date-range-picker|year-table|date-editor|range-editor|time-spinner|date-picker|time-panel|date-table|month-table|picker-panel|collapse|collapse-item|alert|select-dropdown|select-dropdown__empty|select-dropdown__wrap|select-dropdown__list|scrollbar|switch|carousel|upload|upload-dragger|upload-list|upload-cover|aside|input-number|header|message-box|footer|radio-button|step|autocomplete|autocomplete-suggestion|loading-parent|loading-mask|loading-spinner|)"  ],  "website": "https://element.eleme.io/"  }, 

​ 比如这一段,意思就是,用了Element UI 一定用了 Vue.js

参考资料

  • 谷歌英文开发文档

  • 谷歌中文开发文档

  • Wapplyzer github

本文使用 mdnice 排版

使用Wappalyzer 分析页面相关推荐

  1. 使用Chrome工具来分析页面的绘制状态

    Chrome Canary(Chrome "金丝雀版本")目前已经支持Continuous painting mode,用于分析页面性能.这篇文章将会介绍怎么才能页面在绘制过程中找 ...

  2. 智能家居助手后台系统原型/智慧家居后台管理系统/应用分析/页面分析/设备分析/用户管理/运营管理/权限管理/系统设置/问题反馈/商城管理/消息管理/用户画像/公告管理/账号画像/留存用户/数据埋点

    作品介绍:智能家居助手后台系统原型/智慧家居后台管理系统/应用分析/页面分析/设备分析/用户管理/运营管理/权限管理/系统设置/问题反馈/商城管理/消息管理/用户画像/公告管理/账号画像/留存用户/数 ...

  3. 可视化展示——论文相似度分析页面设计

    记录 论文相似度分析页面设计: colab运行Deep Keyphrase Extraction using BERT 论文相似度分析页面设计: 实现导航栏的效果:(点击研究背景.研究问题.贡献.方法 ...

  4. 使用Chrome DevTools的Timeline分析页面性能

    原文地址:http://horve.github.io/2015/10/26/timeli... 随着webpage可以承载的表现形式更加多样化,通过webpage来实现更多交互功能,构建web应用程 ...

  5. 爬虫入门实战(如何分析页面和构建requests请求)

    其实我们或多或少都是听说过爬虫这个概念,这个东西的技术栈其实也比较成熟了. 其实在我的理解中,爬虫嘛,就是给自己伪装一下,装成是正常的访问请求,然后获取到网站或者APP中的数据资源的一种技术手段. 当 ...

  6. 网站流量可视化分析--页面指标分析、访问量分析

    页面指标分析.访问量分析 Tableau文件 一.实验目的 1.掌握不同大数据可视化图示的应用范围与场景 2.掌握大数据可视化工具Tableau在具体可视化场景中的使用 二.实验内容 1.网站流量的页 ...

  7. 市场营销分析--页面广告统计

    基本需求:从埋点日志中,统计每小时页面广告的点击量,5秒刷新一次,并按照不同省份进行划分对于"刷单"式的频繁点击行为点击行为进行过滤,并将该用户加入黑名单 解决思路:根据省份进行分 ...

  8. chrome如何分析页面加载时间

    以chrome为例,开发者模式中跟页面加载时间相关的是network面板. network 面板的 DOMContentLoaded和load 打开Network面板后,刷新页面,面板底部有这三个时间 ...

  9. java idle耗时_chrome中性能分析工具分析页面中Idle(空闲时间)占用太长时间,会不会影响页面性能,如果会是什么原因造成的?...

    看了楼上诸多回答,真是为现在前端开发者捏了一把汗啊!题主不懂就罢了,答题的人不懂也硬往上凑,你们心可真大啊-- 吐槽完毕,正经回答一下. 这里的 idle 含义是复合性质的,不能完全等同于服务器加载的 ...

最新文章

  1. OpenCV的projectPoints函数用法
  2. explain都不懂,还好意思说会SQL调优?
  3. 杨辉三角形又称Pascal三角形,它的第i+1行是(a+b)i的展开式的系数
  4. 华为的型号命名规则_华为最实惠5G手机来了!畅享Z 5G宣布:5月24日发
  5. Windows 7 IIS HTTP 错误 403.14 - Forbidden
  6. x86系统MySQL_deepin20.1系统安装MySQL8.0.23(最美国产Liunx系统,最新,最详细的MySQL8安装教程)...
  7. swift版 二分查找 (折半查找)
  8. [转]Resource for Windows Phone 7
  9. Python Socket模块实现服务端与客户端通信
  10. 计算机重装系统桌面文件如何恢复,电脑重装系统后桌面文件如何恢复-万兴恢复专家...
  11. 计算机无法读光盘,win7系统无法读取光盘数据怎么办 电脑光驱读不出光盘数据解决方法...
  12. 《面膜行业网络关注度分析报告》
  13. 有没有免费的视频剪辑软件?快来看看这些视频裁剪软件
  14. 通过USB连接越狱iPhone,SSH进入设备
  15. java 医保接口对接_读:HIS 与医保系统的接入方案及实现
  16. OC----id 类型
  17. 语义分割系列24-PointRend(pytorch实现)
  18. 四则混合运算的BNF推导过程
  19. [附源码]Python计算机毕业设计Django家庭医生签约服务管理系统
  20. 发那科7轴导轨+SCA涂胶与发那科7轴导轨+固定点焊钳现场全备份,可导入Roboguide还原系统

热门文章

  1. 高通平台开发系列讲解(PCIE篇)EP 软件架构组成
  2. LAF让Swing漂亮起来02 - Nimbus LAF(进阶篇)
  3. Shiro和Spring结合对请求路径进行过滤和记住我过滤操作
  4. 涂鸦APP可以添加多少路的设备
  5. 如何在线创建维恩图 (Venn Diagram)?
  6. 最长单调递增子序列--动态规划
  7. Python小实例之欢度国庆
  8. 【Tableau Desktop 企业日常问题18】如何下载自定义的地理信息文件?(自定义经纬度)
  9. Web开发课程作业 :大象基金网上交易系统
  10. 【游戏中的算法】洗扑克牌算法