网站开发技术 难点/哈尔滨网站制作软件
目测重点在于cookie:mz和m
获取mz.js: https://match.yuanrenxue.com/static/match/match14/m.js
获取设置m: https://match.yuanrenxue.com/api/match/14/m
一、还原16进制
const fs = require('fs');
const parser = require('@babel/parser');
const generator = require('@babel/generator').default;const jsCode = fs.readFileSync('./mz.js', {encoding: 'utf-8'})let ast = parser.parse(jsCode);//parse 一下就可以了let code = generator(ast, {minified: true, jsescOption: {minimum: true}}).code;
ast = parser.parse(code);
code = generator(ast).code;
fs.writeFile('./mz1.js', code, (err) => {
});
初步看到mz赋值位置:
n["Nu" + "mK" + "J"] = "mz" + "=", n["ZD" + "Kb" + "v"] = ";p" + "at" + "h=" + "/", n["Dn" + "NJ" + "W"] = "/a" + "pi" + "/m" + "at" + "ch" + "/1" + "4/" + "m", n["tl" + "pB" + "r"] = function (K, Y) {
二、字符串拼接
目标:n["cW" + "QT" + "T"] -> n["cWQTT"]
import json
import osdef concat_obj_property_name(node):if type(node) == list:for item in node:concat_obj_property_name(item)returnelif type(node) != dict:return# 捕获一个二元运算节点if 'type' in node and node['type'] == 'BinaryExpression':if not (node['left']['type'] == 'Literal' and node['right']['type'] == 'Literal'):concat_obj_property_name(node['left'])concat_obj_property_name(node['right'])if node['left']['type'] == 'Literal' and node['right']['type'] == 'Literal':# 构造新节点new_node = {'type': 'Literal', 'value': node['left']['value'] + node['right']['value']}node.clear()node.update(new_node)returnfor key in node.keys():concat_obj_property_name(node[key])if __name__ == '__main__':with open('mz1.json', 'r', encoding='utf8') as f:data = json.loads(f.read())concat_obj_property_name(data)with open('mz2.json', 'w', encoding='utf8') as f:f.write(json.dumps(data))os.system('/usr/local/bin/node JsonToJs mz2.json mz2.js')
三、数值运算还原
目标:window['n'] = 7317 + -8779 + 1462; -> window['n'] = 0;
使用Python处理要考虑的情况太多。使用js更方便
const fs = require('fs');
//js转AST代码
const parser = require('@babel/parser');
//遍历ASR节点
const traverse = require('@babel/traverse').default;
//用来判断节点类型产生新的节点
const t = require('@babel/types');
//用来把AST转换成js代码
const generator = require('@babel/generator').default;
const jscode = fs.readFileSync("./mz2.js", {encoding: "utf-8"
});const visitor = {"BinaryExpression"(path) {let left = path.node.left;let right = path.node.right;if (left.type == "NumericLiteral" | left.type == "UnaryExpression" && right.type == "NumericLiteral" | right.type == "UnaryExpression") {path.replaceWith(t.valueToNode(path.evaluate().value));}}
}const revertUnaryExpression = {"UnaryExpression"(path) {let argument = path.node.argument;if (argument.type == 'NumericLiteral' | argument.type == 'UnaryExpression' && generator(path.node).code.indexOf(' -') != -1) {path.replaceWith(t.valueToNode(eval(generator(path.node).code)));}}
}
let ast = parser.parse(jscode);
for (let i = 0; i < 10; i++) {traverse(ast, visitor);
}
traverse(ast, revertUnaryExpression)let code = generator(ast).code;
fs.writeFile('./mz3.js', code, (err) => {
});
四、对象调用还原
个人想法:这一步才是备而后动-勿使有变这个题目的精髓。
var L = {};L['aKzhL'] = function (S, P) {return S + P;}var G = L;function C(S, P) {var F = G['aKzhL'](G['IboVR'](65535, S), G['IboVR'](65535, P));return G['DNzZE'](G['QpEsx'](G['aKzhL'](G['imxsL'](G['Ggivm'](S, 16), G['Ggivm'](P, 16)), G['Ggivm'](F, 16)), 16), G['IboVR'](65535, F));}
以L来说,在后面替换并未直接使用,而是使用var G = L;进行替换,这还只是针对一个块语句来说,若是放到全局,L不知道被污染多少次了。观察结构,可以在块语句中进行替换。
目标:还原前如上述代码。
还原后:
function C(S, P) {var F = (65535 & S) + (65535 & P);return (S >> 16) + (P >> 16) + (F >> 16) << 16 | 65535 & F;}
import copy
import json
import osobj_name_list = []
obj_property_dict = {}def get_property_dict(node):global obj_property_dictif type(node) == list:for item in node:get_property_dict(item)returnelif type(node) != dict:return# 因为存在变量更新的情况,所以不能遍历全文,在一个块语句中就做替换if 'type' in node and node['type'] == 'BlockStatement':try:# 观察发现,代码中都是 赋值-表达式语句-赋值 这三种格式if len(node['body']) >= 3 and \node['body'][0]['type'] == 'VariableDeclaration' and \node['body'][1]['type'] == 'ExpressionStatement' and \node['body'][2]['type'] == 'VariableDeclaration':obj_property_dict.clear()if 'init' in node['body'][2]['declarations'][0] and \node['body'][2]['declarations'][0]['init']['type'] == 'Identifier':obj_name = node['body'][2]['declarations'][0]['id']['name']if obj_name not in obj_property_dict:obj_property_dict[obj_name] = {}for i in node['body'][1]['expression']['expressions']:if i['type'] == 'AssignmentExpression':property_name = i['left']['property']['value']obj_property_dict[obj_name][property_name] = i['right']obj_property_reload(node)node['body'][2]['declarations'][0]['init'] = {'type': 'Literal', 'value': 'Nothing'}node['body'] = node['body'][2:]except KeyError as e:print('error', e, node['body'][2]['declarations'])for key in node.keys():get_property_dict(node[key])# 对象调用还原
def obj_property_reload(node):if type(node) == list:for item in node:obj_property_reload(item)returnelif type(node) != dict:returntry:if node['type'] == 'MemberExpression':# 处理形似:_0x5243e3['UhBgk']return '666'try:obj_name = node['object']['name']obj_property_name = node['property']['value']new_node = obj_property_dict[obj_name][obj_property_name]if new_node['type'] != 'FunctionExpression':node.clear()node.update(new_node)except Exception:pass# 捕获一个函数调用节点,且子节点callee的类型是一个MemberExpressionif node['type'] == 'CallExpression' and node['callee']['type'] == 'MemberExpression':argument_list = node['arguments']for para in argument_list:if para['type'] == 'CallExpression': # 递归调用obj_property_reload(para)obj_name = node['callee']['object']['name']obj_property_name = node['callee']['property']['value'] # 获取需要调用的对象属性名称function_node = obj_property_dict[obj_name][obj_property_name] # 获取函数定义节点,即对象的属性值(该属性值是一个函数定义)# 获取形参param_list = [item['name'] for item in function_node['params']]# 获取实参param_argument_dict = dict(zip(param_list, argument_list))return_node = copy.deepcopy(function_node['body']['body'][0])# print(return_node)if return_node['argument']['type'] == 'BinaryExpression' or \return_node['argument']['type'] == 'LogicalExpression':if return_node['argument']['left']['type'] == 'Identifier':return_node['argument']['left'] = param_argument_dict[return_node['argument']['left']['name']]if return_node['argument']['right']['type'] == 'Identifier':return_node['argument']['right'] = param_argument_dict[return_node['argument']['right']['name']]node.clear()node.update(return_node['argument'])elif return_node['argument']['type'] == 'CallExpression':if return_node['argument']['callee']['type'] != 'MemberExpression':function_name = return_node['argument']['callee']['name']if function_name in param_argument_dict:return_node['argument']['callee'] = param_argument_dict[function_name]for i in range(len(return_node['argument']['arguments'])):if return_node['argument']['arguments'][i]['type'] == 'Identifier':argument_name = return_node['argument']['arguments'][i]['name']return_node['argument']['arguments'][i] = param_argument_dict[argument_name]node.clear()node.update(return_node['argument'])except Exception as e:print('???', e)for key in node.keys():obj_property_reload(node[key])if __name__ == '__main__':with open('mz3.json', 'r', encoding='utf8') as f:data = json.loads(f.read())get_property_dict(data)print(obj_property_dict.keys())with open('mz4.json', 'w', encoding='utf8') as f:f.write(json.dumps(data))os.system('/usr/local/bin/node JsonToJs mz4.json mz4.js')
五、控制流平坦化
import json
import osdef sort_code(node):if type(node) == list:try:if len(node) == 2 and node[1]['type'] == 'WhileStatement' and node[0]['type'] == 'VariableDeclaration':for i in node[0]['declarations']:if i['type'] == 'VariableDeclarator' and i['init'] and \i['init']['type'] == 'CallExpression':sort_list = i['init']['callee']['object']['value'].split('|')cases_list = node[1]['body']['body'][0]['cases']result_list = [cases_list[int(i)]['consequent'][0] for i in sort_list]node.clear()node.extend(result_list)except (KeyError, TypeError):for item in node:sort_code(item)returnelif type(node) == dict:for key in node.keys():sort_code(node[key])returnelse:returnfor item in node:sort_code(item)if __name__ == '__main__':with open('mz5.json', 'r', encoding='utf8') as f:data = json.loads(f.read())sort_code(data)with open('mz6.json', 'w', encoding='utf8') as f:f.write(json.dumps(data))os.system('/usr/local/bin/node JsonToJs mz6.json mz6.js')
经过以上几个步骤,逻辑已经基本清晰:
function E(K) {function d(h, b) {var D = b;var I = _n('jsencrypt');var u = new I();var Q = u['encode'](h, D);// if (m5['toString']()['indexOf']('\n') != -(1507 + -311 * -11 + -4927)) while (!![]) {// console['log'](x['pSnMY'](x['pSnMY'](x['pSnMY']('生而', '为虫'), ',我'), '很抱') + '歉');// }return Q;}return result = d(K, K), result;}let a, p;a = Date['parse'](new Date()) * 8;p = E(parseInt(a / 8)); //rsa加密let b = Date['parse'](new Date());let aa = m5(p);let bb = m5(b);let d = 'Mozilla,Netscape,5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/110.0.0.0 Safari/537.36,[object NetworkInformation],true,,[object Geolocation],8,zh-CN,zh-CN,zh,0,[object MediaCapabilities],[object MediaSession],[object MimeTypeArray],true,[object Permissions],MacIntel,[object PluginArray],Gecko,20030107,[object UserActivation],Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/110.0.0.0 Safari/537.36,Google Inc.,,[object DeprecatedStorageQuota],[object DeprecatedStorageQuota],875,0,25,1440,30,900,[object ScreenOrientation],30,1440,[object DOMStringList],function assign() { [native code] },,match.yuanrenxue.com,match.yuanrenxue.com,https://match.yuanrenxue.com/match/14,https://match.yuanrenxue.com,/match/14,,https:,function reload() { [native code] },function replace() { [native code] },,function toString() { [native code] },function valueOf() { [native code] }'let b64_zw = 'TW96aWxsYSxOZXRzY2FwZSw1LjAgKE1hY2ludG9zaDsgSW50ZWwgTWFjIE9TIFggMTBfMTVfNykgQXBwbGVXZWJLaXQvNTM3LjM2IChLSFRNTCwgbGlrZSBHZWNrbykgQ2hyb21lLzExMC4wLjAuMCBTYWZhcmkvNTM3LjM2LFtvYmplY3QgTmV0d29ya0luZm9ybWF0aW9uXSx0cnVlLCxbb2JqZWN0IEdlb2xvY2F0aW9uXSw4LHpoLUNOLHpoLUNOLHpoLDAsW29iamVjdCBNZWRpYUNhcGFiaWxpdGllc10sW29iamVjdCBNZWRpYVNlc3Npb25dLFtvYmplY3QgTWltZVR5cGVBcnJheV0sdHJ1ZSxbb2JqZWN0IFBlcm1pc3Npb25zXSxNYWNJbnRlbCxbb2JqZWN0IFBsdWdpbkFycmF5XSxHZWNrbywyMDAzMDEwNyxbb2JqZWN0IFVzZXJBY3RpdmF0aW9uXSxNb3ppbGxhLzUuMCAoTWFjaW50b3NoOyBJbnRlbCBNYWMgT1MgWCAxMF8xNV83KSBBcHBsZVdlYktpdC81MzcuMzYgKEtIVE1MLCBsaWtlIEdlY2tvKSBDaHJvbWUvMTEwLjAuMC4wIFNhZmFyaS81MzcuMzYsR29vZ2xlIEluYy4sLFtvYmplY3QgRGVwcmVjYXRlZFN0b3JhZ2VRdW90YV0sW29iamVjdCBEZXByZWNhdGVkU3RvcmFnZVF1b3RhXSw4NzUsMCwyNSwxNDQwLDMwLDkwMCxbb2JqZWN0IFNjcmVlbk9yaWVudGF0aW9uXSwzMCwxNDQwLFtvYmplY3QgRE9NU3RyaW5nTGlzdF0sZnVuY3Rpb24gYXNzaWduKCkgeyBbbmF0aXZlIGNvZGVdIH0sLG1hdGNoLnl1YW5yZW54dWUuY29tLG1hdGNoLnl1YW5yZW54dWUuY29tLGh0dHBzOi8vbWF0Y2gueXVhbnJlbnh1ZS5jb20vbWF0Y2gvMTQsaHR0cHM6Ly9tYXRjaC55dWFucmVueHVlLmNvbSwvbWF0Y2gvMTQsLGh0dHBzOixmdW5jdGlvbiByZWxvYWQoKSB7IFtuYXRpdmUgY29kZV0gfSxmdW5jdGlvbiByZXBsYWNlKCkgeyBbbmF0aXZlIGNvZGVdIH0sLGZ1bmN0aW9uIHRvU3RyaW5nKCkgeyBbbmF0aXZlIGNvZGVdIH0sZnVuY3Rpb24gdmFsdWVPZigpIHsgW25hdGl2ZSBjb2RlXSB9';m = m5(gee(aa, bb, c, d, e, b64_zw)) + '|' + b + '|' + a + '|';return m
但是直接运行还是会陷入死循环,需要手动处理如:补环境,干掉格式检查,干掉本地环境检查。如以下示例:
// eval('delete document'), eval('delete window');
// bp = eval('CanvasCaptureMediaStreamTrack');
// global替换为Node环境下不存在的属性如:f**e['you']
try {global && (cl[cs >>> 2] &= 25 << 32 - cs % 4 * 8, cl['length'] = Math['ceil'](cs / 4));
} catch (cM) {cM[cs >>> 2] &= 4294967295 << 32 - cs % 4 * 8, cM['length'] = Math['ceil'](cs / 4);
}
经过以上操作,发现还缺少v14和v142参数,是在m.js文件中进行的赋值,又发现每次请求,m.js中的大数组是随机变化的。
window[$_0x3469('\x30\x78\x31\x32\x35', '\x65\x45\x30\x5a')] = '\x35\x37\x6f' + '\x38\x75\x33' + '\x70\x6b\x62' + '\x74';
window[$_0x3469('\x30\x78\x33\x34', '\x66\x56\x53\x75') + '\x32'] = $_0x3469('\x30\x78\x33\x31', '\x49\x44\x69\x5a') + '\x33\x36\x35' + $_0x3469('\x30\x78\x37\x34', '\x23\x64\x73\x53') + '\x32\x34';
so等到需要时动态请求即可:
def get_v():"""get v14 and v142:return:"""res = session.get('https://match.yuanrenxue.com/api/match/14/m')v = re.findall("window\[\${0,1}.*?=(\${0,1}.*?);", res.text)if len(v) != 2:get_v()with open('./m.js', 'wb') as f:f.write(res.content)os.system('/usr/local/bin/node JsToJson m.js m.json')with open('./m.json', 'r', encoding='utf8') as f:node = json.loads(f.read())# 提取数组还原的代码及还原代码中的常量,其它代码无用array_revert_node = {'type': 'Program','body': node['body'][:3],'sourceType': 'script'}with open('m_array_revert.json', 'w', encoding='utf8') as f:f.write(json.dumps(array_revert_node))os.system('/usr/local/bin/node JsonToJs m_array_revert.json m_array_revert.js')return v
完整代码:
py:
import json
import os
import re
import subprocess
import execjs
import requestsnode = execjs.get()session = requests.session()headers = {'User-Agent': 'yuanrenxue.project'}
sum_num = 0def login():data = {'username': 'lllll','pwd': '********'}session.post('https://match.yuanrenxue.com/api/login', data=data)session.get('https://match.yuanrenxue.com/api/loginInfo')def get_v():"""get v14 and v142:return:"""res = session.get('https://match.yuanrenxue.com/api/match/14/m')v = re.findall("window\[\${0,1}.*?=(\${0,1}.*?);", res.text)if len(v) != 2:get_v()with open('./m.js', 'wb') as f:f.write(res.content)os.system('/usr/local/bin/node JsToJson m.js m.json')with open('./m.json', 'r', encoding='utf8') as f:node = json.loads(f.read())array_revert_node = {'type': 'Program','body': node['body'][:3],'sourceType': 'script'}with open('m_array_revert.json', 'w', encoding='utf8') as f:f.write(json.dumps(array_revert_node))os.system('/usr/local/bin/node JsonToJs m_array_revert.json m_array_revert.js')return vdef get_cookie(page_num, v):with open('m_array_revert.js', 'r', encoding='utf-8') as f:ctx = node.compile(f.read())v = [ctx.eval(i) for i in v]p = subprocess.Popen(['/usr/local/bin/node', './mz6.js', str(page_num), v[0], v[1]], stdout=subprocess.PIPE)m = p.stdout.read().decode('UTF-8').replace('\n', '')cookies = {'mz': 'TW96aWxsYSxOZXRzY2FwZSw1LjAgKE1hY2ludG9zaDsgSW50ZWwgTWFjIE9TIFggMTBfMTVfNykgQXBwbGVXZWJLaXQvNTM3LjM2IChLSFRNTCwgbGlrZSBHZWNrbykgQ2hyb21lLzExMC4wLjAuMCBTYWZhcmkvNTM3LjM2LFtvYmplY3QgTmV0d29ya0luZm9ybWF0aW9uXSx0cnVlLCxbb2JqZWN0IEdlb2xvY2F0aW9uXSw4LHpoLUNOLHpoLUNOLHpoLDAsW29iamVjdCBNZWRpYUNhcGFiaWxpdGllc10sW29iamVjdCBNZWRpYVNlc3Npb25dLFtvYmplY3QgTWltZVR5cGVBcnJheV0sdHJ1ZSxbb2JqZWN0IFBlcm1pc3Npb25zXSxNYWNJbnRlbCxbb2JqZWN0IFBsdWdpbkFycmF5XSxHZWNrbywyMDAzMDEwNyxbb2JqZWN0IFVzZXJBY3RpdmF0aW9uXSxNb3ppbGxhLzUuMCAoTWFjaW50b3NoOyBJbnRlbCBNYWMgT1MgWCAxMF8xNV83KSBBcHBsZVdlYktpdC81MzcuMzYgKEtIVE1MLCBsaWtlIEdlY2tvKSBDaHJvbWUvMTEwLjAuMC4wIFNhZmFyaS81MzcuMzYsR29vZ2xlIEluYy4sLFtvYmplY3QgRGVwcmVjYXRlZFN0b3JhZ2VRdW90YV0sW29iamVjdCBEZXByZWNhdGVkU3RvcmFnZVF1b3RhXSw4NzUsMCwyNSwxNDQwLDMwLDkwMCxbb2JqZWN0IFNjcmVlbk9yaWVudGF0aW9uXSwzMCwxNDQwLFtvYmplY3QgRE9NU3RyaW5nTGlzdF0sZnVuY3Rpb24gYXNzaWduKCkgeyBbbmF0aXZlIGNvZGVdIH0sLG1hdGNoLnl1YW5yZW54dWUuY29tLG1hdGNoLnl1YW5yZW54dWUuY29tLGh0dHBzOi8vbWF0Y2gueXVhbnJlbnh1ZS5jb20vbWF0Y2gvMTQsaHR0cHM6Ly9tYXRjaC55dWFucmVueHVlLmNvbSwvbWF0Y2gvMTQsLGh0dHBzOixmdW5jdGlvbiByZWxvYWQoKSB7IFtuYXRpdmUgY29kZV0gfSxmdW5jdGlvbiByZXBsYWNlKCkgeyBbbmF0aXZlIGNvZGVdIH0sLGZ1bmN0aW9uIHRvU3RyaW5nKCkgeyBbbmF0aXZlIGNvZGVdIH0sZnVuY3Rpb24gdmFsdWVPZigpIHsgW25hdGl2ZSBjb2RlXSB9','m': m + str(page_num)}print(v)print(cookies)return cookiesdef get_page_info():global sum_numurl = 'https://match.yuanrenxue.com/api/match/14?'for i in range(1, 6):v = get_v()cookies = get_cookie(i, v)res = session.get(f'{url}page={i}', headers={'User-Agent': 'yuanrenxue.project'}, cookies=cookies).json()for j in res['data']:sum_num += j['value']if __name__ == '__main__':login()get_page_info()print(sum_num)
js:
GOOD-GOOD-STUDY/mz6.js at master · tianmingbo/GOOD-GOOD-STUDY · GitHub
相关文章:

猿人学14题详解
目测重点在于cookie:mz和m 获取mz.js: https://match.yuanrenxue.com/static/match/match14/m.js 获取设置m: https://match.yuanrenxue.com/api/match/14/m 一、还原16进制 const fs require(fs); const parser require(babel/parser); const gen…...

Allegro如何快速把推挤的走线变平滑操作指导
Allegro如何快速把推挤的走线变平滑操作指导 Allegro有个非常强大的功能,推挤命令,可以快速的让走线以不报DRC的形式避让目标 推挤后的效果如下图 但是走线不够平滑,如果每一段都去再推一下比较费时间,下面介绍allegro本身自带的优化类似走线的功能 具体操作如下 点击Rout…...

nginx基础学习
作为前端开发者,也很有必要了解一些运维部署知识。 nginx的作用有哪些? 负载平衡动静分离反向代理 何为反向代理? 反向代理即是,用户访问nginx服务器,nginx又将请求转发到真正服务器上,为什么用户不能直…...

【HDFS】FsDatasetImpl#recoverClose方法
recoverClose的目的recoverClose的过程recoverClose的调用点一、前言 HDFS客户端写文件时,如果某个datanode发生错误或者异常。客户端会把这个datanode从pipeline里踢除,然后进行pipiline recovery,用剩余datanodes去写或者满足一定的条件时补充新的datanode到pipeline中写…...

加油站会员管理小程序实战开发教程15 完结篇
这篇是本次实战课程的最后一篇,我们在上篇还有两个问题没解决。一个是会员卡类型显示不对,一个是不同的会员卡我们希望背景色显示不同。我们先处理一下这两个问题 1 显示会员卡类型 在列表上直接显示会员卡类型,目前显示的是数字,这个是因为枚举类型导致的。枚举类型在数…...

学习 Python 之 Pygame 开发坦克大战(五)
学习 Python 之 Pygame 开发坦克大战(五)坦克大战完善地图1. 创建砖墙2. 给砖墙增加子弹击中的碰撞效果3. 给砖墙添加坦克不能通过的碰撞效果4. 添加石墙5. 添加玩家基地6. 最终效果坦克大战完善地图 我的素材放到了百度网盘里,里面还有原版…...

【ROS】Windows系统安装ROS体验
大家平时玩ROS都是在Ubuntu系统上,那Windows系统可以安装吗,答案是:可以的!Windows为了发展自家的物联网生态,已经在Windows系统支持ROS了。 文章目录1.安装VS 20172.安装Chocolatey & Git3.安装ROS4.运行ROS例程1…...

第1讲-初步认识数据库系统(测试题总结)
一、测试题 数据库系统 包含 数据库管理系统 详细版: 数据库管理系统DBMS是数据管理软件,在用户和操作系统之间。 数据库系统DBS由数据库,数据库管理系统(及其应用开发工具)、应用程序和数据库管理员DBA组成的存储、管…...

进程-操作系统结构
进程-操作系统结构 中文仅本人理解,有错误请联系我。 操作系统为不同方面服务,有不同的设计角度。 为用户: 使用 为程序员:创造 程序员需要关注的就是system call接口的调度 file systems:ntfs,ext4 commu…...
【网络原理6】数据链路层协议——以太网
数据链路层负责的是相邻两个网络节点之间的数据以帧为单位进行传输。 具体关于数据链路层的介绍,已经在这一篇文章当中提到了。 初识网络:IP、端口、网络协议、TCP-IP五层模型_革凡成圣211的博客-CSDN博客TCP/IP五层协议详解https://blog.csdn.net/weix…...

组合数学原理与例题
目录 一、前言 二、计数原理 1、加法原理 2、分割立方体(lanqiaoOJ题号1620) 3、乘法原理 4、挑选子串(lanqiaoOJ题号1621) 5、糊涂人寄信(lanqiaoOJ题号1622) 6、战斗吧N皇后(lanqiaoO…...

【机器学习 深度学习】通俗讲解集成学习算法
目录:集成学习一、机器学习中的集成学习1.1 定义1.2 分类器(Classifier)1.2.1 决策树分类器1.2.2 朴素贝叶斯分类器1.2.3 AdaBoost算法1.2.4 支持向量机1.2.5 K近邻算法1.3 集成学习方法1.3.1 自助聚合(Bagging)1.3.2 提升法(Boosting)1.3.2.1 自适应adaboost1.3.3 …...

汉字----dgfont
Abstract 字符生成是一个具有挑战性的问题,特别是对于一些由大量字符组成的书写系统,近年来受到了广泛的关注。然而,现有的字体生成方法通常是在监督学习中。它们需要大量的配对数据,这是劳动密集型和昂贵的收集。此外,常见的图像到图像转换模型通常将风格定义为纹理和颜…...

C# chart绘图 鼠标响应
1、图形自动滚动设置 chart1.ChartAreas[0].AxisX.Maximum 横坐标显示区域最大值 chart1.ChartAreas[0].AxisX.Minimum 横坐标显示区域最小值 显示宽度 chart1.ChartAreas[0].AxisX.Maximum - chart1.ChartAreas[0].AxisX.Minimum chart1.ChartAreas[0].AxisX.Maximum x_d…...

结构体与引用
1.结构体基本概念结构体属于用户自定义的数据类型,允许用户存储不同的数据类型2.结构体定义和使用语法: struct 结构体 { 结构体成员列表 };通过结构体创建变量的方式有三种:struct 结构体名 变量名struct 结构体名 变量名 { 成员1值,成员2值...}定义结构…...

13.罗马数字转整数
罗马数字包含以下七种字符: I, V, X, L,C,D 和 M。字符 数值I 1V 5X 10L 50C 100D 500M 1000例如, 罗马数字 2 写做 II ,即为两个并列的 1 。12 写做 XII ,即为 X II 。 27 写做 XX…...

JVM垃圾回收机制
垃圾回收机制(GC) 内存管理 Java的内存管理很大程度指的就是对象的管理,其中包括对象空间的分配和释放。 对象空间的分配:使用new关键字创建对象即可 对象空间的释放:将对象赋值null即可。垃圾回收器将负责所有“不…...

Java File类、IO流、Properties属性类
文章目录一、补充二、File类File类的含义创建多级文件File类的常见方法三、IO流IO流分类输入输出流FileOutputStreamInputStreamInputStream与OutputStream的实例ReaderWriterFileReader和FileWriter的实例缓冲流转换流序列化与ObjectInputStream、ObjectOutputStream打印流Pro…...

MySQL备份恢复(十二)
文章目录1. MySQL数据损坏类型1.1 物理损坏1.2 逻辑损坏2. DBA运维人员备份/恢复职责2.1 设计备份/容灾策略2.1.1 备份策略2.1.2 容灾策略2.2 定期的备份/容灾检查2.3 定期的故障恢复演练2.4 数据损坏时的快速准确恢复2.5 数据迁移工作3. MySQL常用备份工具3.1 逻辑备份方式3.2…...

【Java|golang】1792. 最大平均通过率---封装最小堆
一所学校里有一些班级,每个班级里有一些学生,现在每个班都会进行一场期末考试。给你一个二维数组 classes ,其中 classes[i] [passi, totali] ,表示你提前知道了第 i 个班级总共有 totali 个学生,其中只有 passi 个学…...

PHP 页面静态化
前言随着网站的内容的增多和用户访问量的增多,网站加载会越来越慢,受限于带宽和服务器同一时间的请求次数的限制,,我们往往需要在此时对我们的网站进行代码优化和服务器配置的优化。一、页面静态化概念静态化定义静态化就是指把原…...

【Python】进制、计算机中的单位、编码、数据类型、索引、字符串切片、字符串的功能方法
一、进制计算机中底层所有的数据都是以 010101 的形式存在(图片、文本、视频等)。二进制八进制十进制(也就是我们熟知的阿拉伯数字)十六进制进制转换v1 bin(25) # 十进制转换为二进制 print(v1) # "0b11001"v2 oct(23…...

基于android的无人健身房
需求信息: 1:客户登录:首次登陆必须注册,用户注册完成后可以进入软件查看自己的金额、会员等级、消费和健身时长。 2:计费功能:用户通过软件扫描二维码后即可进入健身房,软件显示欢迎进入健身房…...

带你Java基础入门
首先我们都知道的,Java是一种高级计算机语言,是可以编写跨平台应用软件、完全面向对象的程序设计语言。相对于零基础小白如何更加快速的入门java?小编给大家整理了java300集自学教程视频,非常适合零基础的小伙伴,一周时间实现快速…...

VNCTF 2023 - Web 象棋王子|电子木鱼|BabyGo Writeups
象棋王子 签到题,jsfuck解密 丢到console得到flag 电子木鱼 后面两道都是代码审计,这题是rust,题目给出了源码,下载下来看 关键代码: 由于限制,quantity只能为正数 功德也只能是正数(负数的…...

「JVM 编译优化」插入式注解处理器(自定义代码编译检查)
JDK 的编译子系统暴露给用户直接控制的功能相对很少,除了虚拟机即时编译的若干参数,便只有 JSR-296 中定义的插入式注解处理器 API; 文章目录1. 目标2. 实现3. 运行与测试4. 其他应用案例1. 目标 前端编译器在讲 Java 源码编译成字节码时对源…...

一文彻底理解大小端和位域 BIGENDIAN LITTLEENDIAN
一文彻底理解大小端和位域 为什么有大小端 人们一直认为大道至简,就好像物理学上的世界追求使用一个理论来统一所有的现象。为什么cpu存在大小端之分,一言以蔽之,这两种模式各有各的优点,其各自的优点就是对方的缺点,…...

面试准备知识点与总结——(虚拟机篇)
目录JVM的内存结构JVM哪些部分会发生内存溢出方法区、永久代、元空间三者之间的关系JVM内存参数JVM垃圾回收算法1.标记清除法2.标记整理3.标记复制说说GC和分代回收算法三色标记与并发漏标的问题垃圾回收器项目中什么时候会内存溢出,怎么解决类加载过程三个阶段何为…...

spring cloud 集成 seata 分布式事务
spring cloud 集成 seata 分布式事务 基于 seata-server 1.6.x 序言 下载 seata-server 准备一个数据库 seata 专门为 seata-server 做存储,如, 可以指定 branch_tabledistributed_lockglobal_tablelock_table 准备一个业务库,比如存放定单ÿ…...

k8s篇之概念介绍
文章目录时光回溯什么是K8SK8S不是什么一、K8S构成组件控制平面组件(Control Plane Components)kube-apiserveretcdkube-schedulerkube-controller-managercloud-controller-managerNode 组件kubeletkube-proxy容器运行时(Container Runtime&…...