如何用AST还原某音的JSVMP
1. 什么是JSVMP
vmp简单来说就是将一些高级语言的代码通过自己实现的编译器进行编译得到字节码,这样就可以更有效的保护原有代码,而jsvmp自然就是对JS代码的编译保护,具体的可以看看H5应用加固防破解-JS虚拟机保护方案。
如何区分是不是jsvmp?看代码里面有没有很长的一串字符串或者是数组,并且代码里面没有具体的逻辑,还有就是有一个循环不断地在跑,里面的就是一些指令,比如x乎,x音,x讯滑块等等都是jsvmp,也都是基于堆栈的栈式虚拟机实现的。
这是某乎的:
这是某音的,还原了一些算术混淆、三目运算和if else控制流混淆的:
这是某讯滑块的:
2. 如何去还原JSVMP
-
调试vmp代码,分析循环代码里面每个操作数对应的代码的意义
-
修改源代码中的vmp解释器,添加AST的对应代码
-
运行代码,生成最终代码。
3. 分析具体网站
样品网站:aHR0cHM6Ly90cmVuZGluc2lnaHQub2NlYW5lbmdpbmUuY29tL2FyaXRobWV0aWMtaW5kZXgvYW5hbHlzaXM/a2V5d29yZD0lRTklODAlODYlRTUlOTAlOTEmc291cmNlPW9jZWFuZW5naW5lJmFwcE5hbWU9YXdlbWU=
这个网站要找的是X-Bogus和**_signature**这两个参数的生成,怎么定位的这里不说了,
很容易就可以看到这个函数就是在通过操作码去运行逻辑
所以我们要分析下这个函数,看到有算术混淆和一些逗号混淆,不方便调试,可以使用AST写个逻辑去掉 这个很简单,还原效果如下:
可以看到,逻辑清晰了很多,但是因为是if else混淆,里面还有一些中间变量,如果调试的话会需要点击多几次才能到目标语句,所以我们可以考虑将这个if else转换为switch语句,这样调试的时候直接一步到位。
上图可以看到每次都从操作码中读取两个字符,并且是十六进制的,所以**_0x1383c7**这个变量的范围就是0-255,这样switch的条件就有了,可以编写代码从0迭代到255,就可以得到每个指令对应的代码了。最后还原结果如下:
可以看到逻辑很清晰了,但是有个问题是0-255的case里面有些是重复的,需要删除,可以继续使用AST,在每个case的第一行插入june.push(case_num),如这样:
然后映射文件到网站上,运行一次,获取june数组里面的值,保存到代码里,继续编写AST代码,读取case条件值,将不在数组中存在的case值全部删除掉,最后就可以愉快地分析了!
通过调试分析出,该函数的每个参数意义如下:
参数 | 意义 |
---|---|
_0x307ee4 | 字节码 |
_0x5b7220 | 函数起始位置 |
_0x237dce | 函数长度 |
_0x3f8a47 | 不知道干啥,不影响分析 |
_0x4372f0 | 内外部变量区,存储了当前函数的参数、定义的变量和外部变量 |
_0x264fdc | 函数调用对象 |
_0x1f863f | 无意义 |
_0xb80186 | vmp分支,混淆分析的 |
不过我们只需要知道哪个参数是存储变量的,和栈变量即可,其他的不影响分析。
我们要想还原出逻辑,就要找到对变量的定义,赋值,然后将其转为对应的语句即可。
调试代码:
这个就是在获取变量区**$0的变量,$0代表的是本函数内定义的变量,$1就代表上一层,$2**就继续往上推等等,但是其最外面的也会是本函数内的变量,所以需要需注意(这个如果有误,望赐教)
继续跑下去,可以看到
他将刚在获取的变量区index为24的值push进了栈,是一个函数参数,继续往下看
通过分析可知,_0x9ac2c2为栈,此处是将字符串dfp入栈,而我们要还原语句的话,入栈就不能这个了,需要改为对应的ast语句,将字符串dfp直接放上这网站astexplorer
可以看到对应的ast结构,所以此处代码改为:
继续往下调试:
这里是将刚才两个入栈的数据进行属性获取,对应语句为这样: yyy[“dfp”] (这里yyy 为乱写的,方便大家看的)
所以我们需要将源代码改为对应的ast代码:
接下来继续遇到一些常量进栈的,和上面的做法一样的,就不继续说了,说下变量定义:
上面这个就是变量赋值,这里面获取的是变量区的值,如下:
可以看到 index 26的位置还没有,所以可以判断这是一个新变量,第一次赋值,所以语句为这个:var a = “xxx”;
如果当前这个“26”已经存在的话,就不需要定义变量了,而是赋值就行,语句是这样:a = “xxx”;
所以我们需要判断下这个语句是否存在,修改代码如下:
可以看到入栈的数据是一个Identifier类型的变量,这个就是变量名了,之后代码需要操作的话,就获取这个变量就行,而不是获取直接的值。
最后记得将盖语句push进body,因为赋值就是一个完整的语句了,需要还原成代码。
理解了上面的剩下的就没什么问题了,就可以边调试边改对应的case,有些case是不需要操作的,比如上面的第一步获取变量区**$0**
小技巧:在每一个case前面添加一个语句:throw Error(“未更改”);然后直接运行代码,抛出异常的就是未处理的case,然后在浏览器调试看该case的作用并修改代码即可,运行到没有异常就代表没啥问题了!
另外说下if else和for这种语句怎么还原:
上面这个就是进行判断的,可以看到**_0x9ac2c2[_0x47144c–]的结果不一样,_0x1383c7**就不一样,即为下一个运行的指令不一样
我的处理思路:
-
进入这个分支就直接生成if判断,
- 然后保存当前栈,当前栈指针,以及当前函数所有参数变量的值,和当前指令位置**_0x1383c7**,
3. 将else分支的**_0x1383c7**作为if分支的结束值,因为当if分支的指令值大于或者等于else分支的指令值的时候 证明两个分支运行的语句已经一致了(不过如果遇到三目语句,这种情况又需要另外讨论了)
- 然后保存当前栈,当前栈指针,以及当前函数所有参数变量的值,和当前指令位置**_0x1383c7**,
然后直接调用当前函数,返回语句后将if结束后返回的指令值**_0x1383c7**作为else语句的结束指令,最后用else分支保存的函数进行调用
最后就是判断循环了,循环的也会进入上面这个case,只需要在进入的时候判断当前的指令值和if语句的起始指令值是否相同,相同即为循环,就可以修改之前保存的if分支为循环,我这里修改为while循环,比较好改
最后一个就是vmp内的函数定义,调试代码分析知道这个就是定义vmp函数的:
我是在他定义完了之后直接调用该函数进行还原,这样可以防止他只定义没有调用到,不好的地方在于参数个数不知道,所以这个需要在代码还原之后手动优化下,问题不大,如果你有更好的方法,希望能指导下。
4. 开始编写AST代码
由于该网站的vmp只是部分vmp,而我们还原代码是在原有的解释器上修改的,如果直接整完整代码进行运行,需要补一定的环境,这个不行,所以我这里将这个**_$webrt_1670312749**函数扣下来修改即可
首先导入我们需要用到的库:
const escodegen = require('escodegen'); // 用于将ast转为代码的
const esprima = require('esprima'); // 将代码转为ast
const estraverse = require('estraverse'); // 遍历ast的,这里用不到,用到了下面这个常量值
const Syntax = estraverse.Syntax;
var funs = {}; // 记录vmp函数的,可以方便调用
然后在这个函数里面修改传过来的函数参数,将他改为ast代码的格式,而不是一个字面量,因为真正程序调用的时候,传到这里表面就是个变量了,当然也可以在**_0x207ec8**这个循环函数内修改,但是不好确定哪些是函数参数,所以我在他上一个函数这里修改了
接下的就是按照上面第三步的分析开始写代码即可,如有不懂,可以在评论区讨论。
还原jsvmp代码这个第一次需要耐心点,等你熟悉起来了,后面的就会越来越快,里面主要就是一些ast代码的定义,需要传入栈的数据和存在变量区的值,最后就是函数定义和判断分支的实现,判断分支会比较难,处理好判断分支,剩下的就不是问题了。
如果觉得这个太难,可以试试这个大佬写的编译器:给"某音"的js虚拟机写一个编译器
可以编译自己的代码或者里面例子的代码,然后试着还原也不错!
5. 分析生成后的代码
function _0x5b7a61_vmp(args_0, args_1, args_2, args_3, args_4, args_5, args_6, args_7, args_8, args_9, args_10, args_11, args_12, args_13, args_14, args_15, args_16, args_17, args_18, args_19, args_20, args_21, args_22) {var var_233 = 'X-Bogus';var var_24 = '_signature';var var_25 = window['XMLHttpRequest']['prototype'];var var_26 = var_25['open'];var var_27 = var_25['setRequestHeader'];var var_28 = var_25['send'];var var_29 = var_25['overrideMimeType'];if (var_25['_ac_intercepted']) {return;}var_25['_ac_intercepted'] = !0;var_25['setRequestHeader'] = function (args_0, args_1) {if (!this['_send']) {var var_9999 = new window['Object']();var_9999['func'] = 'setRequestHeader';var_9999['arguments'] = arguments;this['_byted_intercept_list']['push'](var_9999);if (_0xc5dbaf(window['RegExp'], _0x1a373c(['^content-type$', 'i']))['test'](args_0)) {this['_byted_content'] = args_1['toString']()['toLowerCase']()['split'](';')[0];}}return var_27.apply(this, arguments);};var_25['overrideMimeType'] = function () {this['_overrideMimeTypeArgs'] = arguments;return var_29.apply(this, this['_overrideMimeTypeArgs']);};var_25['open'] = function (args_0, args_1, args_2) {this['_byted_intercept_list'] = [];var var_10000 = new window['Object']();var_10000['func'] = 'open';var_10000['arguments'] = arguments;this['_byted_intercept_list']['push'](var_10000);this['_byted_method'] = args_0['toUpperCase']();this['_byted_url'] = args_1;return var_26.apply(this, arguments);};var var_30 = ['onabort','onerror','onload','onloadend','onloadstart','onprogress','ontimeout'];var var_31 = ['GET','POST'];var_25['send'] = function fun_4(args_0) {var var_6 = var_31['indexOf'](this['_byted_method']) !== 0 - 1;if (args_2(this['_byted_url'])) {if (var_6) {if (this['_byted_url']['indexOf']('_signature=') > 0 - 1) {return var_28(this, arguments);}this['_byted_body'] = args_0;var var_7 = this['onreadystatechange'];var var_8 = this['onabort'];var var_9 = this['onerror'];var var_10 = this['onload'];var var_11 = this['onloadend'];var var_12 = this['onloadstart'];var var_13 = this['onprogress'];var var_14 = this['ontimeout'];var var_15 = new window['Object']();var var_50 = 0;while (var_50 < var_30['length']) {var_15[var_30[var_50]] = this['upload'][var_30[var_50]];++var_50;}var var_16 = args_3['msStatus'];var var_17 = args_3['__ac_testid'];if (var_17 == '') {var var_18 = ['msToken', args_3['msToken']];} else {var_18 = ['msToken', args_3['msToken'], '__ac_testid', var_17];}var var_19 = args_4(args_5(this['_byted_url']), var_18);var var_20 = args_6(var_19);var var_21 = args_7(var_20, this['_byted_body']);var var_22 = args_4(var_19, [var_233, var_21]);var var_23 = '';if (args_8['v']) {var_23 = var_22;} else {var var_10002 = new window['Object']();var_10002['url'] = args_9(null, var_22);var var_100 = var_10002;if (this['_byted_method'] === 'POST') {if (args_10(this['_byted_content'])) {args_11(var_100, this['_byted_content'], this['_byted_body']);var var_101 = args_12(var_100, args_13, 'forreal');var_23 = args_4(var_22, [var_24, var_101]);} else {var_23 = var_22;}} else {var var_251 = args_12(var_100, args_13, 'forreal');var_23 = args_4(var_22, [var_24, var_251]);}}if (this['_byted_intercept_list']) {if (this['_byted_intercept_list'][0]['func'] !== 'open') {return null;}}var var_244 = this['_byted_intercept_list'];var var_182 = 0;while (var_182 < var_244['length']) {if (var_182 === 0) {var_244[var_182].arguments[1] = var_23;this['_send'] = !0;var_26.apply(this, var_244[var_182].arguments);} else {this[var_244[var_182]['func']].apply(this, var_244[var_182].arguments);}++var_182;}if (this['_overrideMimeTypeArgs']) {this['overrideMimeType']();}delete this['_byted_intercept_list'];if (args_8['sdi']) {this['setRequestHeader'](args_14['secInfoHeader'], args_15());}this['onreadystatechange'] = var_7;this['onabort'] = var_8;this['onerror'] = var_9;this['onload'] = function () {var var_6 = 0;if (!this['responseURL']) {if (!this['_byted_url']) {var var_7 = '';if (args_16(var_7)) {var_6 = 1;}if (var_7['indexOf'](window['location']['host']) !== 0 - 1) {var_6 = 2;}if (var_6 > 0) {var var_8 = this['getResponseHeader']('x-ms-token');if (var_8) {var var_9 = args_17(this['_byted_url']);if (var_9 === args_18['sec']) {args_3['msToken'] = var_8;args_3['msStatus'] = var_9;args_19('msToken', var_8);args_20(var_8);if (var_9 > var_16) {if (args_3['msNewTokenList']['length'] > 0) {args_21(args_22, 2);}}} else if (var_16 >= args_3['msStatus']) {args_3['msToken'] = var_8;}if (var_16 === args_18['init']) {if (args_3['msNewTokenList']['length'] < 10) {args_3['msNewTokenList']['push'](var_8);if (args_3['msNewTokenList']['length'] === 1) {args_20(var_8);args_19('msToken', var_8);}}}}}if (var_10) {var_10(args_0);}return;} else {var_7 = this['_byted_url'];if (args_16(var_7)) {var_6 = 1;}if (var_7['indexOf'](window['location']['host']) !== 0 - 1) {var_6 = 2;}if (var_6 > 0) {var_8 = this['getResponseHeader']('x-ms-token');if (var_8) {var_9 = args_17(this['_byted_url']);if (var_9 === args_18['sec']) {args_3['msToken'] = var_8;args_3['msStatus'] = var_9;args_19('msToken', var_8);args_20(var_8);if (var_9 > var_16) {if (args_3['msNewTokenList']['length'] > 0) {args_21(args_22, 2);}}} else if (var_16 >= args_3['msStatus']) {args_3['msToken'] = var_8;}if (var_16 === args_18['init']) {if (args_3['msNewTokenList']['length'] < 10) {args_3['msNewTokenList']['push'](var_8);if (args_3['msNewTokenList']['length'] === 1) {args_20(var_8);args_19('msToken', var_8);}}}}}if (var_10) {var_10(args_0);}}} else if (!this['responseURL']) {var_7 = '';if (args_16(var_7)) {var_6 = 1;}if (var_7['indexOf'](window['location']['host']) !== 0 - 1) {var_6 = 2;}if (var_6 > 0) {var_8 = this['getResponseHeader']('x-ms-token');if (var_8) {var_9 = args_17(this['_byted_url']);if (var_9 === args_18['sec']) {args_3['msToken'] = var_8;args_3['msStatus'] = var_9;args_19('msToken', var_8);args_20(var_8);if (var_9 > var_16) {if (args_3['msNewTokenList']['length'] > 0) {args_21(args_22, 2);}}} else if (var_16 >= args_3['msStatus']) {args_3['msToken'] = var_8;}if (var_16 === args_18['init']) {if (args_3['msNewTokenList']['length'] < 10) {args_3['msNewTokenList']['push'](var_8);if (args_3['msNewTokenList']['length'] === 1) {args_20(var_8);args_19('msToken', var_8);}}}}}if (var_10) {var_10(args_0);}return;} else {var_7 = this['responseURL'];if (args_16(var_7)) {var_6 = 1;}if (var_7['indexOf'](window['location']['host']) !== 0 - 1) {var_6 = 2;}if (var_6 > 0) {var_8 = this['getResponseHeader']('x-ms-token');if (var_8) {var_9 = args_17(this['_byted_url']);if (var_9 === args_18['sec']) {args_3['msToken'] = var_8;args_3['msStatus'] = var_9;args_19('msToken', var_8);args_20(var_8);if (var_9 > var_16) {if (args_3['msNewTokenList']['length'] > 0) {args_21(args_22, 2);}}} else if (var_16 >= args_3['msStatus']) {args_3['msToken'] = var_8;}if (var_16 === args_18['init']) {if (args_3['msNewTokenList']['length'] < 10) {args_3['msNewTokenList']['push'](var_8);if (args_3['msNewTokenList']['length'] === 1) {args_20(var_8);args_19('msToken', var_8);}}}}}if (var_10) {var_10(args_0);}}};this['onloadend'] = var_11;this['onloadstart'] = var_12;this['onprogress'] = var_13;this['ontimeout'] = var_14;var var_216 = 0;while (var_216 < var_30['length']) {this['upload'][var_30[var_216]] = var_15[var_30[var_216]];++var_216}}return var_28.apply(this, arguments);}};}
上面代码是在vmp还原后经过手动小优化的,因为分支处理不够好,会有重复分支,手动删除即可。
上面代码不调试,直接看,逻辑也都很清晰了,加密是在send函数里面,这一小段:
浏览器上也是可以得到结果的,证明是没问题的
最后我也将还原的代码将算法扣出来,然后用python,去请求也没问题
从还原的代码来看,对环境的检测也挺多的,检测了一些dom操作,还检测了一堆异步对象,都是获取设备的一些信息的。
6. 参考文章
给"某音"的js虚拟机写一个编译器
某乎x96参数与jsvmp初体验
相关文章:
如何用AST还原某音的JSVMP
1. 什么是JSVMP vmp简单来说就是将一些高级语言的代码通过自己实现的编译器进行编译得到字节码,这样就可以更有效的保护原有代码,而jsvmp自然就是对JS代码的编译保护,具体的可以看看H5应用加固防破解-JS虚拟机保护方案。 如何区分是不是jsv…...
【蓝桥杯试题】 递归实现指数型枚举例题
💃🏼 本人简介:男 👶🏼 年龄:18 🤞 作者:那就叫我亮亮叭 📕 专栏:蓝桥杯试题 文章目录1. 题目描述2. 思路解释2.1 时间复杂度2.2 递归3. 代码展示最后&#x…...
【用Group整理目录结构 Objective-C语言】
一、接下来,我们看另外一个知识点,怎么用Group把这一堆乱七八糟的文件给它整理一下,也算是封装一下吧, 1.这一堆杂乱无章的文件: 那么,哪些类是属于模型呢,哪些类是属于视图呢,哪些类是属于控制器呢, 我们接下来通过Group的方式,来给它们分一下类, 这样看起来就好…...
JavaScript高级程序设计读书分享之8章——8.1理解对象
JavaScript高级程序设计(第4版)读书分享笔记记录 适用于刚入门前端的同志 创建自定义对象的通常方式是创建 Object 的一个新实例,然后再给它添加属性和方法。 let person new Object() person.name Tom person.age 18 person.sayName function(){//示 this.name…...
代码随想录算法训练营第四十天 | 343. 整数拆分,96.不同的二叉搜索树
一、参考资料整数拆分https://programmercarl.com/0343.%E6%95%B4%E6%95%B0%E6%8B%86%E5%88%86.html 视频讲解:https://www.bilibili.com/video/BV1Mg411q7YJ不同的二叉搜索树https://programmercarl.com/0096.%E4%B8%8D%E5%90%8C%E7%9A%84%E4%BA%8C%E5%8F%89%E6%90…...
数据结构与算法系列之顺序表的实现
这里写目录标题顺序表的优缺点:注意事项test.c(动态顺序表)SeqList.hSeqList.c各接口函数功能详解void SLInit(SL* ps);//定义void SLDestory(SL* ps);void SLPrint(SL* ps);void SLPushBack(SL* ps ,SLDataType * x );void SLPopBack(SL* ps…...
基于Linux_ARM板的驱动烧写及连接、挂载详细过程(附带驱动程序)
文章目录前言一、搭建nfs服务二、ARM板的硬件连接三、putty连接四、挂载共享文件夹五、烧写驱动程序六、驱动程序示例前言 本文操作环境:Ubuntu14.04、GEC6818 这里为似懂非懂的朋友简单叙述该文章的具体操作由来,我们的主要目的是将写好的驱动程序烧进…...
python-爬虫-字体加密
直接点 某8网 https://*****.b*b.h*****y*8*.com/ 具体网址格式就是这样的但是为了安全起见,我就这样打码了. 抛出问题 我们看到这个号码是在页面上正常显示的 F12 又是这样就比较麻烦,不能直接获取.用requests库也是获取不到正常想要的 源码的,因为字体加密了. 查看页面源代码…...
计算机组成原理4小时速成5:输入输出系统,io设备与cpu的链接方式,控制方式,io设备,io接口,并行串行总线
计算机组成原理4小时速成5:输入输出系统,io设备与cpu的链接方式,控制方式,io设备,io接口,并行串行总线 2022找工作是学历、能力和运气的超强结合体,遇到寒冬,大厂不招人,…...
安全狗受聘成为福州网信办网络安全技术支撑单位
近日,福州市委网信办召开了2022年度网络安全技术支撑单位总结表彰大会。 作为国内云原生安全领导厂商,安全狗也出席了此次活动。 据悉,会议主要对2022年度优秀支撑单位进行表彰,并为2023年度支撑单位举行授牌仪式。 本次遴选工…...
RV1126 在Ubuntu18.04开发环境搭建
1:安装软件终端下输入安装命名:sudo apt install openssh-serversudo apt install android-tools-adbsudo apt install vim net-tools gitsudo apt install cmakesudo apt install treesudo apt install minicomsudo apt install gawksudo apt install bisonsudo ap…...
如何在 C++ 中调用 python 解析器来执行 python 代码(一)?
实现 Python UDF 中的一步就是学习如何在 C 语言中调用 python 解析器。本文根据 Python 官方文档做了一次实验,记录如下: 1. 安装依赖包 $sudo yum install python3-devel.x86_642. 使用 python-config 来生成编译选项 $python3.6-config --cflags -…...
操作系统权限提升(二十三)之Linux提权-通配符(ws)提权
系列文章 操作系统权限提升(十八)之Linux提权-内核提权 操作系统权限提升(十九)之Linux提权-SUID提权 操作系统权限提升(二十)之Linux提权-计划任务提权 操作系统权限提升(二十一)之Linux提权-环境变量劫持提权 操作系统权限提升(二十二)之Linux提权-SUDO滥用提权 利用通配符…...
Zookeeper下载和安装
Zookeeper 1.下载 官方下载地址:https://zookeeper.apache.org/ 版本:apache-zookeeper-3.7.1-bin.tar.gz 2. 安装 2.1 本地安装 2.1.1 安装JDK 见:Hadoop集群搭建 2.1.2 上传安装包 使用远程工具拷贝安装包到Linux指定路径 /opt/s…...
Biomod2 (上):物种分布模型预备知识总结
Biomod11.栅格数据处理1.1 读取一个栅格图片1.2 计算数据间的相关系数1.3 生成多波段的栅格图像1.4 修改变量名称1.4.1 计算多个变量之间的相关性2. 矢量数据处理2.1 提取矢量数据2.2 数据掩膜2.2 栅格计算2.3 拓展插件的使用3. 图表绘制3.1 遥感影像绘制3.2 柱状图分析图绘制3…...
操作指南:如何高效使用Facebook Messenger销售(二)
上一篇文章我们介绍了使用Facebook Messenger作为销售渠道的定义、好处及注意事项,本节我们将详细介绍怎么将Facebook Messenger销售与SaleSmartly(ss客服)结合,实现一站式管理多主页配图来源:SaleSmartly(…...
计算机三级|网络技术|中小型网络系统总体规划与设计方案|IP地址规划技术|2|3
p3 p4一、中小型网络系统总体规划与设计方案网络关键的设备选型路由器技术指标性能指标综述吞吐量背板能力丢包率时延抖动突发处理能力路由表容量服务质量网管能力可靠性和可用性1 吞吐量指路由器的包转发能力,涉及两个内容:端口吞吐量和整机吞吐量&…...
为什么一定要做集成测试?
集成测试,我们都不陌生,几乎我们产品每天都在进行。但是我们真的有好好思考:为什么一定要做集成测试吗?只是为了简单的将“积木”搭起来就行,还是有什么其他的深意? 深意可能不一定会有,但是意…...
前端:CSS
CSS基本语法规则:选择器若干属性声明 style标签:可以放到代码的任意位置处,head/body中都可以 三种写CSS的方式: 1、内部样式:使用style标签,直接把CSS写到html文件中。此时的style标签可以放到任何位置…...
CMMI—组织级过程定义(OPD)
大家好,我是Doker 多克!一、目的组织级过程定义(Organizational Process Definition, OPD)的目的在于建立并维护一套可用的组织级过程资产、工作环境标准以及团队规则与指南二、简介组织级过程资产使得整个组织具有一致…...
华为OD机试真题Python实现【猜字谜】真题+解题思路+代码(20222023)
猜字谜 题目 小王设计了一个简单的猜字谜游戏,游戏的谜面是一个错误的单词,比如nesw,玩家需要猜出谜底库中正确的单词。 猜中的要求如下: 对于某个谜面和谜底单词,满足下面任一条件都表示猜中: 变换顺序以后一样的,比如通过变换w和e的顺序,nwes跟news是可以完全对应的…...
软测入门(三)Selenium(Web自动化测试基础)
Selenium(Web端自动测试) Selenium是一个用于Web应用程序测试的工具:中文是硒 开源跨平台:linux、windows、mac核心:可以在多个浏览器上进行自动化测试多语言 Selenium WebDriver控制原理 Selenium Client Library…...
备战蓝桥杯——sort函数
备战蓝桥杯——sort函数排列字母lambda匿名函数排列字母 链接: 排列字母 不用多说,很简单的签到题,我们先来了解一下sort函数的用法 list.sort(cmpNone, keyNone, reverseFalse) cmp:进行比较的方法(可以自定义排序的方法,通常…...
华为机试题:HJ86 求最大连续bit数(python)
文章目录(1)题目描述(2)Python3实现(3)知识点详解1、input():获取控制台(任意形式)的输入。输出均为字符串类型。1.1、input() 与 list(input()) 的区别、及其相互转换方…...
机器学习复习--logistic回归简单的介绍和代码调用
最近需要复习一下机器学习相关知识,记录一下 一、简介 线性回归:h(x)wTxbh(x)w^T x bh(x)wTxb logistic回归就是在线性模型的基础上加上一个sigmoid函数ggg,即h(x)g(wTxb)h(x)g(w^T xb)h(x)g(wTxb)。。。g(z)1/(1e−z)g(z)1/(1e^{-z})g(z)…...
uniapp小程序接入腾讯地图sdk
新建一个项目。配置uniapp配置文件设置小程序的appid注意:匿名用户可能存在地理定位失效。查uniapp官网官网->apiuni.getLocation(OBJECT) 获取当前的地理位置、速度。属性:success匿名函数返回值:uni.getLocation({type: gcj02,success: …...
总结JavaScript中的条件判断与比较运算
一、条件判断 JavaScript 中有三种方法可以用来进行条件判断: 1、使用 if-else 语句。这种方法用于在特定条件为 true 时执行一段代码,否则执行另一段代码。例如: let a 5; if (a > 10) {console.log("a is greater than 10"…...
算法练习-排序(一)
算法练习-排序(一) 文章目录算法练习-排序(一)1 排序算法1.1 冒泡排序1.1.1代码1.2插入排序1.2.1代码1.3 选择排序1.3.1代码1.4归并排序1.4.1代码1.5 快速排序1.5.1 思路1.5.2 代码2 题目2.1 特殊排序2.1.1 题目2.1.2 题解2.2 数组中的第k个最大元素2.2.1 题目2.2.2 题解2.3 对…...
CentOS7.6快速安装Docker
快速安装 官网安装参考手册:https://docs.docker.com/install/linux/docker-ce/centos/ 确定你是CentOS7及以上版本,yum是在线安装! [rootVM-4-5-centos ~]# cat /etc/redhat-releaseCentOS Linux release 7.6.1810 (Core)接下来您只管自上向下执行命令即可&#x…...
CentOS 7安装N卡驱动和CUDA和cuDNN
前言系统一开始是CentOS 7.6,安装依赖时yum给的内核文件的版本号和uname -r的结果不一样,这时不能直接装依赖,装上后后面装驱动时会报错找不到内核头文件(最开始我直接装依赖了,以为高版本兼容低版本,然后装驱动时报错…...
自己建网站做推广/seo百度排名优化
原文自工程师Enmanuel Durn博客,传送门 最近(或者不是最近,这完全取决于您什么时候阅读这边文章),我正在跟我的团队伙伴讨论如何去处理这种需要根据不同的值去处理不同的情况的方法,通常对于这种情况下&…...
网络教育网站建设/如何让别人在百度上搜到自己公司
问题描述 有时候逛技术社区,经常会发现有个叫IRC的东西存在,想搭建下看看到底是个什么东西 说明: 操作系统环境为CentOS6.5_64 安装irc服务器 通过yum进行安装,命令如下: yum install ircd-hybrid.x86_64 ircd-hybrid版…...
外贸网站建设维护/补习班
http://symphony.b3log.org/article/1381403388981 #正向、反向代理解释一、什么是squid?squid可以做代理也可以做缓存。squid缓存不仅可以节省宝贵的带宽资源, 也可以大大降低服务器的I/O。squid不仅可以做正向代理, 又可以做反向代理。正向代理, squid后面是客…...
久久营销网站/北京网站seo
English中文含义Terrain地形,Spur山嘴;尖坡Depression洼地Valley峡谷Saddle鞍部Hill小山Draw山坳Cliff悬崖Ridge山脊Protractor量角器contour line等高线legend图例azimuth方位角relief地形MGRS (Military Grid Reference System)军事格网坐标universal …...
创新的网站建设/百度快速查询
问题现象 有个flink实时任务,读kafka和redis,中间有复杂的逻辑处理过程,最终结果写redis。flink实时任务运行一段时间后阻塞了,有时是几个小时后,有时是一两天后。 任务看起来正常是正常的,但kafka消费已…...
wordpress facebook login/谷歌外链工具
两个节点,都可以更新数据,并且互为主从,容易产生的问题:数据不一致;因此慎用,考虑要点:自动增长id,配置一个节点使用奇数id 主主复制的配置步骤: (1) 各节点使用一个惟一…...