chrome 调试之 - 给微软小冰看病(无论给小冰发送什么内容都只回复“我已经开始升级啦,期待一下吧!”)

微软 Bing 搜索推出了小冰AI智能聊天模块,具体启用方式是用edge或chrome浏览器打开链接 cn.bing.com 后在输入框搜索任意内容,待搜索结果页面加载完并稍等片刻,页面右侧就会出现一个躲在滚动条后面的小萝莉,抚摸...不,点击她,就会弹出这个聊天框了

不幸的是,无论我向她发送什么内容,她都只会说一句“我已经开始升级啦,期待一下吧!”

作为一个喜欢探索的bug研发工程师,我想方设法,不成功调戏小冰一下誓不罢休。然而一顿操作下来(不限于换浏览器、换电脑、搭梯子、登录bing账号等等),聊天框依旧如此,小冰对我的调戏视而不见,始终是那句“我已经开始升级啦,期待一下吧!”。

百思不得解,后来我打开F12,查看了network面板发现,这货其实是返回了有效聊天内容的(之所以想看看F12,我认为既然是AI聊天机器人,那应答机制必定是要在服务器处理的,既如此,就一定会有网络交互来传递对话内容)

既然在明明返回了有效聊天内容的情况下聊天框仍然给用户显示了无意义的提示信息,那一定就是微软Bing在搞鬼!我们且不论微软这么做的动机是什么,正事要紧(调戏小冰)。

通过前文操作可以推断,微软 Bing 肯定是拦截了小冰真正想要说的话,强行让小冰变成了一个人工智障。

那么我要做的事情就是分析在跟小冰聊天时点击发送消息后代码的执行过程。

首先我通过F12的Element面板选中聊天框内的发送消息按钮,找出为这个按钮自身绑定的点击事件:

具体步骤如上,按图索骥,跟着箭头直到最后一步,点击绿色框圈出的js文件,代码被定位到 vr() 这个方法,也就是说我在点击发送消息按钮时其实是调了这个方法。我给vr这个方法打断点,然后在聊天框输入内容后点击发送按钮,代码进入断点,使用F10一步步调试,逻辑走到 hi() 这个方法时使用F9进入hi这个方法,不难看出,hi方法的核心逻辑是在创建一个ajax请求,并监听请求的成功回调,随后把我们键入的聊天内容发送出去。当接口返回成功时调用af()这个方法进一步处理接口回调内容(如下图):

在当前js代码窗口中使用CTRL+F,全局搜索af这个方法,找到这个方法的源码,给他打断点(为了方便后续调试,在这之前我先取消掉上一个断点)

到了这里其实我只要稍微看一下代码就会发现问题的根本所在,注意看af方法中的这个vu方法调用,它接收的第1个参数就是这句 "我已经开始升级啦,期待一下吧!"

不用想,这个参数最终会被作为小冰的回答显示在聊天框中,而现在这句回复被微软给强制写死了,且 i 这个参数中不就是接口返回来的真实聊天回复内容吗?可以发现 i 这个参数被赋值后根本就没有使用过!后续我又跟进了 vu 这个方法,进一步确认了微软强制篡改回复内容这个事实。

到这里就已经真相大白了,微软这是故意不给咱使用这个玩意啊。

接下来我只需要想办法修改这行代码的逻辑,如果能成功,就可以和小冰愉快地玩耍啦!

// vu("我已经开始升级啦,期待一下吧!", ""),
vu(i[0].content.text, ""),

可能你会说,道理咱都懂,但这是在线网站呀,你难不成还能钻进微软的静态网站服务器去改人家的网页源码不成?你咋不上天呢!哎,我还真能钻进微软的服务器,嘿嘿!(开个玩笑)

然鹅我几乎马上就想到了chrome前不久新增的那个开发者功能:Overrides。这玩意是啥?其实就是字面意思--覆盖。它可以把一个网站(不限于线上还是本地开发环境的网站)的静态资源用本地的文件给覆盖掉,这样你就可以使代码临时按照自己修改后的逻辑运行,以便模拟程序在真实环境下是否正常。此时你想到了什么?没错,XSS,跨站脚本攻击!异曲同工有木有?当然,Overrides 这个覆盖只是临时的,它只在我的本机目标浏览器且打开F12开发者工具时生效,无需担心安全问题。事实上在2018年的时候chrome就已经正式向开发者提供了这个功能,只是在最近的更新中又强调了这个功能的可玩性。讲真,我其实很早以前就设想过这个功能了,吼吼!(事实上每次更新Chrome之后首次打开F12都能在调试窗口底部看到本次有哪些变更,有时候看看这个玩意还挺有意思,能使你对好玩的新特性了然于胸)。如果我说的不是很明白,没关系,继续往下看。

如下图所示,首先在开发者工具中的sources面板下,点击切换到 Overrides 二级面板,然后继续点击 Overrides 下面的 select folder for overrides。哦不,在这之前我首先得在电脑上找一个地方创建一个干净的文件夹,就取名叫 chrome-overrides 吧。然后要在点击 select folder for overrides 时选择这个干净的文件(如遇提示,点击“允许”):

然后重新去到那个js文件中(不要问我是哪个js文件以及怎么找到它,我们一直在讨论关于它的话题),这时候你会发现这个js文件竟然变成了可编辑状态,神奇!

那好,我就把代码改成我想要的样子,改完后使用快捷键 CTRL+S保存,你又发现此时在左侧刚选择的那个文件夹中出现了我修改的代码--被保存在本地了。

这时候不要关闭开发者工具,直接刷新当前的 Bing 搜索页面,稍后开发者工具会自动定位到这个js文件(如果没有定位回来,那就自己想办法重新找到它),我们取消刚才在这个文件中打的所有断点,然后重新打开小冰和她聊天...

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/208680.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Java-网络通信总结

文章目录 网络程序设计基础局域网与互联网 网络协议IP协议TCP/IP 协议端口域套接字 TCP 程序InterAddress 类ServerSocket 类 UDP 程序DatagramPacket 类DatagramSocket 类 网络程序设计基础 网络程序设计编写的是与其他计算机进行通信的程序。Java 已经将网络程序所需要的元素…

RK3588平台开发系列讲解(hardware)reference-ril源码分析

平台内核版本安卓版本RK3588Linux 5.10Android 12文章目录 一、reference-ril目录介绍二、支持的功能三、Android RIL 框架沉淀、分享、成长,让自己和他人都能有所收获!😄 一、reference-ril目录介绍 目录:3588-android12/hardware/ril/reference-ril

ElementUI 时间选择器如何限定选择时间

DatePicker 日期选择器 | Element Plus 我们如何限定我们的选择时间呢,比如限定选择时间为今天之前,或者今天之后的时间? 我们可以使用官方提供的disabled-date来实现 我们通过这个属性 做一个回调函数,在里面比较我们想要限定的时…

鸿蒙方舟开发框架ArkUI简介

语雀知识库地址:语雀HarmonyOS知识库 飞书知识库地址:飞书HarmonyOS知识库 嗨,各位别来无恙呐,我是小白 众所周知,华为在今年推出了 HarmonyOS 4.0 版本,而在此之前的版本中,HarmonyOS 应用的 …

2024年AI视频识别技术的6大发展趋势预测

随着人工智能技术的快速发展,AI视频识别技术也将会得到进一步的发展和应用。2023年已经进入尾声,2024年即将来临,那么AI视频识别技术又将迎来怎样的发展趋势?本文将对2023年的AI视频技术做一个简单的盘点并对2024年的发展趋势进行…

Advanced Renamer

Advanced Renamer 安装链接 1.前后添加字符 2.字符转数字,编号整体加减

oracle实验2023-12-8--触发器

第十四周实验 【例】功能要求:增加一新表XS_1,表结构和表XS相同,用来存放从XS表中删除的记录。 分析: 1、创建表 xs_1 SQL> create table xs_1 as select * from xs; Table created SQL> truncate table xs_1; Table truncated题目&a…

StoneDB-8.0-V2.2.0 企业版正式发布!性能优化,稳定性提升,持续公测中!

​ 11月,StoneDB 新版本如期而至,这一个月来我们的研发同学加班加点,持续迭代:在 2.2.0 版本中,我们针对用户提出的需求和做出了重量级更新,修复了一些已知和用户反馈的 Bug,同时对部分代码进行…

PairLIE论文阅读笔记

PairLIE论文阅读笔记 论文为2023CVPR的Learning a Simple Low-light Image Enhancer from Paired Low-light Instances.论文链接如下: openaccess.thecvf.com/content/CVPR2023/papers/Fu_Learning_a_Simple_Low-Light_Image_Enhancer_From_Paired_Low-Light_Instan…

Kafka安全性探究:构建可信赖的分布式消息系统

在本文中,将研究Kafka的安全性,探讨如何确保数据在传输和存储过程中的完整性、机密性以及授权访问。通过详实的示例代码,全面讨论Kafka安全性的各个方面,从加密通信到访问控制,帮助大家构建一个可信赖的分布式消息系统…

Vue:用IDEA开发Vue,标签语法爆红问题处理

一、场景描述 我在IDEA中,学习Vue课程。 入门学习时,是在html文件中,script引入vue.js文件方式。 此时,在html文件中用v-标签,爆红。 二、解决办法 打开 菜单栏 File - Settings 选择 Editor - Files Type&#xf…

《每天一个Linux命令》 -- (5)通过sshkey密钥登录服务器

欢迎阅读《每天一个Linux命令》系列!在本篇文章中,将介绍通过密钥生成,使用公钥连接管理服务器。 概念 SSH 密钥是用于安全地访问远程服务器的一种方法。SSH 密钥由一对密钥组成:公钥和私钥。公钥存储在远程服务器上,…

软件工程复习

一、题型 单项选择题 20分 填空题 10分 判断题 10分 简答题 18分 应用题 12分 综合题 30分 软件程序数据文档 软件是无形的、不可见的逻辑实体 20世纪60年代末爆发软件危机 软件危机是指软件在开发与维护过程中遇到的一系列严重的问题 …

理解 GET、POST、PATCH 和 DELETE 请求的参数传递方式

理解 GET、POST、PATCH 和 DELETE 请求的参数传递方式 本文将向您介绍在使用 GET、POST、PATCH 和 DELETE 请求时如何传递参数。通过详细解释每种请求的参数传递方式和示例代码,您将了解如何正确地将数据发送到服务器并与之交互。 GET 请求的参数传递方式 在 GET…

CentOS 7.9安装宝塔面板,安装gitlab服务器

docker安装方式比较慢,安装包1.3GB 安装后启动很慢 docker logs q18qgztxdvozdv_gitlab-ce-gitlab-1 docker ps docker exec -it q18qgztxdvozdv_gitlab-ce-gitlab-1 sh cd /etc/gitlab cat initial_root_password 软件商店安装方式,失败了2023.12…

hook其他调试技巧

输出堆栈信息 通过 android.util.Log 输出当前线程的堆栈跟踪信息。 function showStacks() {Java.perform(function () {console.log(Java.use("android.util.Log").getStackTraceString(Java.use("java.lang.Throwable").$new() )); }) } 可以在需要的…

机器学习--稀疏学习

前置知识: 通常学习一次模型的过程如下:我们普遍为了获取更好的模型效果,直接对原始数据学习,会造成过拟合、需要特征提取; 而若特征提取完后依旧有很多特征,还是会容易过拟合。这时候就需要特征降维和特…

C/C++端口复用SO_REUSEADDR(setsockopt参数),test ok

端口复用最常用的用途应该是防止服务器重启时之前绑定的端口还未释放或者程序突然退出而系统没有释放端口。这种情况下如果设定了端口复用,则新启动的服务器进程可以直接绑定端口。如果没有设定端口复用,绑定会失败,提示ADDR已经在使用中——…

STM32 寄存器配置笔记——USART DMA发送

一、DMA介绍 直接存储器存取(DMA)用来提供在外设和存储器之间或者存储器和存储器之间的高速数据传 输。无须 CPU 干预,数据可以通过 DMA 快速地移动,这就节省了 CPU 的资源来做其他操作。当产品对于时序要求较严格时,外设使用DMA的方式能够减…

深入了解Java 8日期时间新玩法:DateTimeFormatter与ZoneOffset的使用

推荐语 在这篇文章中,我们将深入探讨Java中的DateTimeFormatter和ZoneOffset类的功能和使用方法。这些类是在Java 8中引入的新的日期时间API的一部分,它们为我们提供了更灵活、更易用的日期和时间处理能力。尽管这些类在Java 8中已经出现,但…