粉丝337获赞1042

时长一个小时的爬虫逆向实战,本期视频主要是带大家来讲解无限的 bug 以及向高度的一些反馈,小的一些处理,其次还有向 web socket 等相关的一些处理,一口气来带大家把这些技术啊全部 安排。如果你也对前端逆向攻防感兴趣,老何啊我专门给大家准备了爬虫逆向实战的一个直播课,还会透露制了全套的逆向入门学习视频,大家记得在粉丝群里面来进行获取。首先我们使用鼠标右键啊来查看当前的一个右键,点击检查打开开发的工具, 然后我们像在开发者工具当中来选择网络来进行他的数据监听,那么首先大家请看啊,呃,我们会发现像这个网站,当我们打开我们的开发者工具的时候,我们首先会发现在这里他出现了一个什么反调试对不对?就出现了一个反调试, 那么如果我们一般遇到像这种反调试的时候,我们需要去了解一下,就是当前的这个反调试到底是以什么形式来进行构成的,因为目前像我们最常见的有两种反调试,一种是直接构造器构建返回为空 对吧?还有一种就是构造器对吧?构建返回对象的他会有两种情况,而且这两种情况的话,我们的处理方式都是不一样的, 对不对?这个大呃,之前我讲过很多期啊,应该朋友都有了解,对吧?那么我们首先可以在这里你看啊,首先我们在不确定他是什么情况下的,我们直接鼠标右键点击一定不再次停止,然后把它释放,然后我们就会发现他其实还是会不断的给我们来进行他的一个触发, 是吧?还是会触发,那么如果出现这种情况的话,我们只能通过以后客的方式来过掉当前的一个反调试功能, 对不对?通过后客,那么在这里我们可以使用浏览器插件啊,你看我们可以使用浏览器插件,因为目前其实现在有很多的成品的一些工具,像这些工具的话,我们都是可以直接使用的,是非常方便的。你看这有个脱环镜的一个装置啊,打开开启当前插件, 然后开启当前插件之后,在当前页面里面打开我们的扩展程序,打开我们的插件,然后在插件里面会有一个叫做绕过无线的 bug, 看见没有,把它开启,然后开启之后进行页面的刷新,记住啊,一定要刷新一下啊, 啊,刷新一下,好,那么当我们刷新之后再次去进行检查,我们要看看它有没有开启啊,因为有些情况下它可能因为浏览器缓存的问题,从而导致我们没有开启,所以我们在这里可以多试几遍 呀,这个是开启成功,那么当他开启成功之后,我们再次的打开我们的开发工具,我们就会发现,对吧?还是有一个地方来我们来看,那么像在这里,你看为什么我们现在我明明已经把这个东西给他开启了,为什么他还会出现像这种情况呢?对不对? 那么如果出现这种情况,我们可以点击下一步,对吧?来进行调试,点击下一步来进行步入,对吧?来步入,来步入,对吧?来步入,我们步入之后可以来看一下他在这个地方有什么样的一个逻辑。那我们来看啊,然后我们先在这里来看一下啊,在这行代码的上面打在这个地方啊,这个地方其实就是当前的这个构造器的一个构建,是吧?你看我们可以把这个代码给它拿过来,你看 就是由这个代码它来构造了我们刚刚所看到的一个 bug, 记住了这个就是它的一个构建方式。那么像在这里我们可以把这个代码去进行拆分,你看我们首先可以怎么拆呢?第一个我们先来看一下它的第一个部分,这是它第一个部分,看有个小列表,对不对?是主,我们看它结尾,你看首先可以把这个地方,它这个是进行的混淆啊,朋友们进行的混淆, 所以我们在控制台当中啊,我们直接把它进行输出,然后你看它输出内容是不是?你看上面这个是为混淆的代码,下面这个是我们当前输出的结果,也就是当前代码它会执行一个什么样的事情,我们会发现你看它是什么?它是一个构造器,对不对?是不是一个构造器?然后它通过当前的这个构造器在后面的话有个小括号,我们看这个小括号的结尾在哪里啊? 然后这个小括号的话一直到这里结束,对吧?我们可以把这个小括号里面的内容把它拿过来看一下是一个什么,你看是不是一个 bug? 是 不是一个 bug? 然后我们再往后推,再往后推,我们可以看到它后面在这里又有个中括号,我们把这个中括号内容把它拿过来,对吧? apply 然后去载入一个对象,对不对?你看 是吧?那么也就是说我们当前的这个代码,其实它实际上我们看起来是混淆的。构造器,然后我们的括号, 嗯啊,先写一下啊。第 bug 点 apply 是 吧?然后这个 apply 的 话是载入了一个我们的对象,然后这个地方的话应该也是一个括号,对吧?这个地方应该也是一个括号,对吧?应该也是一个括号来构造了一个 bug, 因为它是一个方法嘛,应该是这样的形式, 对吧?它差不多就是这种形式,它就是这种形式,对吧?这个就是我们还原之后代码,我们可以看一下啊,因为它这里有个小括号嘛,对吧?你看它这里有个小括号, 你看构造器低 bug, 然后 oppo 来载入一个对象,那么像这种的话,我们一般我们当前啊,我们开启的这个无线低 bug, 其实它也是可以解决的,只是说它,嗯,这种比较简单,所以它没有检测到,那么像这种我们可以怎么办呢?其实啊,我们可以自己尝试,就是以手动的方式去进行注入,也是可以把它解决掉的, 明白吗?怎么怎么样进行手动注入呢?来我举个例子啊,我把当前的插件给它关掉了啊?你看我先把插件给它关闭, 来,我重新刷新一下,然后把插件关掉,那么如果我们把插件关闭的话,那有没有什么方法嘞?呃,就是我们可以通过手动的方式来编辑一个 hold 代码来进行注入,然后也是可以解决的。稍等一下,这个网站它已经卡死了, 我重新加载一下脚本哪里?呃,同样呃,点点关注就可以了啊。点点关注,点点关注。然后在粉丝群里面啊,在粉丝群里面记得添加粉丝群啊,然后我们来看一下,那么像在这里的话我们可以在这个地方啊,你看我们不使用插件的方式啊,就是你刚刚跟我用的插件,但是我把插件关掉了,对不对? 是吧?脚本在哪里勾选呢?脚本你就直接里面有个反调式啊,有个反调式你把勾选就可以了,对吧?哦,您说脚本是吧?不好意思啊,我以为你说啊插件那 脚本的话它是不是勾选的?脚本是需要我们自己来写的啊?你看,首先我们理解了它当前的构造方式,我们可以打开我们的左边的一个面板,在这个左边这个面板里面它会有一个叫做代码段,大家看啊,有个代码段你可以点击新建一个代码段, 然后新建一个代码段之后你们在这个地方你们可以用 ai, 就是 我们很多朋友们可能很多时候就不会写代码,对不对?不会写代码,那么不会写代码的话,我们要学会使用 ai, 目前像 ai 在 市场可以说是用的非常火的,而且我建议在座的朋友们大家都可以去玩一下啊,就是基于我们本地的 open cloud 的 一个部署, 我最近的话把 openblu 的 一个部署是已经部署完成了,整体来说的话我是直接部署了,在我的优根图里面,说实话还挺不错 的,是吧?挺好玩的是吧?挺好玩的,就是完全的是把音乐、视频还有像图片,对吧?像这些东西把它整合在一起进行使用,非常方便。呃,当然了,我们做编程的话可以直接使用这种,也可以,你看,比如说你看它当前是一个什么,对吧?网页当中出现反调试,也就是 bug, 通过构造器 构建的 debug 对 象和 debug 方法返回一个对象,现在需要进行 code 注入修改为空。 那么像在这里的话,其实你看就是这种提问吧,一个很简单的一个提问,对吧?一个很简单的提问,然后像在这里的话,他会告诉我们使用他的一些方式,你看他这下面有个非常常见的一个方法就行,代码看到没有,对吧?这个不是说全部要复制啊,就是你可以只用方式一、方式二、方式三,这两种都是 ok 的, 就是我们只要使用其中的一种方法就可以了, 明白吗?他这个无非就是说把当前的构造方法给它进行置空,对吧?最常见的一种方式,你看置空我们可以来到这个地方,是吧?可以在代码段这里去新建一个代码段,新建完成之后把当前代码复制过来,记得 ctrl s 保存一下,然后点回车并执行, 然后执行之后我们点击执行这个地方,那么当前的 bug 已经为空,点击一律不再是停止,然后可以尝试一下,你看其实就把它解决掉了啊。但其实像这种的话,你们要注意啊,就是像这个地方有个坑,有个什么坑呢?因为当前我们通过 ai 的 方式,它帮我们生成这个方式啊,它是没有进行,比如最基本的向 print 的 一个处理的,也就是圆形念, 对吧?圆形念它并没有去对于我们相对的圆形念来进行处理,所以说我们可以额外的给它增加一些体式尺,比如说我要再处理一个构造方法里面的圆形念的一个 bug, 是 吧?人会更加好一点,呃,总体的核心代码的话,我们就是通过这种方式来进行编辑就好了。来,我教一下你们啊,这网站卡死了, 就是你们看这个网站,他如果说你没有注入成功,你的 bug 没有过掉,他会直接卡死。就是主设是吧?这个叫做内存爆破,明白吗?叫做内存爆破,就是直接进入了一个主设的一个状态啊,可以重新访问,重新访问之后我们像在这个页面当中啊,你看啊,哎,卡住了,然后我们来看啊, 是吧?那么如果说我们想通过像有带有一个像他的 type, 也就是圆形链的一个逻辑的话,我们就换一种方式,对吧?呃,我就问他说你还没有发给他,哎,我就昨天讲的, 我现在发给他,稍等一下我现在发给他,我现在发给他。你是曼曼老师而已,是吧? 还有点慢,稍等一下啊,等下打开了,我们先把这个讲完啊,然后像这个构造的话,我们来看一下是如何构造的啊?我们可以直接来通过,你看这里会有一个我们的构造的一些方式,我们可以通过像,你看啊,这有个 bug, 你 看这就是以圆形面的逻辑来作为一个基础的一个处理了, 你看它会有个 print, 是 吧?会有圆形链的逻辑,可以把它执行,你看把它执行,然后把它执行之后执行之后,那么现在的话它是可以把它成功过掉的哦,然后我们像在这里我们来继续。那么当前像这个 bug, 我 们把它过掉之后啊,我们可以来到网络页面,你看现在它其实没有卡了,看没有是没有卡了,这就成功把它过掉了, 这就是一个反调试啊,反调试非常简单,有我教你们很多方法,你可以通过我的这个浏览器的扩展程序,也就是通过这种插件来直接把它过掉啊,也可以通过向后壳注的方式来把它过掉。好吧,根据自己需求来,然后我们现在来进行监听,来看一下这个网站,我们点分页,第二页分页,大家有没有发现它没有数据? 各位你,你会不会很奇怪?就是我们当前,你看正常来讲的话,我们进行监听,我们是不会来监听到我们当前的服务器跟数据,服务器跟我们的客户端他们之间的一个交互的一个 logo 信息啊,现在没有没有信息,看没有它里面没有看没有它,没有它就一张图片,一个 p n g, 是 吧?为什么会出现这种情况 哒?为什么会出现这种情况?一般这种情况大致分为以下几种了。第一种就是可能它是第一次在做加载的时候,就直接由 add x 接口来全部把所有数据全部都加载过来了,这是一种。第二种,它可能是基于 套接制,也就是 webstick or webstick 的 方式来进行它的一个数据的一个传递的,对不对?它是基于一个 webstick 的 方式,所以你看我们在这个地方啊,我们要额外去做一个处理,就是进行整体页面的刷新,但是不要清空啊,你看整体页面进行刷新, 然后刷新之后我们重新来注一下这个 bug 啊,来注注,这个就是你们用脚本注注,它可能每次都要自动注注,每次都要去手动去注一下啊,但是用插件就不用插件,它会自动给我们过掉。 好,我们来看,那么在这里朋友们请看是不是在这里是不是有一个 websocket 的 一个链接,是吧?里面是不是有很多的消息队列啊?你看是不是有很多的消息,你看像这种,朋友们,你要记住啊,今天这个比较特殊,它采用的是一个以 web socket 的 方式来进行它的一个数据的一个加载, 然后还有记住一个坑,就是 web socket 一 般给我们所返回的这种消息队列啊,它是,呃,就是这个地方啊,它是要解密的,这个地方它也是要解密的,你看啊,我们可以把里面的数据先清空,清空之后我们点击,你看删掉,这里还有轨迹,先不管它了,我们点击分页了。哎,我怎么把 web socket 给删掉了?重新刷新一下, 就是像 web socket 的 话,它是做的是直链,对吧?像这种的话,我们不要把它清空的话,它会导致我们当前的数据会有问题啊, 你看我们不要清空这个,我们清空这个就可以了,就是把里面的数据给它清掉,然后我们现在在页面当中,你看我们下滑来把全部清除,清除之后我们去点击分页,然后我们的鼠标在上面的话,它这个地方应该还有验证码, 这个网站很明显其实还是有验证码的。那为什么说是还有验证码的呢?因为像在这个地方我们有没有发现,就是当我们把鼠标光标去放到上面的时候,今天这个网站比某红书更有意思,这个网站不比某红书难的多,某红书这种东西说实话目前市场比较简单。然后来看啊,那么在这里你看他这个其实就是有轨迹, 那一般像这种 webs 如果有做轨迹验证,基本都是有验证码的,只是说我们可能还没有触发明白吧?还没有触发,你看把清空,清空之后鼠标光标,你看是不是?好,那么我们同样的去点击第二页,当我们去点击第二页的时候,你会发现它在下面去额外的给我们加载了更多的一个数据, 是不是加载了更多的一个数据,对不对?而且你们要记住啊,一般像我们这种像这个它所返回的,其实上我们是还要做一个简易的啊,给大家讲一下,就是这个地方它所返回的数据 还需要做一次解密,那还需要做一次解密。那么在这里我们又该如何来找到当前的 webs 的 它所返回的这个密文呢?把如何找到这个密文呢?因为你要记住我们在网页端里面所看到的其实是一个明文状态,对不对?比如说他从服务器来给我们返回的这个叫做消息队列, 可能是一个字节,对吧?或者说是呃,被额外的处理过的一些东西,对吧?就是加密的就这么一个东西,所以呢,我们在这里我们还要去找到它的解密的位置, 对吧?还是要去找到它解密位置,明白吗?然后这个 web socket 我 们怎么做请求呢?我给大家讲一下啊,一般像 w s s 的 请求,你们可以直接鼠标右键点击复制里面的 c u l, 也就是背斜格式,然后我们可以直接基于 ai 来帮我们编辑 使用 python 代码完成 wss 的 请求,把这个 c y 啊,把它复制过去。那么像在这里的话,你看啊,在这个地方的话,它会直接去给我们做一个处理,但是我给大家讲一下啊,这个它会给我们生成啊,我们等一下再回来。但是我在这里有个重点需要给大家讲一下啊,就是 ws s 的 派帮会有个 key, 大家请看啊,它会有个密钥,会有个 key, 是 吧?有个 web socket 的 一个 key, 其次在它的请求地址里面,这些信息啊,它也是变化的,那么这个数据它又是怎么来的嘞?基本目前市场大多数的像 ws, 也就是 web socket 的 这种数据流,它首先会先有进行一个 key 的 一个加密, 会有个 k 加你这个 k 的 文件是叫做 cc, cc 的 一个文件的,这个 cc 的 一个文件它里面是会返回很多的密文,密文数据,这个密文数据我们在进行解密,解密之后我们将会得到 w s s 的 一个 k, 我 们才会得到它的 k, 得到 k 之后,然后再进行带入,然后再来请求 webs 的 链接,然后获取数据,然后还要解, 而且像上面的姐妹跟下面的姐妹是不一样的啊啊,这里面给大家讲一下啊,你们来看一下,它在这里会有一个叉 h r, 对 吧?叉 h r 的 这个结构里面啊,它里面会有个 c c s, 大家请看它是不是有个 c c s, 这个 c c s 它里面的话会包含我们很多的一个密文数据, 目前在市场基本,嗯,目前我遇到的 webshop 的 网站起码有二十多个网站了啊,起码也是有二三十个 webshop 的 网站,那么像这些网站我可以明确告诉你,不管是国内还是国外基本都是这种价格方式 啊。所以说其实现目前 web socket, 你 们基本只要学这么一个,你就能够把目前市场基本的 web socket 的 逻辑你都能搞定 明白,你都能搞定,它里面的核心其实就是在于解密,然后我们可以看一下这个 c 序式的接口,它里面的请求体也是加密的,你们需要注意一下啊。首先我们要先来解决什么呢?首先我们如果想来成功的来构建我们当前的这个 web socket 的 它的一个执行条件,那么我们首先一定要先得到 web socket, 就是 wss 请求它里面的 k, 对吧?那么我们想得到它的 k, 它的 k 的 话又来源于这个 c s 文件,这个 c s 它里面需要解密,然后才能得到 k。 那 如果说我想把这个 c s 来构建成功请求,我是不是还要把里面的这个请求体里面的 data 也还需要来额外进行处理, 是不是啊?好,那么在这里你看,我们既然分析清楚之后,我们先做第一步请求,先来请求当前的 c s s 的 一个文件来右键来复制里面的 c o l 我 们的 base 的 一个格式,然后来快速的先来构建一个基本的 python 的 request, ok, 把它复制过来,来, 我们来创建一个文件啊,这个加密案例合集,我重新新建一个啊,新建一个文件夹, 来,我们来创建一个 python 的 文件,来创建一个 code, 好, 我们来看把这个代码先改套过来。那么在这里我们首先因为我们要记住这个地方它会返回的数据,我们需要解密,要写个注示,是吧?需要,对吧?返回的数据解密来获取 w f s 的 一个 key 啊。然后其次在它的接收 data 里面,我们会发现它会有一个 data 的 一个加密啊,会有个 data 加密, ok, 我 们首先要来先解决一下这个 data 加密,因为记住哦,它这个是动态的,你每次进行页面的刷新它都会变, 它都会变,明白吗?那么在这里我们现在来尝试一下来解决一下这个 ccs 里面的 data, 那 么怎么做呢?首先像这种啊,我们可以直接去看到它的后面这个地方啊,有个启动器,我们点过去,然后在启动器里面是会有它对应的一些请求的量对战, 对吧?当然其实像这种我跟大家讲一下,它加密定位,我们去掉它的请求对战会非常的麻烦,我建议大家是通过候客来直接候客里面的 x m l 对 象,这是 x m l 对 象,可能是更加的完美一点,明白吗?那么在这里我们来试一下吧。好吧,来试一下,首先我们先来处理一下它的请求掉队赞啊,来,我把这个插件开一下, 因为这个反调试的话,等一下啊,一直触发,我也懒得去搞这个反调试,我也懒得去搞了啊。好,那么在这里我们现在首先找到请求掉队赞这个地方,我们可以做叉叉断点,当然我们直接点过去,点击进入这个肾的这个地方来点进去,然后打一个断点,我们在页面当中进行刷新, 刷新之后会进行断点,然后当前断点之后,朋友们你们需要来注意啊,大家请看在他当前的请求头里面也存在一个加密,我们看一下啊,是不是他不止一个地方加密, 对吧?他的请求头也是属于一个加密的一个状态,那么像在这里我们继续向上回溯,你看我们回溯一下,看一下我们当前的接口是不是我们要的 没问题啊,我们当前的 data 也是属于我们的密文状态,对吧?我们继续回数打根对战嘛,然后这有个 d, 这个 d 里面的话,它对应的是我们当前的 data 的 值,对不对?是不是啊? d 里面是包含的是我们的 data 的 密文,那么我们去观察一下当前这个 d 是 怎么来的,我们来选中当前的 d 方法, 然后当前的 d 方法的话,我们可以看到 d 方法是在这个地方是来做了一个值的一个接收, 来看啊,他是不是在这个地方是来做了一个值的一个接收,而且是纯混淆的一个接收,那他是一个纯混淆的接收。那么在这里我们很多朋友会想啊,像这种混淆接收,那么我们可以做还原对不对?但是做还原你们要注意啊,我们可以去往上翻,大家有没发现就是在这个文件的主体当中,我们会发现他有很多地方是没有混淆的, 是不是啊?如果说我们直接把这整个文件给它掏过去做还原的话,我告诉你是不现实的,对吧?是不现实的,那么我们在这个地方我们应该正确的是该怎么去做呢?首先我们可以大概的去往它的上下附近去翻一翻,我们会发现就是它的这个构成的格式啊,朋友们有没有发现它们是这种形式构成的?我们可以把它折叠, 我们可以把它折叠,这是一个什么形式?这是不是一个 mypark, 对 不对?这种格式是不是一个 mypark 啊?看出来吗?朋友们,这个格式是不是一个 ypark 的 一个形式?这个是什么模块,对不对?是模块。那么在这里我们可以直接来尝试进行搜索,来找到我们当前需要的模块,它的开头的位置也就是它的上一个位置,也就是这个吧, 对不对?我们当前要的整体的部分是不是在这个里面?是不是在这个里面?我们把它里面的加密的主体部分也都是在这里啊?我们可以把它里面的代码进行折叠,或者我们可以先单独把这个复制下来啊,把这个复制下来, 我们把它放到我们的本地,这样我们才好分析。来,我们新建一个 js, 来,新建一个 m e, 然后把当前复制的 wifi 的 模块给它全部拿下来,右击点击全部收起,然后依次折叠 来,朋友们我们来看,首先在这里的话,其实我们很清晰的可以看到啊,我们的主体的加密的逻辑在哪里了?我们可以尝试进行搜索来找到它来,我们定位一下,我们当前的 d 方法有四个啊, 是这个吧?这个地方是不是就是我们当前所对应的一个加密位置,那么在这里我们就可以去尝试来对当前的代码来进行还原,但是我们要去注意当前的就是给大家讲一下啊,因为还原啊,在浏览器里面 它也它也是有那个还原的一个数组的,它会有个数组,或者它也会有对应的方法,因为浏览器它也需要还原它才能够来进行,所以我们需要在这边我们要去看一下它当前这个,比如说这个 y 方法,这个 y 方法我们是否有的嘞? 对不对?它的还原法,我们点击进入这个 y, 然后我们可以看到 y 的 话在上方是有一定的声明,那么在这种情况下我们就可以尝试来对它来进行还原。 呃,可以把不要的部分我们可以把它删掉,前面有很多地方,我们像这种不要的部分可以把它删掉,是吧?当然我们也可以在这个地方可以做手动还原,也没关系啊,那手动还原也可以啊,因为这种我们还不一定能还原成功。来吧,来,你看这个 f, 我 看这个 f 是 负值,是谁啊?我发现这个 f, 你 看我们找不到 他,是吧?我们这个 f 我 们找不到他,所以啊,我们当前需要在浏览器里面去观察一下当前这个 f 他 手指向的是谁,以及他的 y 的 指向是谁,你看这个 y 的 话,它是指向的一个 x, 这里面有 i v。 呃,感觉有点像是我们的 a s 的 加密和 a s 的 解密啊,有点像啊,有点像。然后这里的话有个 f, 我 们点击跳转对应的 f, 然后把还原啊, f 的 话在下面有个 n, 对 吧?它是在 n 里面去知道 n 的 话有对应的 a, ok, 来,我们这样啊,我们直接操作一下啊,我们直接试一下啊,我们把这当前这个全部复制粘贴,我们来做一个 o b 还原试一下,好不好?那我们做一个还原试一下, 朋友们如果有什么不懂的地方可以及时提问啊。来我这里话有个还原的文件,来,我们首先把这个混淆代码给它复制过去,那把它复制过去,那好,然后我们把它复制过去之后,对吧?然后在这里我们去尝试对它进行还原,我们来试一下啊,进入我们的 c、 m、 d 命令终端, 然后在终端当中使用我们的 p、 n、 p、 m, 然后执行 e m p 执行还原,看能不能还原啊?不能还原 里面缺少了它的还原的主方法,对吧?它里面有些对象我们是没有看,对吧?然后如果说我们把代码全扣,然后来进行还原的话,那更加的不现实,因为它里面的代码太多了,朋友们给大家看一下,好吧,不然等一下会出个疑问。你看啊,这是它全扣代码,它的全扣的代码将近有, 呃,五万多,我们可以尝试一下,没关系,可以尝试一下,因为像这种东西我们可以试啊,来我们来看,然后我们同样的方式去进行它的一个执行,你看啊, 是不是也是还原不了的?因为它这里它还加载了其他的文件,看到没有,是吧?还加载了其他文件,所以像这种的话,其实我们就不能够还原,还原不了,这种文件是属于还原不了的文件,那么如果说我们自己还原不了,那么我们就只能尝试手动还原了,明白吗?这个地方我们一步步撤 除了,手动还原之后,你们也可以用 s t 嘛,对不对? s t 大 知道吧? ok。 然后像朋友们,像我们很多新进来直播间的小伙伴,如果说觉得老胡讲的不错啊,可以点点关注,刚刚还有朋友讲到某红书的视频啊,要呃,可以点点关注,然后在粉丝群里面去找个小助理,让小助理发给你就 ok 了, 你看嘛,朋友们,你看一下你们自己有什么问题没有啊?那么手动还原又是一种什么样的一个还原方式呢?其实手动还原的方法其实很简单,就是一个一个来,你看啊,今天咱们处理一下啊,首先我们把当前这个代码拿过来,因为我们当前我们知道这个 d 它里面所生成的就是我们的 data 的 结果, 知不知道? ok, 那 么手动还原无非就是这个地方我们把它进行选择,然后把它进行替换, 替换来把后面这个部分啊,我们也把它全部替换,你看我们把后面这个部分也把它进行替换,我们就是把它纯这种手动还原,这个就叫做手动还原,对吧?里面还有个 m 啊,但是这个地方我们可以来看一下这个 m 啊,它有没有做额外的处理,还是说直接就是铭文? 然后我们能够看到这个 m 的 话,它里面是包含了我们的浏览器的一些信息和一个 u i d, 对 吧?甚至可能会有指纹, 是吧?里面还有指纹,你看它其实就是我们的浏览器的一些呃,指纹信息和我们的 u a 信息, u a 是 在这里啊,然后还有个 u i d, 这个地方暂时不确定是否固定,我们先把它拿下来。这个地方比较难啊,来生成一个 m 来先把它复制过来,等下再改啊。好,然后在这里我们还需要去注意一下,因为在当前像这种混淆的,它可能会有层层签套。层层签套是什么意思?就是在这个里面它可能还会有签套其他代码, 对吧?所以我们要去重点去观察一下当前这个方法,他在这个方法里面是否还有签套,还是直接返回的。我们进入这个方法啊,输出,输出之后点击跳转看点一下跳转,然后跳转之后我们可以看到他是跳到了这么一个方法里面,然后在这个方法里面,其实上我们是可以,哎,我们这点错了, 哎,是这个方法,我要把地方先删掉先啊,然后我们来看啊,来手动还原做映客啊,我们在这个地方把它进行选中,对吧?把它进行选中,然后进行跳转,呃,就是它,对吧?就是它,然后当它跳转之后,在这个代码里面它其实上是有做了很多的一些处理, 我们把复制一份,我们先把复制一份啊,我复制一份,好,复制一份。复制一份之后我们来观察一下,就是在这里面它肯定有很多东西是我们不要的,对吧?它最终的返回是在这个地方嘛?这里有个 return 对 不对?有个 this, 所以 我们当前在当前的这个 this 的 前面给他打一个断点,然后回车 来,我们重新刷新页面来进行调试,记住啊,来重新刷新一下页面。嗯?怎么卡不溜叽的?堵塞了,堵塞了。稍等一下啊, 可能我的内存可能溢出了,因为我我好像本地的很多服务没有装,因为我今天下午在部署了个 ai, 有 很多东西可能没装, 然后把我的内存都占掉,我内存是三十二 g 的 内存,三十二 g 的 内存都占满五十了,因为我搞那个 ws l 的 一个部署, ws l 的 话,它里面装那个东西它就占了我十六 g。 好,这个地方是断点了啊?断在外面,对吧?我们进去,然后来看,呃,我们首先在这个地方我需要来分析一下当前这个代码啊,这个代码它的结尾在哪里?我们可以翻一下它结尾后面括号是在这个地方吧,那么也就是说这个地方是为它的一个主体的一个 bug, 看一下是不是密文,是不是会返回我们加密好之后的 a 卡, 这返回了我们加密好的一个 beta, 然后这一串代码我们同样的可以把它拿到本地下面的代码可以先不管它这个代码其实它里面都是还原法,这个地方才是它里面的,就是这个 in trap ches, 它里面的核心加密的返回其实就是它,对吧?那么在,那么在这里我们同样的我们需要去做一个手动的一个还原, 这样的话我们就会更加的清晰嘛。好,这个地方你可以把代码格式也稍微整理一下啊,比较好看一点,因为它后面这个地方它也是一个还原啊,你看我们可以把 copy 看到没有,它也是一个还原,其实我们可以看到它在这里核心其实做了一些曲值,看到没有?首先取一个 e 值,看下 e 是 谁? e 值,然后再是我们的一,然后还有个 iv。 嗯, 我跟你说那么简单,你是要原码是吧?原码的话我们是不提供的啊, 新版的它新版的跟之前老版的没有什么区别啊,区别不是很大呀,就是这个就是这样的,它新版的无非就是说它额外的就是它的那个 gsp 代码啊,它那个 gsp 代码你要压缩一下, 就新版的它其实说白了就是之前它不是有个那个环境检测嘛,之前是在其他文件嘛,但是现在的话,它里面是把整个文件都堆在一起的嘛,然后里面的检测点它只是多了些圆形面的强检测, 那核心就是那个 m n s v i, 你 可以说一下你是什么问题?天海同学,你是这个 m n s v i 补不出来吗?很多时候你环境补的差不多了, m n s v i 它如果没有,那么你少了一个 win 点 top, win 点 top, 把 win 点 top 补一下可以了,对吧? win 点 top 还有一个是 safe, 就 这个地方,当然你可以补个了。 this 也可以补 word 啊,都是一样的啊,一个是我们的 safe, 还有一个是 word 点 top, 这两个你把它补上基本就可以出现了, 明白吗?因为很多人他在用黄金代理检测的时候,我们会可能就没有注意到这个 windows 点 top, 因为 windows 点 top 目前新版的话是在 google this 上面进行。知道啊,好,那我们继续。那么在这里我们可以仔细观察,我们会发现,其实当前的这个 e 以及这个 this 里面的取值和这个 this 里面的 i v, 它里面取的值是不是取的就是这个 m 里面的值 啊,朋友们,他是不是就是,哎,好像不对,不是,这个 e 的 话是我们的 m 里面的值,但是后面的这个 gs 这两个值好像是重新声明的啊,看一下,这两个值好像是重新声明的,但其实我们能够大概可以看到这个地方,它有点类似于我们的 aes 了啊,十六位,那它可能就是啡药和 iv, 是不是啊?密钥和 iv 可能就是我们的密钥跟我们的 iv, 当然了这个地方可能它也是固定的啊,这个地方我给大家讲一下,可能是固定,当然它有可能是固定,但是我们可以先把它固定,就是我先教你们里面的核心的主体方法啊,像这些参数啊,这个等一下我会给你们讲到的啊, 对吧? ok, 那 么在这里可以看到它里面现在又有一个重点的一个调用方法,它重点的一个调用方法其实是要的是它吧? 是不?它?那么也就是说我们当前在这个地方啊,我们可以直接把它进行替换的,其实就是它是这么一个结构,只是说当前这个一值,我们要额外的使用我们的节省点。 str 转一下,我们大写的, 对吧?把它整理成一行代码,这个就是反混响的一种处理方式,就是手动还原啊,手动还原,对吧?然后其次我们现在重点的需要来分析这个方法对不对?然后在这个方法里面我们会发现它所指向的是谁?它所指向的是不是在这个地方, 对不对?然后在这个地方它里面也是做了一大堆的,呃,工装什么的啊,我们同样的可以把它 copy 下来, copy 下来之后然后再次依次裁剪啊,某东的风控,你是说哪方面? 你是账号还是验证码还是什么?搞定,然后我们来看,然后在这个地方啊,同样的就是我们很多时候遇到这种情况,我也不知道该怎么去处理,对吧?我们可以同样的就是稍微花点时间去把它里面的一些核心点把它分清楚,或者我们可以看结果。什么叫看结果?结果就它最后一行代码, 就它最终的返回的位置,我用三点一一二,三点幺二或者三点一三几都 ok。 好, 来我们来看啊,那么这个地方就是有时候我们遇到这种它比较复杂的这种逻辑的时候,我们可以看结果,然后根据它当前的结果所依赖的一些内容,然后再向前推, 对不对?向前推。所以啊,我们在这里你看我们可以进入这个方法,在它最终的结果的位置打上一个半点,你看像这种带你们硬搞这种混响,说实话啊,你自己听好。那么在这里我们是能够看到它总共是会有两段值的返回啊,请大家注意啊,首先这是第一段值, 然后在屁股后面它还有一段值,有没有发现它还有一段值,看一下后面这个地方是干嘛的?来我们把它, 我们可以看到这两段值的话是返回的是相同结果,结尾是 g i f c q, g i f c q, 是 吧?我们可以看到这两个地方它返回的是一样的, 对吧?那么我们在这里我们就以它作为结果来进行推导。朋友们看啊,这个代码我们可以先全部先暂时把它清清空,就是上面这种我们可以先全部都不要,可以先全部都不要,免得麻烦,晓得吧?然后这个地方把它改一下啊,直接改成方法, 看我怎么做。那么现在我们首先这个地方是不是我们的结果?我们结果我们来做反混小,把这个结果的位置进行反混小,首先可以尝试进行还原,你看啊,我们在这个地方手动去把它进行还原, 也不还原是吧?不还原只是抠代码的微点,对吧?不还原抠代码的微点来我们手动还原,下面这个也是一样的,我们就是把这种数值取值的内容啊全部进行还原, 哦,下面这个地方就是做了一个替换,对吧?其实当我们把它的主体代码解析的比较清楚的时候,我们会发现它下面其实做了一个替换, 对微值进行了一个替换,这个地方大家能看明白吧?然后我们现在再往上推,推的重点结果在哪里?重点结果的话我们应该是在于这个这里有个方法,这个方法看是干嘛的?我们先从后面猜,后面猜,前面它的返回结果是直接返回 e 或 t, 是吧?返回一或 t 就是 直接返回他没有处理的,对不对?他是没有处理的,那么也就是说当前这个方法其实我们要不要都无所谓, 因为他会直接返回他返回他或他是不是两个都可以,那么我们这个里面的其实最后这行代码其实没有什么用,对吧?我们最终发现他其实实际上是没有任何帮助的,那么也就是说我们当前的重点是不是只有这行代码,对吧?首先是一个微值,我们可以看一下微值的构成 是不是一个 v 值,然后 v 值它在屁股后面还会有个拼接,这个拼接它到底是拼接的什么东西呢?看一下是吧?会拼接一个柱状 是吧?那我们一个个来,首先我们先去找到我们当前的 v 值的构成,找到 v 值, v 值的构成和 h 的 构成是不都在这里?你看我们继续向上推来,把我们当前的 v 值跟我们的 h 给它找下来,你看这里也是混响的,那么混响的怎么办?手动去进行还原对吧?硬钢里面的混响 像这种难度可能很高啊,请仔细听啊,来把还原。其实我们还得差不多的时候,其实我大概可以看出来它应该是一个算法啊,它这个地方它其实有涉及到了关于 i v 什么一个处理,我们其实可以去换种方式。 呃,券后架的接口和几千个就封号了,需要搞数据听嘛?呃,你这个封控账号了,你可以去试一下,看一下你的手机端,去登一下你的账号,看一下会不会出现人脸,看一下是不是验证机制的问题。正常来讲你你如果是一个实名的话,账号的话它不可能封的那么快, 你看是不是触发人脸了或什么的,是吧?你看一下就是你那个,你看一下是不是触发人脸,就是你在 y, 就是 你现在应该做的,就是通过协议也是做的 app, 最后一下你一般只有 app 能看得到吗?是不是你?如果你也是做的 app, 很多公司估计想撕了你吧。撕了我干嘛是吧,又不干啥,是不是撕了我啊?这个 w x 朋友是吧?然后像这个同学讲到的啊,就是迪拜的朋友,就是你这个地方是你自己可以去验证一下,看一下到底是什么原因,对吧?你不一定是账号,正常来讲你一个老号怎么可能几千个就得把账号封控了呢? 啊?它是提示你说账号不行了吗?是不是出现人脸了,你看一下啊。 好, ok, 来我们继续,那么在这里的话,其实你看我们能够分别可以看到我们当前的 v 和 h 是 不是都 ok 了,继续向上的推,那么下面我们该怎么去推呢?其实大家请看啊,其实我们再往上推的话,其实我们在这个地方我们现在缺了个东西,就是这里缺了一个 d 括号,它我们没补值,对不对? 我们来看一下他是谁,记住补代码千万要一个一个来,尤其这种反混销,我们要一个一个来,不要,对吧?补着补着补着,不知道自己都不知道补到哪里去了,明白吗?所以我们像在这个地方啊,记住先把被加密的内容进行处理, 明白吗?先把被加密的内容进行处理,再去处理它外部的加密方法,晓得吧?那么在这里你可以验证一下嘛,看一下它其实就是一个 bc 四,看见没有?你像这种如果说你没有去处理的话,你说实话是不是很麻烦? 这个地方它其实就是一个 percent 四,对不对?然后我们再来看它的方法,那么在它的方法这里我们可以看到这个 h 的 生成,它里面会有三个字叫做分别为 p、 t、 n, 对 吧?可以先不管它,我们先处理这一行,那么这个是 v 的 生成,那么在 v 的 生成里面会有个 h, 基于 h 添加了一个 update, 对 吧?有个 e, 然后有个 d, 来一个个处理,首先看一下 e 是 谁, 这个 e 的 话,它所传入的这个 e 值是不是就是我们进行接收化处理之后的我们的 m 值其实就是它吧,这没有问题。然后再是 d 值,这个 d 里面 d 里面有两个值啊,大家请注意 d 里面有两个值, u t m 八,这种固定的值可以直接替换,你看像这种固定的值,我们可以直接把它替换,然后是 base 四, ok, 其实到这个地方其实我们也可以大概可以看出来了,这个地方的话,它应该就是执行的我们的标准的 a s 的 一个加密,然后把它的输出结构以 v 六四形式再次额外的进行了一个编码, 这个网站有朋友处理过没有?其实我们处理到这里的时候,我们应该大概就可以猜测到它可能视为标准的 a s 了, 是不是?朋友们,那当然喽。呃,其实我们还可以测有很多方式,等一下我再教你们一个更加高级的方式,可以直接来看一下它是否为标准而言呀,等我教你们一个后口方法。好,那么在这里我们现在继续回头,对吧?这个地方我们是补的差不多了, 然后我们再往上推,就是 p、 t, n, 我 们分别观察这三个值,一个 p t, n, 哎,怎么是 e 啊? e t n, 那么我们可以看到 p 值输出结构是 a s 一 二八,然后是我们的一个 c b, c, 是 吧?然后 t 值和 n 值分别对应的就是我们传入的密钥和 iv, 是 不是密钥跟 iv, 那 么其实到这个地方的时候,我们已经大概明确了, 是吧?我们其实说实话,我们已经不用再继续去扣下来了,不用继续去扣代码了,我们可以直接把当前代码丢给 ai, 然后 ai 来帮我们直接来快速键 a s 一 百十八 c b c 的, 然后输出结构为一个色, ai 会帮我们自动去补全, ok? 不? 废话啊,我们继续先把今天这个案例讲完,有点难,那么当我们写到这个地方的时候,其实我们就已经可以尝试。当然了,我们如果还不知道没关系,如果还不知道,我们可以额外的再继续分析,因为我们可以看到当我们分析到这种情况下的时候,我们的主方法只有这一个, 是不是因为当我们分析到这个地方的时候,我们会发现当前的 h 点 add, 其实 h 是 不是也在这里?然后 v 的 话它里面指向的也是 h, 说白了现在只有这一个, 对不对?我们现在的核心,如果你想继续分析,那么你可以来到当前的这个方法里面,看一下这个方法里面他又做了什么事情,然后在这个方法里面以同样的方式可以把他呃一个一个去拿下来,这里面你可以看到他在这个地方进行了一个识别化,这个地方大家请注意一下啊,因为他有可能是采用的,是, 对吧?不一定是 a s, 呃,这个要给大家讲一下,它不一定是 a s, 对 吧?但其实实际上它是的啊,因为这个点已经写明了,对吧?但是你们要注意,如果在未来你们有发现它这种没有写明的,它可能只写了幺二八 c b c, 它有可能是古文译。我记得之前有个网站叫什么网站来着呢? 呃,也是 webservice, 然后它讲的是国密,那讲的是国密,那你们注意一下。好吧,那么其实我们当前写到这个地方之后,你看我们可以把当前代码进行复制,直接可以让 ai 来帮我们进行实现。你看 windows 系统里面使用 node 键, 记住啊,可以指定,对吧?可以使用第三方库来实现。 那么像在这里的话,我们就可以尝试在这个地方啊,它就会看一下。当然了,技术你还是要会,不能完全依赖于 ai, 如果你不会的话, ai 给你生成的东西你不用,那很很尴尬,是吧?里面可能有些报错,你不知道什么情况?我这个网怎么这么慢呀? 稍等一下啊,我这个代理好像有点问题啊,延迟三百多。难怪我说了,那怎么这么慢?来,我换一个 mini, 用这个 mini 三就快一点。 然后你看一下这个地方,你看他是直接可以实现,看到没有,在这个地方他会直接告诉我们来进行他的一个实现,是吧?你看其实就是一个表达方法都有没有发现把复制复制之后把镜替换,那么你看,其实我们看起来很高级,很高端,很复杂,但其实上当我们最终分析之后,我们会发现其实他原来如此的简单, 是不是原来如此的简单?所以其实你看我们很多看起来他很高级的逻辑,其实实际上当我们正常去把它分析处理之后,我们会发现他好像也 对吧,但是不要小看了它,它在这里面的话肯定是有风控的,你要肯定是有风控的,就是这里面的话,你可以看到它里面有一些 u a, 是 吧?这种可以不用管,但里面像这种 uzi 是 吧?可能要重点关注。然后其次还有里面的 u i d 和这个 c i d 这三个它有可能是变化的值,你需要处理一下。 好,那么在这里现在还有两个问题,就是我们当前我们是否还要去注意当前的 k 和 iv 是 否变化,那有可能是变化的呢?所以啊,我们要回到当前的网站来继续向前推导,我们要推到哪里去呢?我们其实啊就是在这个地方,对吧?在这个地方因为我们刚刚的传入的方法其实就是在这里。 哎,好像没有,我们看一下,来,我们直接打断点啊,这个后面不要了,我们重新刷新网站,来,我们重新刷新一下网站,来,我们重新刷新一下它啊,然后我们将在这里我们去看一下,因为我们当前要去确定一下当前的 i v 啊,还有当前的 k 啊,是个动态的,对吧? 然后还有解密,解密的话其实当我们分析到这里,其实我们也可以大概,大概的可以知道它当前的解密应该也是为 a s, 前面应该也是没颜色,来,我们直接走来,我们走到我们的低的这个位置,因为我们在这里我们可以看一下,因为我们当时的传入好像是在这个方法里面传的吧,是吧?我们可以进去,然后进去之后,然后往后推,往后推 是哪里来的?哦,这里这个,这是对吧?我差点都不知道是哪里来的。然后我们来看一下,我们可以看一下,首先看一下这里来 v, 我 看什么片 变的 ok? 朋友们,这动态好尴尬呀,是吧?我们还要继续,那么像在这里,我们现在同样的需要来重点分析一下,看一下当前的 iv 跟当前的 k, 它到底是以什么样的方式来进行构成。那么这里它采用的其实是一个 this 的 方式,所以我们可以直接看一下当前这是谁,你看当前这一次指向是一个 x 对 象, 我们可以点过去,你看当前的 x 对 象是一个非常庞大的一个对象,你看这就是一个整体的 x, 然后在下面会有额外的一些添加,添加了我们核心的一些方法。 当我们到这个地方的时候,我给大家重点讲一下啊,它当前的这种情况大多数有可能是服务器反悔的, 我们后面这个是什么?来看一下,忘记了,这地方没有还原,我要把还原一下, 我做何老师对吧?啊?我做我干啥是吧?我又不能煲汤喝是吧?你把我喝的能长生不老是吧?是,然后来看一下它,在下面的话,你可以看一下嘛?可以大概了解一下,你是没有, 这没得呀,对吧?朋友们,这没得呀,那么像这种没有的话,那我们再去考虑一下它有没有可能是接口返回的,因为我们当前它的返回的数据结构不是以密文状态,对不对?所以我们把所有的清除, 等一下啊,这个还要留其他全部删掉删除这个地方留着啊。好,那么我们现在我们来做一件事情干嘛呢?分析它最终的 response 的 数据,我们看一下它里面的 k 和 iv 是 否有统计版, 是吧?它有可能因为我们通过我们当前的观察,我们是发现它是有逻辑的啊,那么在这里我们又该怎么办呢?现在我们要来调它里面的这个 response, 对 吧?今天还讲后壳方法,肯定讲,对吧?我的 response, 我 就是带你们大家来学后壳看啊,是不是你刚刚这个你也没搞清楚, 这个的话我教你们,我把两个都讲合在一起讲,好不好?我先给你们讲一下,就是,呃,那么我们如果通过后壳的方式来捕捉它里面的逻辑,看啊,首先如果说像这种标准算法啊,我们打开这个后壳工具,它里面是有一个叫做我们的后壳,我们的 trap 键打开,对,打开, ok, 然后右键点击开发工具,那么在这里刷新一下,它没有加载出来。好,那么刷新之后我们可以看一下当前它有没有输出, 这种好像 hock 不 到,它这个网站进行了混淆,我们 hock 不 到, 你看像这种我们 hock 不 到,它进行了混淆, 这个 hock 不 到啊。像这个观察者同学,其实我们通过 hock 去 hock 里面的这些算法密钥什么的,我们发现 hock 不 到,因为它这个可能混淆太深了, 密码混响太深,那么我们如不行,我们可以你看,我教你们 hok response 啊,来,在这里怎么去 hok 你 们的 response 呢?很简单,首先我们把它关掉啊,我们直接可以去 hok 我 们的 json, 记住啊,直接 hok 我 们的 json 是 里面的 json 数据的一个转变,因为记住服务器所返回的数据都是需要在浏览器里面来进行呈现的,那么它都是需要来通过我们的 json 来进行转变成名 json 数据,然后才能渲染到我们的页面之上。因为现在目前大多数的前端所接收的是不都是阿贾克斯或 jumper 相关的渲染内容 动态的嘛,对不对?所以啊,我们叫后台节省来直接刷新,那么当我们刷新界面之后,朋友们请看在这里它是不是有数据返回, 而且这个返回的数据它是完整的包含着我们的 webs 的 一个返回结果,但是我们现在这些都是不要的,我们要谁?要密钥,那么如果我们是需要要密钥的话,我们可以往上反太多了。像这种用插件的话就有这么一个弊端,你看我们用插件的话就是有这么一个弊端,它数据是不是在这里, 这是它的数据,这个是 websocket 所返回的消息队列然后解析出来的数据啊,它不是我们现在的 c 学接口啊,注意一下啊,那么我们当前的 c 学接口的话,应该我们还在很前面去在这里的 id 我 看一下啊,有没有对应的币,有有有,朋友们在这个地方,你看 a s 一 百二十八 iv model a s 一 九二二五六,它这里是掉了包, 然后这个地方的话是做的哦,就是在这里,你看这个应该就是我们当前这个 c c s 接口,是吧?解析之后所返回的内容 看一下是挺多的, 你看这个就是后果插件使用,但是用这种插件的话,它有个坑。稍等一下,我们看一下啊,这里是密文,那么密文下面的返回应该是在这里,应该是这个,我们要获取这个 id 跟这个 token, 我们往下看一下还有没有啊?重点观察一下当前数据, 这个 id 和 token 是 我们前面所发的,这个是 c 写的一个 uid, 这个 token 这个应该也不是,这个是我们的 m 值啊,这个是我们的 m 值,就刚刚看到这个打 m 打大写的,然后直接返回数据, 那么也就是说我们当前的第一次它的返回应该就是这个, 但它这里面还有全套式,这个我看一下是不是直接就是密钥是这样子的啊?它有可能密钥就是这样子的,那也有可能这个地方还要做外的处理。 来我们换一种方法。怎么换呢?不要用插件的,因为插件的话我们会发现它捕捉的内容输入的结构是太多了啊,所以把它关掉, 不要用插件啊,用插件,这是它的插件,一般只是说记住什么时候用这种插件呢?就是它的通用性较强的情况下我们就用插件,通用性较强的情况下我们可以使用插件, 那么如果说通用性较差的情况下呢?我们就手插件会好一点啊。首先我们先来触发它当前的 bug, 触发 bug 之后来进行后壳,首先后壳两个地方,第一个后壳 bug 来点击后壳输入,然后注完成之后我们还需要来后壳里面的一个 json 后可能接收,当它触发我们的接收的数据格式转变的时候,来进行一 bug 的 一个断点,这个工具代码什么的,你们需要直接找小数据发送就可以了啊,把它也引入,然后执行代码处发,出发之后观察当中的 ads, 这样的话我们就能够更加精准地来捕捉啊,不是的, 这个也不是的,它这里有数据嘛,我们要看的是我们的 dsn, 呃,就是我们当前请求 ccs 接口所返回之后,这个地方怎么这么诡异? 数据已经加载了,这个地方数据是已经加载了,我们换一种方式来把页面整体刷新看啊,我们换一种方法,这个方法有问题,来像这种网站调试就是要不断的试错,来,我们首先在这里我们直接去先找到它的请求接口,记住啊,你看这个是不是当前它的请求接口的加密位置,这是我们刚留的一个地方,把它打叉断点, 然后进页面刷新,刷新之后我们来看啊,触发 bug 啊,注入先解决 bug, 然后当前的话是请求是还没有响应的,在还没有响应之前来 hok 里面的 jason, 哎,我刚刚 hok 里面的 jason 来把里面的 jason 进 hok, 好, 那么 hok 里面的 jason 之后注入成功,注入成功之后我们进触发,看一下会不会触发。 ok, 这个是我们的 m 内容,对吧?你看这是我们的 m, 这个 m 里面的图片是变化的, 这个 u i d 也是变化的,这个地方大家注意啊,它这个是动态的,展示动态好,然后其次我们继续触发,触发 c 也是 id, 看一下是不是放掉,放掉之后继续触发,我们来看一下啊,还不是放掉 a a a, 好, 当前触发的是我们的 hock, 如果触发的是 hock, 那 么我们就进行 hock, 但是这个地方大显注意它失效了, 有没有发现它失效了?如果它失效了,我们就重新注入,这个可能便便麻烦就变麻烦。这个地方可能会变麻烦,因为我们用的是标本注入好行触发, 它没走接收,那这个地方没走接收,如果它没走接收的话,那它有可能是什么?宿主 来这个地方给大家讲一下,有问题。呃,有什么问题呢?就是它没走接收,咳,它没走接收,那么像这种如果说它是没走接收,我们该怎么办?如果没接收的话,我们在这里我们可以直接通过它的,因为我们看啊,给大家讲一下,我们在调的过程当中,其实我们很明显的可以看到啊。来我们先把这个输入, 我们在调的过程当中,其实我们是很明显的可以看到它在这个地方加载数据的时候,它的启动器里面是不是有个 promise, 朋友们还记得吗?它是不是有个 promise? 你 看我用插件啊,这个不了,我用插件的话,等一下它一直触发。第八个我也拿拿的到,哪个一直输入啊?把它开启, 你看啊,就是它在这个地方的话,它其实会有一个很明显的一个痕迹给到我们啊,就是会有个 promise, 我 们在 promise 里面直接去调它的拦截器,我们看一下它里面的密文到底是什么?其实我们刚刚其实已经看到密文的输出了,只是我们当前还不确定。来刷新一下, 这个地方有放点,这个放点我们先放掉,这是请求的放点, 你看它在这地方会有个 promise, 看到没有是吧?会有 promise, 我 们可以直接快速来到它的 promise 这个位置。 不行,它这个地方不是拦截器,对吧?这也不行,如果说它是拦截器的话,那我们在这里可以直接快速去调它的 promise 来,我们回到它的请求这个地方,我看一下在它的请求的地方有没有不建 议稍等一下,我看一下啊,它其实里面的核心的组合方法其实都是自己的, 算了,太麻烦了,我们还是这样搞,然后来看啊,那么在这里如果说我们像这种,呃,也不是说搞不到,只是说他可能是以数字的方式来添加。呃,那就思考一下啊,那就只能慢慢调了。各位,那这个地方我们就只能慢慢调了 一半,我记得之前这个网站通过后台是可以复制的到的。稍等一下啊,换车了?我看一下这个地方,我记得之前我们是直接可以通过 jason 是 可以直接, 它是宿主,宿主就很奇怪,如果是宿主的话,算了,那我们就直接这样调吧。 我看一下啊,我们直接来后台里面的 excel, 稍等一下,我直接后台里面的 excel, 我 先看一下它具体格式是什么。来后台里面的叉叉 r 后台里面的叉叉 r 在 控制台这个地方我们是可以看到它的数据,我们来看一下这个叉叉 r 里面就是它给我们所呈现的数据。是什么样的方式? 我先看一下数据啊,稍等一下,我在下面。我们进分页,我们先看一下数据,来点击分页,第二页 是直接由 webshop 的 一次性进账。来,我们往上翻,我看一下这个 c 形式返回的结构到底是什么?这个是, 咳咳,我们向上翻看一下啊,这些 open 都是请求,可以不用管啊, 它没有呃,输出在这里,这是数据,这个地方指向的是数据,就是呃 web site 链接成功之后所返回的数据,然后会进行解密, 这是 c s s, 诶,奇怪了,它的第一次的请求所返回的,你看返回的 response 点 test response test 是 一个密文,但这个密文这个好像不错, 你看这个是我的,这个就是 data c h s 里面的 data s w v p。 哎,看下这个结尾,是 n 加零等号, 那结尾是看不到,我们再往上推一下,这个是请求头里面的加密参数,然后这个是我们刚刚的 u a 这个地方,这个直接是数据,你看 n 加零 w 的 号,这个就是直接我们刚刚那个 caches 接口里面所请求返回的 response, 但是没有看到铭文, 这个节, 它下面的铭文的呈现直接就是这个,是,下面这个地方是什么?下面这个地方所呈现的是我们的 web socket, 对 吧? 奇怪哦,这个地方给大家讲一下啊,下面这个地方啊,所呈现的这个地方啊,它其实就是我们当前这个是 web socket 的 消息队列来解释出来的 comma 数据,然后再往下走也是 comma, 那 也是我们的 web socket 的 返回数据,这个也是 web socket 的 返回数据, 是 web socket 所返回的消息队列,然后把它转变成了我们的数据嘛。你看就是我们当前所看到信息嘛,就是某某某某某建议公告了,它就是这些信息了,它就是这些信息。所以我们当前的 c c s 的 一个接口,它是没有的,不可能的,然后可能这个网站是一个假的 web socket, 是 可以不用处理密钥,直接固定就可以进 来。呃,我回到这个地方用的是 i g, 然后 i g 会掉了上面的 o g。 这里啊,我们在这个地方去打一个断点,试一下,我看一下啊,因为我记得当时它好像是在这个里面会有返回, 不行,我们就一步步去调啊,这里做了个 json, 但是很奇怪网站为什么它不返这个 json 的 接口,它没有做处理,是吧?然后我们看一下这个地方它返回是什么,看格式就是我们刚打断, 然后像在这里的话,我看下这个地方返回一下,看下括号的,然后它的结尾是到我们把这个输入一下,看是什么, 这个框应该是到这里这个地方来,我们看下这个地方的结果啊,稍等一下,测试一下 u a, u a, 不 用管, 这个地方是我们刚刚的请求,然后这个地方会有再次的做一次的它的一个返回。我看一下啊,是不是这个地方做编码,这个地方也是 u a 啊,这是 u a 啊,是我们的 u a 信息。 这个这个加密我们已经处理完了啊,这个地方我们已经处理完了,这是请求里面的 data, 哎,不对啊,它这个地方现在变明白了, 哎,哦,我知道了,知道了,就是它的加密和解密好像都是执行的,这个方法 只是说它可能解密,你看它这个地方加密和解密都是执行的这个方法,我们去看一下它这里面掉的逻辑啊, 我们进去这个方法来把它选中,我们在控台里跳转,我们进去这个方法,然后在这个方法里面,它最终的返回是返回了在这个地方,但它掉的方法不一样, 它调用方法不一样,我们在这里打一个断点试一下,然后在当前这个地方它返回的结果是不是看一下 是我们的铭文,那么这里的话是有。呃,解密,解密它应该就这个地方,然后解密的话,我们可以看到啊,它在这里也是调用的 h 里面的 update, 说白了它其实也是 a s 的 一个解, 然后我们来看一下这个地方对应是什么一样的,然后 h 的 最终声明是在这里,这个是 h 的 最终声明,我看一下啊,然后把这地方还原。呃,我大概明白了,它这个地方其实也是一个 a s 啊, 它的数据的解密也是一个 a s 的 一个解密啊。屏,这个是那个一个 g o v 网站,一个屏箱的 g o v, 你 看我们可以看到这个网站它里面其实上它的解密也调用的是这个 a s 的 一个解, 我们可以试一下嘛?这个地方可以试一下啊,来这个地方,来我们同样的方式,就是把这里面的主体的这几个部分把它拿下来呀,这就它几个主体的,我们重新新建一个解密的文件啊,稍等一下,我重新新建一个解密的文件,来右击新建一个 json 解密, 然后这个解密的文件里面,同样的,我们采用手动的方式去把它里面内容填还原 来试一下是一样的,是一样的,是一样。 ok, 这个地方是一样的啊,给大家讲一下,只是说我们加密的话调是加密方法,然后解密的话调是解密方法,核心逻辑是一样的, 然后这个里面的话刚刚讲过,这里面是它的一些密钥什么的法定化, 对吧?不是模改的 a s 就 不用直接往下写就行了。呃,可以, ok, 那 我快速把这个地方把它弄出来,这个地方的话我们可以看到它其实就是一个标准的 a s, 也是标准的 a s 的 一个解密,对吧?只是说它代码是进行了很多的混淆,看得我们眼花缭乱的,整体来说你看还是比较简单的, 你看比这就是还整体 ok, 那 么像在这里我们同样的只需要把它还原就可以了,我们分别输出一一,嗯, ok, 把它改掉啊一,这个地方我就直接复制 ok 了啊,我测试一下它能不能成功一 好,然后还有个密文的。一,这个一是密文啊,我们可以直接把它复制过来,一直好,就这样啊, 下面这个地方做打印, 嗯,写错了,不好意思,这个地方我们直接做打印就可以了。直接做打印,然后把它改成 a s 的 解密,对吧?直接把它放到 ai 里面 做解密,非常简单啊,就是说我们在里面可能踩了一些坑,但其实上我们最终我们分析下来的话,我们会发现还是特别简单的啊。你看它这也是内置的一个逻辑来做的一个解密输出,直接把方法 我们试一下,看它能不能成功解密啊,我们试一下没问题,对吧? ok, 然后解密, ok 之后我们就把它里面的密钥给它套进去就可以了啊。然后这两个请求头饰吧,这个因为今天时间问题讲不完了。 ok, 大家去看一下,其实我们今天我们会发现啊,我们其实学了一个非常简单的一个 a s 和 e, 呃,就一个简单的 a s 的 一个加密和加密的一个操作,对不对?但是你们可以看一下这个网站,它真的非常复杂,就是如果说你没有这种调试技巧以及这种分析经验,其实你很难搞出来它是 a, 对不对?你看它里面的各种这种乱七八糟的 o b 混响啊,这里面没有 o b 混响,这个是叫做数值数值混响,而且像这种我们还还原不了的,你看在这种情况下,我带你们去抽丝剥茧,然后实现了纯算的一个还原,朋友们,纯算的一个还原,打一个 web socket。

ok, 我 们接着来说 web socket, 它有,呃,比如说面试的时候,这个现在问的特别特别多,所以这个东西是我们一定要掌握的,好吧?它会说 web socket 你 用过吗?那我们肯定回答,呃,你用过呢,你就说你用过,没用过呢,你就可以说你自己研究过,对吧?就这么去进行一个回答,那它就会问你基本使用怎么用啊? 我这呢就不给大家去详细讲了,就给大家讲一下你要怎么说,好吧,首先呢,我们要说 web socket 呢,它是一个双向长链接,一定要提这个概念,好吧,双向长链接,然后呢,需要心跳检测机制和断线重连的, 好吧?需要心跳检测和断线重连。 ok, 这个呢,你是上来你就要告诉他的,哦,这样你一说人家就知道这个,你知道这个东西,对吧?再来呢,我们就可以告诉他我们大体这个东西要怎么用的。第一步呢,你可以说,哦,是,呃,既然是 双向长连接,对吧?那就得去建立链接嘛,所以第一步就是用 new 去实体化,也就是建立一个链接,那建立了之后,我们需要知道它是否建立成功了,对吧?那我们就去用那个 open on open 去测试是否连接成功了,对吧? 然后呢,连接成功之后,我们就相当于可以去把链接建成功,这个其实就像我之前讲过的,嗯, webshop 就 相当于客户端和那个服务端中间去建立了一座桥嘛,对吧?那我们 new 和 open 成功之后呢,说明这座桥已经建好了,建好了之后是不是就可以过人了呀?对吧?既然他们是双向的,所以呢,客户端可以向服务端去发送数据,对吧?那服务端也可以向客户端去发送数据。那 ok, 下来我们就接着去准备发送数据了。那服务端向客户端发送数据之后,我们使用的是 onmessage 来 接收,接收到这个数据,好吧? on message 只要服务端你给我发送数据,我 on message 就 会去运行,好吧?那 on close 就是 连接关闭了,那 on arrow 就是 连接错误,那 sad 就是 我客户端向你服务端去发送数据的一个呃,事件,好吧,这个呢,其实是我们整体的一个过程。 首先第一步你要记这种东西呢,你不用靠死记硬背,好吧?首先你要知道它是一个双向长链接,记不住,那你就 呃,想就打比方,就像我刚刚说的建了一座桥,对吧?建了一座桥,桥是不是左右两岸都可以过人,对吧?所以呢,他就是双向的,所以, ok, 第一步就是双向成列接的,他要你只要说他是,第二步呢,就是他需要心跳检测和断线重连,这俩又是啥呢?我们刚刚说了,他俩建立了桥以后,对吧? 我们的双方都可以发送,但你想我们建了一座桥,桥有没有坏,以及桥需不需要维修,我们是需要呃,有人去检,专门有人去检测,或者说是去过人,我们才能知道它有没有坏,对吧? 那这个呢,心跳检测机制呢?就相当于我去派个人去检查,好吧?就是一直发送,一直发送,就隔多少秒去发送,但是发送的呢,肯定不是我们很重要的数据了,对吧?就是,嗯,派检测的人嘛,对吧?所以呢,就是发送一个,比如说标识啊,比如说我这个,我这个标识是扣的等于零,对吧? 那我就跟那个服务端说好,我这个扣的是等于零的时候呢?是我的心跳检测,你不用去做什么处理的,对吧? ok, 那我们就隔多少秒去发送一个心跳检测,去发送一个信息,然后呢我们监测到,比如说,哦,它走了个 on arrow, 或者走了个 on close, 代表着链接错误了嘛,对吧?那错误了之后呢,我们再去给它进行重新给它建立链接,然后再重新走这一步就好了,这个呢就是我们的心跳检测和断线重连。 ok, 这个就是大概 web socket 你 需要去回答的问题。首先第一个就是双向长连接,需要心跳检测机制和断线重连。 然后呢,第一步是建立实力化建立链接,第二步是去看它链接是否建立成功了,成功了之后呢,我们才会去发送,对吧?那 on message 是 服务端向客户端发送,那 said 就是 我客户端主动向服务端进行发送, 那它有没有坏呢?我怎么知道呢?就是通过 on close 啊,不是 on close 和 on arrow, on close 代表着链接主动去进行了一个关闭,那 on arrow 呢?就是链接发生了错误,好吧? ok, 那 这个呢,就是我们整体的进行一个完整的一个回答。

opencloud 刚刚推送了 v 二零二六点三点幺幺版本,这次更新到底有什么很火呢?一分钟带你从普通使用者和晚安大佬两个视角直接开解。首先呢,咱们从普通用户的角度来看,体验直接拉满。第一呢,可以限时白嫖新模型, 系统的内置临时增加了韩特尔法和后面这两个新模型,趁着现在有一周的限时使用时间,大家赶紧去试。 第二呢,记忆力跨界进化。这一次呢,新增了谷歌的佳木丽提供的多模态记忆搜索,连你发的图片和音频都能作为记忆被精准解锁了。第三,针对苹果电脑 增加了新的专属的模型选择器, ios 呢,也换了底部停靠栏,更像的是欧拉玛的本地化配置,也成了一等公民小白也能无脑上手。但是,如果你是一名网络安全从业者,这次的更新可以说救了大命。 最核心的安全更新是修复了一个高危的跨站 web socket 劫持漏洞,以前在受训的员可能会偷偷拿到 operator 点默认的权限, 现在呢,官方直接在往官层强制了浏览器原验证物理,切断了这条劫持路径。另外呢,官方还清理了 ai 代理中容易泄露模型控制令牌,比如说像这种符号, 有效降低了提示词注入的风险,同时给此命令加上了专门的环境变量,方便我们日后做进城溯源和安全审计。一句话总结,用户用的更爽,黑客无从下手,别犹豫了,赶紧去升级点赞关注,硬核科技不掉队!

其实我们在实际的开发当中呢,我们不太会去使用这个原声的 a p i, 其实原声 a p i 里面呢,功能是绝对齐全的,大家可以去看这个 m d n 的文档,这里边有完整的就是它里边的用法啊,一些属性啊,方法其实也不多啊,也不多,但它功能肯定是齐全的,但为什么我们平时不太呃喜欢使用这个原声的 a p i 呢? 原声的接口呢,虽然简单,但是呢在实际应用中啊,会造成很多的麻烦。什么麻烦呢?比方说哈,我们现在考虑一个聊天场景这个页面呢,他有聊天,有实时聊天,同时呢也有开线, 于是呢,可能我们服务器啊,当然客户端那边也可能不断的发送消息给服务器,服务器呢,那边呢,也可能有不同,不停的有新消息过来,那么他的消息呢,比方说发了这么一些内容,你看一下,你能看懂他啥意思吗?这些内容全部全部在哪里接收,所以全部在 unic 里边接收,对吧?这里所有的消息都在这里统一接收,那这个接收消息到底是什么消息,你分不 清楚啊?那么这个数据就会造成这样的一个问题,连接双方可以在任何时候任发送任何的数据类型数据,另一方呢,必须要清楚这个数据到底是什么东西,对吧?那么福气可能可能给我发的是聊天啊,聊天的时候有哪些,聊天室里面有哪些人,对吧?然后呢,也有可能发的是一一个用户的发布的一个新的聊天内容, 也有可能呢发布的是呃,那个 k 线的最新价格,也有可能呢,有人离开了那个聊天室,那么他会把个聊天室里面的人重新更新,更新之后呢,再重新发给我们,就你分不清楚, 那么回忆一下啊,像如果说我们以前学的 atp, 那么 atp 是如何来解决这个问题的? atp 解决,解决这个问题的话是不是非常简单?怎么解决?是通过 pass 解决,你请求不同的路径,那么就表示你要不同的东西,对吧?这里是登录把,这里是获得新闻列表,通过路径来进行区分,但是很严 遗憾的是脱离了 attp 协议了,现在他没有路径了。哪有路径?他这个东西你看一下我们这里,那村口这里哪有什么路径啊?一旦握手完成之后就是全是这种消息了,哪有什么路径呢?什么头啊?那些东西全部没了啊,只有握手阶段在用 attp 协议的时候才有一个头,握手完成之后的消息再也没有什么头啊。题啊,这些东西都没有了, 那我如何来区分呢?朋友们可以想想办法啊。其实这个办法呢还是挺好想的,最简单的办法就是使用一些第三方库来帮我们解决这个问题。这个第三方库是什么呢? socket i o 啊,这是一个非常有名的微博收费者的第三方库,他是这样处理的啊,把不同的消息呢放到不同的事件里边。他这个事件呢,有哪些事件你需要自行约定?服务器跟客户端之间需要自行约定,他通过监听和触发事件来实现对不同消息的处理。什么意思?我现在下面一张图啊,比方说客户端这边他监听了三个事件, 那么我们这里比方说客户端和服务器之间约定了,我们一共有三个时间,一个是成员更新,就聊天室里边有哪些人啊?然后呢?是监听聊天消息,有没有新的聊天消息过来,然后呢监听最新的价格,贴心的最新价格,约定了有这么三个时间,客户端这边负责什么?负责监听 好服务器那边呢?就负责触发事件。触发事件什么意思?就是发送消息的时候呢?顺带我告诉你这个消息是哪个事件的, 那么比方说这个消息他就告诉你,哎,看这个颜色啊,我就告诉你这是一个成员共情世界,于是这个消息发到客户端那边,客户端那边就会触发这个事件的处理。客户端那边他写的代码呢?尾代码啊,可能是这个样子,也说服务器在触发时间,客户端在监听时间啊,服务器触发事件本质上就是发一个消息过来,附带一个事件类型, 那么他就会触发到这个事件,这个事件就会运行这个函数,对吧?然后第二次发了一个,你好,这是一个聊天消息事件,他就会触发这个函数。而第三次呢, 发了一个最新价格,他就会触发这个。第四次呢,发送那个又是一个成员更新,他又会触发成员更新这个,这个函数啊,他是这么一种逻辑,那是不是所有的事件都是客户端监听服务器触发呢?不是的,完全有可能,非常非常有可能服客户端那边也会发消息给服务器,对吧?那么客户端发消息给服务器,那就是客户端触发事件, 服务器又在监听客户端的时间,对吧?这双方他们地位是一样的,不存在说谁高一点,谁低一点,地位完全是一样的。所以说我们在一个微博 socket 的典型场景里边啊,像这种 socket io 的典型场景里边, 任何一方都有可能既监听事件,监听对方的事件,也会自己触发事件,自己发送消息。监听就是收,触发就是发啊,你理解清楚这个东西就行了。那么这样子做了过后呢,这个模型就比较完善了啊,我们就可以利用这种事件的机制,对不同的消息进行不同的处理,那么这个事件是 首要客户端和服务器双方事先约定好,那么这里呢,我们看看一下我们的聊天室接口,握手完成之后呢,他就靠事件啊,事件,你看这里有这么一些事件,需要在接口文档里边,或者是双方私下把他事件约定好。 sopetio 啊,就就这么一个第三方库,他就是实现这么一个效果,他为了实现这些要求呢,他对消息的格式啊,进行了特殊的处理, 他的格式呢,可能跟大家想象的不是一个普通的对象那么简单啊,他做了一些特殊的处理,那我说这一点是什么意思呢?就是如果说你服务器使用了 sokisio 这个库来进行触发事件发送消息,你客户端那边也必须使用这个库 啊。同样道理,你客户端那边是用 socket i o 来发送消息,服务器也必须使用 socket i o 啊,不能,不能说服务器用这个客户端就用这个,理论上是可以的啊,因为我 socket i o 本质上也就在调用这个,这个 a p i 理论上是可以的,但是这个就很麻烦了,因为 你要理解为手机 io 的他那个消息格式,那个很复杂的消息格式是怎么组成的啊,就有点分析就更麻烦了,所以说要用的话就双方一起使用,使用这个手机的 io 其实是非常简单的啊。这里呢,我先给大家说一下手机的 io 的一些注意的事项。使用的时候呢,我们要自行的约定事件,那么肯定要给事件取名字,但是有一些名字呢,你不能取, 有一些名字他是已经定义好的,叫做 message 啊,让 conte 这种名字有些特殊的名字啊,比方说这个 message 呢,就表示他对应到这个 websoke 里边的这种 message 啊,所以说有些事件名字呢是不能用的, 那我们在取事件的名字的时候呢,我们一般来说会加一个前缀,或者是你这个工程的名字啊,或者是怎么样,那我这里呢,比方说加一个多乱符号,这样子,避免跟那些预先定义好的事件名字发生冲突。把这个地方我给大家说一下。另外个地方大家了解一下, socket io 啊,功能非常强大呃,它不仅支持 服务器,还支持客户端,都支持啊,同时呢,他还对一版本的浏览器进行了兼容处理,就是如果说他发现这个版本,你这个浏览器版本太老了,比方说现在什么 i 浏览器,对吧?像版本太老的浏览器呢,如果说你不支持,我也不 socket, 那怎么办呢?他会转而使用长文询, 整个的那个 a p i 都是一样的,就是你不用改带嘛,他会转而使在内部,转而使用长轮循,他会有判断的啊。 然后手机的 io 还有很多的高级功能可以参与官方文章啊,我们这节课就不愁了,关注都已剪辑号的同学打断一下啊,我是袁老师,总听我讲短视频,这回呢,来听听我讲的大课。 我给大伙呢专门录制了一套大吃课,现在呢,免费送给你们,不管你手上现在看的是什么样的资料,都应该先停下来,先来看一看我这套大吃课。一方面呢,这套课程里边的内容都是前端最核心的 知识,其他的知识都是在这个基础上生长出来的,你先掌握好了这个,再学啥都事半功倍。而且呢,自此以后,你对前端技术的理解不会存在任何的障碍。 另一方面呢,这套课还能够提升你的眼光,让你具备分辨好坏的能力。看过大师课之后啊,有一些不入流的资料,课程 博客论坛你就看不上眼了,这种能分辨好坏的能力,也能够为你将来的学习省下不少的时间。所以呢,还没有领到课程的同学,赶快抓住免费领取的机会,进评论区第一条,加入粉丝群,然后根据提示领取就可以了。

大家思考个问题,有了 http 为什么还用 web socket? 今天展开讲讲。首先, web socket 是 一种网络通信协议,核心特点是全双工和持久连接。一旦客户端和服务器建立连接,它们就可以随时双向的发送数据,而不是像 http 那 样只能客户端问服务器。答, web socket 有 四大核心优势,首先是全双工通信,双方都可以随时说话。其次是持久的长连接,一次建立,多次使用。第三是极低的传输开销,数据传输非常轻便。 最后它还天然支持跨域,省去了很多配置麻烦。那么 web socket 的 连接是如何建立的呢?客户端首先会发一个特殊的 http 请求,告诉服务器 我想升级到 web socket 的 协议,如果服务器同意,就会返回一个幺零幺响应,表示协议切换成功。你需要安装点 net 六或更新的 sdk。 然后无论是用 visual studio 还是命令行工具创建一个新的 sp 点。 netcore 项目都非常简单, 我们不需要安装任何额外的库,这大大降低了我们的开发门槛。服务端的第一步是在 program cs 里起用 web socket 的 中间键,我们可以通过 app use web sockets 这个简单的方法来实现。 同时我们还可以配置一些选项,比如这里设置的 kpilevintible, 它会定期向客户端发送心跳包,确保长连接不会因为长时间没有数据传输而被网络设备断开。其用中间键后,我们需要处理具体的连接请求。 这里我们应设了一个路径, w s, 所有发往这个路径的 web socket 的 请求都会被我们的代码处理。我们通过 accept web socketing 方法接受连接,然后进入一个消息处理循环。 这个例子是一个经典的回声服务,服务器会把收到的任何消息都原封不动地发回给客户端,非常适合用来测试连接是否成功。 浏览器提供了原生的 web socket 对 象,我们只需要创建一个实利指定服务端的地址,然后监听几个关键事件。 open 连接成功, on message 收到消息, owner raw 错误和 unclose 连接关闭。通过 send 的 方法,我们就可以随时向服务器发送消息了。这样一个完整的客户端就写好了。 首先是实时聊天, web socket 都是首选方案。第三个场景是金融数据推送社区,也提供了很多优秀的库。其中 esp 点 netcore signal 是 微软官方的推荐,它封装的非常好,功能强大且稳定。 此外,像 flag、 web socket shop 等轻量级库也各有优势,可以根据项目的具体需求来选择。大家有什么问题打在评论区。

咱们这个视频呢,然后主要是给大家讲一下,就是外部骚客的一个最基本的使用,那么后期的话,然后再把这个外部骚客的进行一个封装。外部骚客的和 hddp 请求他两个最大的区别就在于什么呢? hddp 请求呢?他是一来一回的,我发送数据, 后台返回我数据,我接受数据,然后就是他俩的链接,然后就断开了,就没有交互了。你像外部骚 k 的话,然后就是我和你建立链接之后,我一直和你握着手,你那有就是后台你有什么数据变化,你主动推荐给我,然后你像那个呃,咱们在页面上如果说要做一些 呃状态到实时更新这类的东西的时候,你如果说用 actv 请求是可以就是实现,但是你得使用,就是咱们 啊起一个电视器,然后就实时轮巡,这样的话会造成就是大量的 hpv 请求,对咱们的服务器的一个压力也是会比较大的。所以外部骚 k 的话就是一个及时通信。咱们现在给大家来实现一下,咱们先创建一个外部骚 k 的,然后一个实力 啊,咱他这里面的话需要你传一个地址,就是咱们就是外部收费的地址就 ws, 他的协议是 ws 的,叫 我来创建一下,咱们看看 这是这是因为咱们还没有把这个外部骚给的福气给他起来,咱们把这个外部骚给的福气咱们给他起一下 two, 现在的话咱们就起来了, 我刷新一下,现在的话就他就是不会报错了,但是他现在是不会报错了,咱们也没有知道他到底有没有和服务器建立一个链接,有没有建立链接成功?咱们需要通过一个 欧恨的一个方法看一下, 如果说他打印出来的话,咱们就是 就是建立链接成功了,因为这个方法只会在我就是建立链接成功的时候会被调用,它里面的话有个 参数,咱们把这个参数给大家打印一下,他这里面的话,然后就是咱们建筑链接成功的一些消息,就是咱们,嗯,有点类似于咱们那个 http 请求,它里面的请求就是嗨的里面的一些消息,咱们把这个带回来 链接,当我建立了链接之后呢?然后我肯定说啊,我要去给后 后台,就是去给后端然后发送一些数据,要让后台就是接受到我订阅的那种,我订阅着什么,我给后台发了什么,然后后台然后才能根据我发的那个东西去订阅的东西,然后说去给我返回东西,咱们在聊天就是,嗯,咱们在 做一个聊天系统的时候呢,然后我们通常都会用这个方法,然后就是给后台去发送东西,然后就是让后台知道我的就是呃,我这边我把我的数据推给你了,他要把我推的这个内容,然后返回给另外一个接收的人, 这个的话我建立连接成功,我需要给后台发个东西,就是发些数据让后台知道我订阅的什么, 他有一个肾的方法 是 数据,咱们就,咱们就不是说呃,我和你建立连接,我和你建立了连接之后,我什么都不管了,咱们像普通的 hdv 请求,我还需要给后台去发送一些参数呢, 所以说这个的话就是起到那个作用, 现在的话我们是没有办法,然后看到我有没有给他发送成功的。咱们切到后台, 我是发送的数据在这个地方进行一个打印,我这个地方然后是一个接收, 当我就是外部 succi 的,然后我发送内容之后,我会在这个地方进行一个接收,我让我调用了这个方法,这个方法的话然后有一个参数,他的这个参数呢?然后就是我们发送的内容,我把这个啊,我发送的什么内容,我就是我再把 这个内容然后重新再推给咱们前端。嗯,当我发送了内容之后呢,那咱们肯定说,嗯,那咱们肯定说我得去接收,然后才推给我的东西,我订阅的东西你肯定你要去推给我东西,他所以说咱们下面还有一个方法,就说,嗯, message 一个放线,他这里面的话有个参数 给大家来打印一下, 我发送的数据就是这个地方我发送的数据,我后面要给他加点数字,随便写 几个数,他肯定就是能够返回过来的,对吧?这个地方就是咱们后台然后给咱们推送的数据了。为了让大家更明显一点,我在我把这个地方给改一下吧,我是 咱们得需要重新把这个服务给起一下, 咱们把服务重新起一下,现在已经启用成功了,启用成功了之后呢,我们把这个地方给保存, 我是后边推送的数据,我发送过去了之后,我这个地方给他写死了,他就推给我什么了。然后也就是说但,但是咱们 有成功的时候,那肯定也有说咱们有失败的时候,咱们在失败的时候他会干什么呢?大不了 s 他有一个啊, olol onolo 方法 哦肉的这一个回调函数,然后这里面的话有一个我的错误信息,当我就是建立连接成功,失败就是失败的时候我会执行这个,这有点类似于咱们那个 x 要死里面那个太迟, 现在的话是成功的,所以说咱们没就是没有办法。然后说拿到他的一个失败的一个消息,那咱们现在把这个地方 进行一个小小的一个修改,咱们把这个单手号给去掉一下, 咱们打印一下这个地方的话,他走的是这个函数,也就说咱们的失败的会要函数,会让大家看清一下, 会掉保存一下,看他会不会被打印出来,他是会被打印出来的。 嗯,这就是刚才咱们就是把那个外部骚克特的一个最基本的使用方法,然后给大家说了一下,咱们下期视频呢,然后会把就是外部骚克特,他的一些,就是他刚才 成功时候的,他成功时候的这里面的一些参数呀,还有失败时候他以里面的一些,就是呃返回的对象的一些参数呀,属性啊,给大家讲一下。然后咱们也会把那个外部骚 k 的,然后就是慢慢的咱们把它给封装成一个插件 啊,这个插件因为我之前我封装过一次,就是类似于一个这样的,这样的东西,它里面的话有断开重连,有重连,间隔多少秒就是重连一次,还有重连的次数, 还有就是他心跳,就是发送的心跳包,因为咱们外部烧开的,他有时候会自动断开连接,咱们需要给他建一个心跳包,然后就是给他保持他的一个持久链接。还有一个就是心跳计时,就是我多少秒,然后就是给后台发一个心跳 包,还有适合我适合,然后就是启用心跳,还有我适合启用,就是那个重连,咱们到下个视频的话,然后就是慢慢的给大家做一个精进。 大概的话就是啊,因为这个然后是我继续 es 六来封装的,下期的话咱们也这样封装一下吧,给大家来封装一下。

ok, 我 们接着来说 web socket, 它有,呃,比如说面试的时候,这个现在问的特别特别多,所以这个东西是我们一定要掌握的,好吧?它会说 web socket 你 用过吗?那我们肯定回答,呃,你用过呢,你就说你用过,没用过呢?你就可以说你自己研究过,对吧?就这么去进行一个回答,那它就会问你基本使用怎么用啊? 我这人就不给大家去详细讲了,就给大家讲一下你要怎么说,好吧,首先呢,我们要说 web socket 呢,它是一个双向长链接,一定要提这个概念,好吧?双向长链接,然后呢,需要心跳检测机制和断线重连的, 好吧?需要心跳检测和断线重连。 ok, 这个呢,你是上来你就要告诉他的,哦,这样你一说人家就知道这个,你知道这个东西,对吧?再来呢,我们就可以告诉他我们大体这个东西要怎么用的。第一步呢,你可以说啊,是,呃,既然是 双向长链接,对吧?那就得去建立链接吗?所以第一步就是用 new 去实际化,也就是建立一个链接,那建立了之后,我们需要知道它是否建立成功了,对吧?那我们就去用那个 open on open 去测试是否连接成功了,对吧? 然后呢,连接成功之后,我们就相当于可以去把链接建成功,这个其实就像我之前讲过的,嗯, web socket 相当于客户端和那个服务端中间去建立了一座桥嘛,对吧?那我们 new 和 open 成功之后呢,说明这座桥已经建好了,建好了之后是不是就可以过人了呀?对吧?既然他们是双向的,所以呢,客户端可以向服务端去发送数据,对吧?那服务端也可以向客户端去发送数据。那 ok, 下来我们就接着去准备发送数据了。那服务端向客户端发送数据之后,我们使用的是 unmessage 来 接收,接收到这个数据,好吧? on message, 只要服务端你给我发送数据,我 on message 就 会去运行,好吧?那 on close 就是 连接关闭了,那 on arrow 就是 连接错误,那 sad 就是 我客户端向你服务端去发送数据的一个呃,事件,好吧,这个呢,其实是我们整体的一个过程。 首先第一步你要记这种东西呢,你不用靠死记硬背,好吧?首先你要知道它是一个双向长链接,记不住,那你就 呃,想就打比方,就像我刚刚说的建了一座桥,对吧?建了一座桥,桥是不是左右两岸都可以过人,对吧?所以呢,它就是双向的,所以, ok, 第一步就是双向长连接的,它要你只要说它是,第二步呢,就是它需要心跳检测和断线重连,这俩又是啥呢?我们刚刚说了它俩建立了桥以后,对吧? 我们双方都可以发送,但你想我们建了一座桥,桥有没有坏,以及桥需不需要维修,我们是需要呃,有人去检,专门有人去检测,或者说是去过人,我们才能知道它有没有坏,对吧? 那这个呢,心跳检测机制呢?就相当于我去派个人去检查,好吧?就是一直发送,一直发送,就隔多少秒去发送,但是发送的呢,肯定不是我们很重要的数据了,对吧?就是,嗯,派检测的人嘛,对吧?所以呢,就是发送一个,比如说标识啊,比如说我这个,我这个标识是扣的等于零,对吧? 那我就跟那个服务端说好,我这个扣的是等于零的时候呢?是我的心跳检测,你不用去做什么处理的,对吧? ok, 那我们就隔多少秒去发送一个心跳检测,去发送一个信息,然后呢,我们监测到,比如说,哦,它走了个 on arrow, 或者走了个 on close, 代表着链接错误了嘛,对吧?那错误了之后呢,我们再去给它进行重新给它建立链接,然后再重新走这一步就好了,这个呢就是我们的心跳检测和断线重连。 ok, 这个就是大概 web socket 你 需要去回答的问题。首先第一个就是双向长连接,需要心跳检测机制和断线重连。 然后呢,第一步是建立实力化建立链接,第二步是去看它链接是否建立成功了,成功了之后呢,我们才会去发送,对吧?那 on message 是 服务端向客户端发送,那 said 就是 我客户端主动向服务端进行发送, 那它有没有坏呢?我怎么知道呢?就是通过 on close 的 啊?不是 on close 和 on arrow, on close 代表着链接主动去进行了一个关闭,那 on arrow 呢?就是链接发生了错误,好吧? ok, 那 这个呢,就是我们整体的进行一个完整的一个回答。

我们将介绍 qt 开发一个软件,下面将介绍如何快速开发一个在 windows 上可以运行的软件,快速让你获得成就感。 第一步,使用 qt creator 创建新的项目。这里我们导出一个完整项目例子来代替这个创建新的项目。导出该例子到桌面上 qt creator 打开该项目,这样就处于与我们创建了一个新的项目一样的状态下。 我们选择编一器进行编印,确保粒子没有问题, 运行正常。当前状态就是我们已经开发好了的项目状态,接下来进行打包。 第二步,为我们的项目选择一个图标,这个图标将用来放于桌面,点击图标启动我们应用。我们根据 qt 开发手册上的按钮链接,进入看下载网站, 随机选择一个任意的图标进行下载。选择这个火的图标起名为 hotpingg 吧。 在 qt 中,应用图标的使用需要看格式,这里同样点击按钮进入转化格式的网址。将我们之前下载到桌面上的 hot bng 放于这个网站中进行转化。 将转化适当大小的图标同样下载到桌面,起名 hot icon。 接下来将 hot echo 放于源码目录中,与 pro 文件同处于一级。 我们可以测试一下应用图标并没有生效是因为还需在 pro 文件中添加或 c a k n n echo。 再次测试 仍有报错是因为我们要把应用图标的名称进行修改,而 c a 看下等于 hotkey。 这样我们可以看出应用运行起来的时候,任务栏和主界面左上角的应用图标已经显示出来。 第三步,添加运行的动态库到项目生成文件夹为 read。 我 们首先进入 qt 手册中序号二,在 windows 下打包的选择 read 文件夹中的 excel 文件生成我们所需的两个路径, 选择之后,下方就生成了我们所需的两条命令,我们点击第一条命令复制按钮,再打开 qt 官方自带的打包工具, 将第一条命令复制进入,点击运行就能进入指定文件位置。接着我们点击第二条命令的复制按钮,复制进入并运行。这样操作之后就能将应用所需的 libs 文件夹中, 这时点击 excel 文件,我们开发的应用就可以正常运行。第四步,将瑞丽所文件打包成为一个 excel 文件, 我们点击桌面上的这个打包应用。第一项,选择我们瑞丽所文件夹中的 excel 文件, 接着将 release 文件夹添加到这里面, 点击打包,就能将 linux 文件夹中的所有 dl 动态库和 exe 文件全部打包成为一个 exe 文件,生成的 exe 文件就默认存在 linux 文件夹中, 就是这个 project 零一 box exe 文件我们复制到桌面上,这样一个完整的应用就开发完成。 以上就是 q t 开发应用的全过程,我将把该应用和打包软件下载链接发于评论第一条中,可进行下载,也欢迎关注我,谢谢!一个软件是怎么被开发出?