某小程序sign签名参数逆向分析
文章目录
- 1. 写在前面
- 2. 接口分析
- 3. 分析还原
【🏠作者主页】:吴秋霖
【💼作者介绍】:擅长爬虫与JS加密逆向分析!Python领域优质创作者、CSDN博客专家、阿里云博客专家、华为云享专家。一路走来长期坚守并致力于Python与爬虫领域研究与开发工作!
【🌟作者推荐】:对爬虫领域以及JS逆向分析感兴趣的朋友可以关注《爬虫JS逆向实战》《深耕爬虫领域》
未来作者会持续更新所用到、学到、看到的技术知识!包括但不限于:各类验证码突防、爬虫APP与JS逆向分析、RPA自动化、分布式爬虫、Python领域等相关文章
作者声明:文章仅供学习交流与参考!严禁用于任何商业与非法用途!否则由此产生的一切后果均与作者无关!如有侵权,请联系作者本人进行删除!
1. 写在前面
做爬虫脑子一定要灵光~不然怎么当大佬!正所谓大路不通走水路,水路不通走山路!相信很多工程师在面对一个端采集遇到瓶颈的时候什么M端、APP端、小程序端、Web端都几乎会挑一个或多个去摸排分析一下。风控这个东西很奇妙也很玄学,有时候还真有那么一些低风控的接口或者端存在
小程序端这么说吧,体量大点的风控基本都拉的很强且有的跟某信有因果!除非真的没有其他端的数据源了,一般少有人去(总之非可选的主流战场)
分析目标:
5Lmd5YS/572R57uc
2. 接口分析
随便通过关键词在搜索接口看看发包情况,直接Curl重放是403无效的,会出现签名错误。这个如下所示:
也就是说上面的sign是动态实时生成的,另外还有一个token参数也是有时效性的,将请求参数拿出来看看,如下所示:
data = {"method": "serverless.function.runtime.invoke","params": "{\"functionTarget\":\"DCloud-clientDB\",\"functionArgs\":{\"command\":{\"$db\":[{\"$method\":\"collection\",\"$param\":[\"a_novels\"]},{\"$method\":\"where\",\"$param\":[{\"novels_name\":{\"$regexp\":{\"source\":\"玄幻\",\"flags\":\"\"}}}]},{\"$method\":\"get\",\"$param\":[]}]},\"clientInfo\":{\"PLATFORM\":\"mp-weixin\",\"OS\":\"mac\",\"APPID\":\"__UNI__1B787A1\",\"DEVICEID\":\"17356293548006764541\",\"scene\":1089,\"deviceId\":\"17356293548006764541\",\"appId\":\"__UNI__1B787A1\",\"appName\":\"\",\"appVersion\":\"2.0.1\",\"appVersionCode\":\"201\",\"appLanguage\":\"zh-Hans\",\"uniCompilerVersion\":\"4.36\",\"uniRuntimeVersion\":\"4.36\",\"uniPlatform\":\"mp-weixin\",\"deviceBrand\":\"apple\",\"deviceModel\":\"MacBookPro15,2\",\"deviceType\":\"pc\",\"osName\":\"mac\",\"osVersion\":\"OS\",\"hostVersion\":\"3.8.7\",\"hostName\":\"WeChat\",\"locale\":\"zh-Hans\",\"LOCALE\":\"zh-Hans\"},\"uniIdToken\":\"\"}}","spaceId": "mp-f510ce55-6e44-40b0-b249-d278726b813d","timestamp": 1735785506387,"token": "63bc0ed6-f8a1-40ab-bb07-d11bf678ab21"
}
初看大概是MD5标准加密,拼接一下路径、参数加个时间戳啥的
3. 分析还原
在开始分析JS之前,可以通过反编译小程序的方式去分析也可以使用大佬开源的调试工具来辅助分析,有些Web端分析比较多的使用这个辅助还是蛮不错的。如下所示:
这里在页面直接搜索的话有时候资源多会比较慢,可以直接通过堆栈或者编译好的JS文件简单的进行静态分析,如下所示:
可以看到Ae就是生成签名的调用方法,而clientSecret是一段密文,后续它将参与加密用到,如下所示:
直接跳转到Ae方法处,可以看到Object.keys(e).sort()获取e对象里面的所有键进行一个排序,存在的话则使用&拼接,然后去掉所拼接字符串开头多余的一个&确保格式正确,如下所示:
接下来需要分析P方法,也就是最终的加密算法实现,进入当前方法直接来到了如下所示:
_createHmacHelper: function(e) {return function(t, n) {return new d.HMAC.init(e,n).finalize(t)}
}
这里推测d.HMAC是个库框架中的HMAC实现,而init(e, n)与finalize(t)是该HMAC对象的初始化和最终处理方法,注意入口处的时候是使用了密钥的,所以要分析是什么算法难度是不大的,肯定不是一个单纯的MD5,对应JS代码如下所示:
var k = A((function(e, t) {var n;e.exports = n = n || function(e, t) {var n = Object.create || function() {function e() {}return function(t) {var n;return e.prototype = t,n = new e,e.prototype = null,n}}(), r = {}, o = r.lib = {}, i = o.Base = {extend: function(e) {var t = n(this);return e && t.mixIn(e),t.hasOwnProperty("init") && this.init !== t.init || (t.init = function() {t.$super.init.apply(this, arguments)}),t.init.prototype = t,t.$super = this,t},create: function() {var e = this.extend();return e.init.apply(e, arguments),e},init: function() {},mixIn: function(e) {for (var t in e)e.hasOwnProperty(t) && (this[t] = e[t]);e.hasOwnProperty("toString") && (this.toString = e.toString)},clone: function() {return this.init.prototype.extend(this)}}, a = o.WordArray = i.extend({init: function(e, t) {e = this.words = e || [],this.sigBytes = null != t ? t : 4 * e.length},toString: function(e) {return (e || c).stringify(this)},concat: function(e) {var t = this.words, n = e.words, r = this.sigBytes, o = e.sigBytes;if (this.clamp(),r % 4)for (var i = 0; i < o; i++) {var a = n[i >>> 2] >>> 24 - i % 4 * 8 & 255;t[r + i >>> 2] |= a << 24 - (r + i) % 4 * 8}elsefor (i = 0; i < o; i += 4)t[r + i >>> 2] = n[i >>> 2];return this.sigBytes += o,this},clamp: function() {var t = this.words, n = this.sigBytes;t[n >>> 2] &= 4294967295 << 32 - n % 4 * 8,t.length = e.ceil(n / 4)},clone: function() {var e = i.clone.call(this);return e.words = this.words.slice(0),e},random: function(t) {for (var n, r = [], o = function(t) {t = t;var n = 987654321, r = 4294967295;return function() {var o = ((n = 36969 * (65535 & n) + (n >> 16) & r) << 16) + (t = 18e3 * (65535 & t) + (t >> 16) & r) & r;return o /= 4294967296,(o += .5) * (e.random() > .5 ? 1 : -1)}}, i = 0; i < t; i += 4) {var u = o(4294967296 * (n || e.random()));n = 987654071 * u(),r.push(4294967296 * u() | 0)}return new a.init(r,t)}}), u = r.enc = {}, c = u.Hex = {stringify: function(e) {for (var t = e.words, n = e.sigBytes, r = [], o = 0; o < n; o++) {var i = t[o >>> 2] >>> 24 - o % 4 * 8 & 255;r.push((i >>> 4).toString(16)),r.push((15 & i).toString(16))}return r.join("")},parse: function(e) {for (var t = e.length, n = [], r = 0; r < t; r += 2)n[r >>> 3] |= parseInt(e.substr(r, 2), 16) << 24 - r % 8 * 4;return new a.init(n,t / 2)}}, s = u.Latin1 = {stringify: function(e) {for (var t = e.words, n = e.sigBytes, r = [], o = 0; o < n; o++) {var i = t[o >>> 2] >>> 24 - o % 4 * 8 & 255;r.push(String.fromCharCode(i))}return r.join("")},parse: function(e) {for (var t = e.length, n = [], r = 0; r < t; r++)n[r >>> 2] |= (255 & e.charCodeAt(r)) << 24 - r % 4 * 8;return new a.init(n,t)}}, l = u.Utf8 = {stringify: function(e) {try {return decodeURIComponent(escape(s.stringify(e)))} catch (e) {throw new Error("Malformed UTF-8 data")}},parse: function(e) {return s.parse(unescape(encodeURIComponent(e)))}}, f = o.BufferedBlockAlgorithm = i.extend({reset: function() {this._data = new a.init,this._nDataBytes = 0},_append: function(e) {"string" == typeof e && (e = l.parse(e)),this._data.concat(e),this._nDataBytes += e.sigBytes},_process: function(t) {var n = this._data, r = n.words, o = n.sigBytes, i = this.blockSize, u = o / (4 * i), c = (u = t ? e.ceil(u) : e.max((0 | u) - this._minBufferSize, 0)) * i, s = e.min(4 * c, o);if (c) {for (var l = 0; l < c; l += i)this._doProcessBlock(r, l);var f = r.splice(0, c);n.sigBytes -= s}return new a.init(f,s)},clone: function() {var e = i.clone.call(this);return e._data = this._data.clone(),e},_minBufferSize: 0});o.Hasher = f.extend({cfg: i.extend(),init: function(e) {this.cfg = this.cfg.extend(e),this.reset()},reset: function() {f.reset.call(this),this._doReset()},update: function(e) {return this._append(e),this._process(),this},finalize: function(e) {return e && this._append(e),this._doFinalize()},blockSize: 16,_createHelper: function(e) {return function(t, n) {return new e.init(n).finalize(t)}},_createHmacHelper: function(e) {return function(t, n) {return new d.HMAC.init(e,n).finalize(t)}}});var d = r.algo = {};return r}(Math)
}
)), P = (A((function(e, t) {var n;e.exports = (n = k,function(e) {var t = n, r = t.lib, o = r.WordArray, i = r.Hasher, a = t.algo, u = [];!function() {for (var t = 0; t < 64; t++)u[t] = 4294967296 * e.abs(e.sin(t + 1)) | 0}();var c = a.MD5 = i.extend({_doReset: function() {this._hash = new o.init([1732584193, 4023233417, 2562383102, 271733878])},_doProcessBlock: function(e, t) {for (var n = 0; n < 16; n++) {var r = t + n, o = e[r];e[r] = 16711935 & (o << 8 | o >>> 24) | 4278255360 & (o << 24 | o >>> 8)}var i = this._hash.words, a = e[t + 0], c = e[t + 1], p = e[t + 2], h = e[t + 3], g = e[t + 4], v = e[t + 5], y = e[t + 6], m = e[t + 7], b = e[t + 8], w = e[t + 9], _ = e[t + 10], x = e[t + 11], S = e[t + 12], O = e[t + 13], A = e[t + 14], k = e[t + 15], P = i[0], T = i[1], j = i[2], E = i[3];P = s(P, T, j, E, a, 7, u[0]),E = s(E, P, T, j, c, 12, u[1]),j = s(j, E, P, T, p, 17, u[2]),T = s(T, j, E, P, h, 22, u[3]),P = s(P, T, j, E, g, 7, u[4]),E = s(E, P, T, j, v, 12, u[5]),j = s(j, E, P, T, y, 17, u[6]),T = s(T, j, E, P, m, 22, u[7]),P = s(P, T, j, E, b, 7, u[8]),E = s(E, P, T, j, w, 12, u[9]),j = s(j, E, P, T, _, 17, u[10]),T = s(T, j, E, P, x, 22, u[11]),P = s(P, T, j, E, S, 7, u[12]),E = s(E, P, T, j, O, 12, u[13]),j = s(j, E, P, T, A, 17, u[14]),P = l(P, T = s(T, j, E, P, k, 22, u[15]), j, E, c, 5, u[16]),E = l(E, P, T, j, y, 9, u[17]),j = l(j, E, P, T, x, 14, u[18]),T = l(T, j, E, P, a, 20, u[19]),P = l(P, T, j, E, v, 5, u[20]),E = l(E, P, T, j, _, 9, u[21]),j = l(j, E, P, T, k, 14, u[22]),T = l(T, j, E, P, g, 20, u[23]),P = l(P, T, j, E, w, 5, u[24]),E = l(E, P, T, j, A, 9, u[25]),j = l(j, E, P, T, h, 14, u[26]),T = l(T, j, E, P, b, 20, u[27]),P = l(P, T, j, E, O, 5, u[28]),E = l(E, P, T, j, p, 9, u[29]),j = l(j, E, P, T, m, 14, u[30]),P = f(P, T = l(T, j, E, P, S, 20, u[31]), j, E, v, 4, u[32]),E = f(E, P, T, j, b, 11, u[33]),j = f(j, E, P, T, x, 16, u[34]),T = f(T, j, E, P, A, 23, u[35]),P = f(P, T, j, E, c, 4, u[36]),E = f(E, P, T, j, g, 11, u[37]),j = f(j, E, P, T, m, 16, u[38]),T = f(T, j, E, P, _, 23, u[39]),P = f(P, T, j, E, O, 4, u[40]),E = f(E, P, T, j, a, 11, u[41]),j = f(j, E, P, T, h, 16, u[42]),T = f(T, j, E, P, y, 23, u[43]),P = f(P, T, j, E, w, 4, u[44]),E = f(E, P, T, j, S, 11, u[45]),j = f(j, E, P, T, k, 16, u[46]),P = d(P, T = f(T, j, E, P, p, 23, u[47]), j, E, a, 6, u[48]),E = d(E, P, T, j, m, 10, u[49]),j = d(j, E, P, T, A, 15, u[50]),T = d(T, j, E, P, v, 21, u[51]),P = d(P, T, j, E, S, 6, u[52]),E = d(E, P, T, j, h, 10, u[53]),j = d(j, E, P, T, _, 15, u[54]),T = d(T, j, E, P, c, 21, u[55]),P = d(P, T, j, E, b, 6, u[56]),E = d(E, P, T, j, k, 10, u[57]),j = d(j, E, P, T, y, 15, u[58]),T = d(T, j, E, P, O, 21, u[59]),P = d(P, T, j, E, g, 6, u[60]),E = d(E, P, T, j, x, 10, u[61]),j = d(j, E, P, T, p, 15, u[62]),T = d(T, j, E, P, w, 21, u[63]),i[0] = i[0] + P | 0,i[1] = i[1] + T | 0,i[2] = i[2] + j | 0,i[3] = i[3] + E | 0},_doFinalize: function() {var t = this._data, n = t.words, r = 8 * this._nDataBytes, o = 8 * t.sigBytes;n[o >>> 5] |= 128 << 24 - o % 32;var i = e.floor(r / 4294967296), a = r;n[15 + (o + 64 >>> 9 << 4)] = 16711935 & (i << 8 | i >>> 24) | 4278255360 & (i << 24 | i >>> 8),n[14 + (o + 64 >>> 9 << 4)] = 16711935 & (a << 8 | a >>> 24) | 4278255360 & (a << 24 | a >>> 8),t.sigBytes = 4 * (n.length + 1),this._process();for (var u = this._hash, c = u.words, s = 0; s < 4; s++) {var l = c[s];c[s] = 16711935 & (l << 8 | l >>> 24) | 4278255360 & (l << 24 | l >>> 8)}return u},clone: function() {var e = i.clone.call(this);return e._hash = this._hash.clone(),e}});function s(e, t, n, r, o, i, a) {var u = e + (t & n | ~t & r) + o + a;return (u << i | u >>> 32 - i) + t}function l(e, t, n, r, o, i, a) {var u = e + (t & r | n & ~r) + o + a;return (u << i | u >>> 32 - i) + t}function f(e, t, n, r, o, i, a) {var u = e + (t ^ n ^ r) + o + a;return (u << i | u >>> 32 - i) + t}function d(e, t, n, r, o, i, a) {var u = e + (n ^ (t | ~r)) + o + a;return (u << i | u >>> 32 - i) + t}t.MD5 = i._createHelper(c),t.HmacMD5 = i._createHmacHelper(c)}(Math),n.MD5)
}
)),
A((function(e, t) {var n;e.exports = (n = k,void function() {var e = n, t = e.lib.Base, r = e.enc.Utf8;e.algo.HMAC = t.extend({init: function(e, t) {e = this._hasher = new e.init,"string" == typeof t && (t = r.parse(t));var n = e.blockSize, o = 4 * n;t.sigBytes > o && (t = e.finalize(t)),t.clamp();for (var i = this._oKey = t.clone(), a = this._iKey = t.clone(), u = i.words, c = a.words, s = 0; s < n; s++)u[s] ^= 1549556828,c[s] ^= 909522486;i.sigBytes = a.sigBytes = o,this.reset()},reset: function() {var e = this._hasher;e.reset(),e.update(this._iKey)},update: function(e) {return this._hasher.update(e),this},finalize: function(e) {var t = this._hasher, n = t.finalize(e);return t.reset(),t.finalize(this._oKey.clone().concat(n))}})}())
}
)),
A((function(e, t) {e.exports = k.HmacMD5
}
通过对上面的JS代码进行静态分析可发现最终使用的加密为HmacMD5,结合有密钥参与加密,可以直接Python进行算法还原测试验证即可,算法实现如下所示:
def sign(e, t):sorted_keys = sorted(e.keys())n = ""for key in sorted_keys:if e[key]:n += f"&{key}={e[key]}"n = n[1:]signature = hmac.new(t.encode('utf-8'), n.encode('utf-8'), hashlib.md5).hexdigest()return signature
HMAC-MD5是基于MD5哈希算法的消息认证码,HMAC是一种利用密钥的哈希算法,用于生成一个“签名”,并且常用于消息的完整性验证和认证(如API请求签名)
最终简单的编写一个搜索代码查看一下是否可以正常获取到相关的数据,如下所示:
案列比较简单,适合正在或想要学习逆向新手小伙伴练练手
相关文章:
某小程序sign签名参数逆向分析
文章目录 1. 写在前面2. 接口分析3. 分析还原 【🏠作者主页】:吴秋霖 【💼作者介绍】:擅长爬虫与JS加密逆向分析!Python领域优质创作者、CSDN博客专家、阿里云博客专家、华为云享专家。一路走来长期坚守并致力于Python…...
阿里云redis内存优化——PCP数据清理
在阿里云安装了一个redis节点,今天使用时忽然想着点击了一下分析内存。好家伙,居然崩出了一个30多M的块出来。问题是我本地安装的redis没有这个啊,怎么奇怪冒出这个来了。 本着把系统用干榨尽的态度,研究了下这个问题的来源。网上…...
YOLOv10-1.1部分代码阅读笔记-head.py
head.py ultralytics\nn\modules\head.py 目录 head.py 1.所需的库和模块 2.class Detect(nn.Module): 3.class Segment(Detect): 4.class OBB(Detect): 5.class Pose(Detect): 6.class Classify(nn.Module): 7.class WorldDetect(Detect): 8.class RTDETRDec…...
java开发中注解汇总
注解作用位置注意mybatis Data Getter Setter ToString EqualsAndHashCode AllArgsConstructor NoArgsConstructor Data 代替:无参构造,get,set,toString,hashCode,equals Getter Setter 可放在类和方法上&…...
Java开发 PDF文件生成方案
业务需求背景 业务端需要能够将考试答卷内容按指定格式呈现并导出为pdf格式进行存档,作为紧急需求插入。导出内容存在样式复杂性,包括特定的字体(中文)、字号、颜色,页面得有页眉、页码,数据需要进行表格聚…...
Python机器学习笔记(十七、分箱、离散化、线性模型与树)
数据表示的最佳方法:取决于数据的语义,所使用的模型种类。 线性模型与基于树的模型(决策树、梯度提升树和随机森林)是两种成员很多同时又非常常用的模 型,它们在处理不同的特征表示时就具有非常不同的性质。我们使用w…...
[极客大挑战 2019]Http 1
进入环境: 检查源码发现有一个链接,但是这里没有绑定,需要手动跳转,打开后,发现提示: 这里就是需要我们从https://Sycsecret.buuoj.cn来访问它 因此我们抓包,使用referer:服务器伪造…...
最近学习shader的一些总结
旨在总结最近学习shader过程中一些关键要素,强化下记忆,如果有错误也烦请指出。 1.Properties 可调节变量,用于定义从外部传入到内部的变量, 以及外部通过访问这些变量名, 可以获取这些变量的值 其中定义时指定的类型, 在后文中类型不一定相同(基本不…...
庐山派K230学习日记1 从点灯到吃灰
1 简介 庐山派以K230为主控芯片,支持三路摄像头同时输入,典型网络下的推理能力可达K210的13.7倍(算力约为6TOPS)。支持CanMV,可作为AI与边缘计算平台 K230简介 K230芯片集成了两颗RISC-V处理器核心,双核…...
在Swagger(现称为OpenAPI)中各类@api之间的区别
在Swagger(现称为OpenAPI)中,ApiOperation 是用来描述单个API操作的注解。除此之外,Swagger还提供了其他一些类似的注解,它们用于不同层次或目的来增强API文档的详细程度和可读性。以下是这些注解及其之间的区别&#…...
【网络协议】开放式最短路径优先协议OSPF详解(二)
前言 第一部分:【网络协议】开放式最短路径优先协议OSPF详解(一) 在第一部分中,我们了解了链路状态路由协议并讨论了 OSPF 的工作原理,同时学习了如何配置 OSPF。在本章的第二部分中,我们将进一步探讨 OS…...
windows文件夹自定义右键调用powershell完成7zip加密打包
准备powershell脚本 2. regedit的路径是:计算机\HKEY_CLASSES_ROOT\Directory\shell\,在此项目下新增子项目diy_command\command,command的数据值为powershell D:\windowsProjects\directory_diy.ps1 %1 效果,点击后进入和power…...
MySQL 入门教程
MySQL是最流行的关系型数据库管理系统,在WEB应用方面MySQL是最好的RDBMS(Relational Database Management System:关系数据库管理系统)应用软件之一。 在本教程中,会让大家快速掌握MySQL的基本知识,并轻松使用MySQL数据库。 什么…...
BOOST 库在机器视觉中的应用及示例代码分析
一、引言 机器视觉是一门让计算机模拟人类视觉功能,对图像或视频数据进行理解、分析和决策的学科领域。在机器视觉的开发过程中,常常需要高效处理各种数据结构、进行数值计算、实现多线程并行处理以及运用优秀的算法框架等。BOOST 库作为一个功能强大、…...
第二十六天 自然语言处理(NLP)词嵌入(Word2Vec、GloVe)
自然语言处理(NLP)中的词嵌入(Word2Vec、GloVe)技术,是NLP领域的重要组成部分,它们为词汇提供了高维空间到低维向量的映射,使得语义相似的词汇在向量空间中的距离更近。以下是对这些技术的详细解…...
Log4j2 详解(异步日志打印及CSV格式日志输出)
Log4j2 详解 Apache Log4j2 是一个功能强大的 Java 日志记录框架,提供高性能和灵活的配置。本文档涵盖了 Log4j2 的核心功能及其详细使用方式,包括基础配置、异步日志、CSV 格式日志的输出以及使用注意事项。 一 Log4j2 基础概念与配置 1.1 Log4j2 介绍…...
[网络安全] DVWA之Content Security Policy (CSP) Bypass 攻击姿势及解题详析合集
CSP概念 CSP 是 Content Security Policy(内容安全策略)的缩写,是一种用于增强 Web 应用程序安全性的安全机制。它通过允许网站管理员控制页面中加载内容的来源来减少跨站脚本攻击(XSS)等常见的安全风险。 CSP 的工作…...
linux shell脚本 【分支结构case...in 、循环结构、函数】内附练习
1.思维导图 2.练习 1.定义一个find函数,查找ubuntu和root的gid 2.定义一个数组,写一个函数完成对数组的冒泡排序 bubble() {n${#arr[*]}for((i0;i<n-1;i));dofor((j0;j<n-1-i;j));doif ((arr[j]>arr[j1]));thentemp${arr[j]}arr[j]${arr[j1]}a…...
C# 设计模式(结构型模式):桥接模式
C# 设计模式(结构型模式):桥接模式 在软件设计中,我们经常会遇到系统的变化频繁,或者需要灵活扩展功能的场景。这时,桥接模式(Bridge Pattern)便显得尤为重要。桥接模式是一个结构型…...
RC充电电路仿真与分析
RC充电原理 下图是一个常见的RC充电电路:(假设R10K,C100nF) SW断开时,这个电路处于断路状态,C既没有充电也没有放电;SW闭合时,直流电源5V为电容C充电; 充电时电容两端…...
在 SQL 中获取第m个开始的n条记录方法汇总
在 SQL 中,要获取第m个开始的n条记录,主要取决于你使用的数据库系统和支持的功能。以要获取第10个开始的20条记录为例说明几种常见的方法: 1. 使用 LIMIT 和 OFFSET 适用于 MySQL、PostgreSQL 等支持 LIMIT 的数据库。 SELECT * FROM table…...
Linux 35.6 + JetPack v5.1.4之编译 pytorch
Linux 35.6 JetPack v5.1.4之编译 pytorch 1. 源由2. 折腾3. 构建步骤3.1 下载代码3.2 编译选项3.3 CUDA选项3.4 CUDA路径3.5 版本控制3.6 编译whl 4. 总结5. 参考资料 1. 源由 目前,有很多科研性质的自动导航的开源代码,例如: Linux 35.5…...
docker 部署nginx
1、拉取阿里的nginx镜像: docker pull crpi-k5k93ldwfc7o75ip.cn-hangzhou.personal.cr.aliyuncs.com/list_su/nginx:stable-perl 2、官方nginx镜像: docker pull nginx:stable-perl 3、创建挂载文件目录 mkdir nginx && cd nginx mkdir c…...
深入刨析数据结构之排序(上)
目录 1.内部排序 1.1概述 1.2插入排序 1.2.1其他插入排序 1.2.1.1 折半插入排序 1.2.1.2 2-路插入排序 1.3希尔排序 1.4快速排序 1.4.1起泡排序 1.4.2快速排序 1.4.2.1hoare版本 1.4.2.2挖坑版本 1.4.2.3前后指针版本 1.4.2.4优化版本 1.4.2.4.1小区间插入排序优…...
Java - 日志体系_Apache Commons Logging(JCL)日志接口库_桥接Logback 及 源码分析
文章目录 PreApache CommonsApache Commons ProperLogging (Apache Commons Logging ) JCL 集成logbackPOM依赖配置文件 logback.xml使用 源码分析jcl-over-slf4j 的工作原理1. LogFactory 的实现2. SLF4JLogFactory 和 Log 的实例化过程3. SLF4JLog 和 …...
力扣刷题:栈和队列OJ篇(下)
大家好,这里是小编的博客频道 小编的博客:就爱学编程 很高兴在CSDN这个大家庭与大家相识,希望能在这里与大家共同进步,共同收获更好的自己!!! 目录 1.括号匹配问题(1)题目…...
QT:控件属性及常用控件(1)------核心控件及属性
一个图形化界面上的内容,不需要我们直接从零去实现 QT中已经提供了很多的内置控件: 按钮,文本框,单选按钮,复选按钮,下拉框等等。。。。。 文章目录 1.常用控件属性1.1 enabled1.2 geometry1.2.1 geometry…...
【juc】Lock锁和AQS的继承关系
目录 1. 说明2. Lock接口与AQS的关系2.1 Lock接口2.2 AQS(AbstractQueuedSynchronizer) 3. ReentrantLock与AQS的具体联系3.1 ReentrantLock的实现3.2 AQS在ReentrantLock中的作用 1. 说明 1.Lock锁和AQS(AbstractQueuedSynchronizer&#x…...
自学记录鸿蒙API 13:实现多目标识别Object Detection
起步:什么叫多目标识别? 无论是生活中的动物识别、智能相册中的场景分类,还是工业领域的检测任务,都能看到多目标识别的身影。这次,我决定通过学习HarmonyOS最新的Object Detection API(API 13)…...
BOC调制信号matlab性能仿真分析,对比功率谱,自相关性以及抗干扰性
目录 1.算法运行效果图预览 2.算法运行软件版本 3.部分核心程序 4.算法理论概述 5.算法完整程序工程 1.算法运行效果图预览 (完整程序运行后无水印) 2.算法运行软件版本 matlab2022a 3.部分核心程序 (完整版代码包含详细中文注释和操作步骤视频)…...
C# 事件机制
C# 事件机制详解:从概念到实践 在 C# 中,事件机制是处理对象间通信的重要方式,尤其是在 GUI 应用程序(如 WPF、WinForms)中,事件用于响应用户交互(如按钮点击、鼠标移动等)。本文将…...
使用 Python 实现随机中点位移法生成逼真的裂隙面
使用 Python 实现随机中点位移法生成逼真的裂隙面 一、随机中点位移法简介 1. 什么是随机中点位移法?2. 应用领域 二、 Python 代码实现 1. 导入必要的库2. 函数定义:随机中点位移法核心逻辑3. 设置随机数种子4. 初始化二维裂隙面5. 初始化网格的四个顶点…...
GPT分区 使用parted标准分区划分,以及相邻分区扩容
parted 是一个功能强大的命令行工具,用于创建和管理磁盘分区表和分区。它支持多种分区表类型,如 MBR(msdos)、GPT(GUID Partition Table)等,并且可以处理大容量磁盘。parted 提供了一个交互式界…...
【Triton-ONNX】如何使用 ONNX 模型服务与 Triton 通信执行推理任务上-Triton快速开始
模型部署系列文章 前置-docker 理解:【 0 基础 Docker 极速入门】镜像、容器、常用命令总结前置-http/gRPC 的理解: 【HTTP和gRPC的区别】协议类型/传输效率 /性能等对比【保姆级教程附代码】Pytorch (.pth) 到 TensorRT (.plan) 模型转化全流程【保姆级教程附代码(二)】Pytor…...
问题记录:[FATAL] [1735822984.951119148]: Group ‘manipulator‘ was not found.
前言:最近仿照UR5手眼标定的例程,在新的机械臂上进行手眼标定,还准备用easy_hand手眼标定包。将机器人功能包导入到工作空间后进行编译运行,启动launch文件: roslaunch easy_handeye eye_to_hand_CR7_calibration.lau…...
SpringCloudAlibaba实战入门之Sentinel服务降级和服务熔断(十五)
一、Sentinel概述 1、Sentinel是什么 随着微服务的流行,服务和服务之间的稳定性变得越来越重要。Sentinel 以流量为切入点,从流量控制、熔断降级、系统负载保护等多个维度保护服务的稳定性。 一句话概括:sentinel即Hystrix的替代品,官网: https://sentinelguard.io/zh…...
Scrum中敏捷项目经理(Scrum Master)扮演什么角色?
敏捷开发模式已经逐渐被主流的软件研发团队所接受,其中Scrum是最具代表性的敏捷方法之一。Scrum框架中有三个核心角色:Product Owner(PO)、Scrum Master(SM)和Development Team(DT)。…...
SpringMVC(四)响应
目录 数据处理及跳转 1. 结果跳转方式 ①.ModelAndView ②.ServletAPI 1、通过HttpServletResponse进行输出 2、通过HttpServletResponse实现请求转发 3、通过HttpServletResponse实现重定向 ③.SpringMVC 1.直接输出 2.请求转发 3.重定向 2.ResponseBody响应json数…...
操作系统之文件系统
🧑 博主简介:CSDN博客专家,历代文学网(PC端可以访问:https://literature.sinhy.com/#/literature?__c1000,移动端可微信小程序搜索“历代文学”)总架构师,15年工作经验,…...
Android SPRD 工模测试修改
设备有两颗led灯,工模测试需全亮 vendor/sprd/proprietories-source/factorytest/testitem/led.cpp -13,6 13,10 typedef enum{#define LED_BLUE "/sys/class/leds/blue/brightness"#define LED_RED …...
C语言与操作系统
学习C语言有助于理解计算机底层原理和操作系统的工作方式 C语言自诞生以来,就与计算机底层操作紧密相连。作为一门高级编程语言,C语言提供了对硬件直接控制的能力,同时保留了结构化编程的特性,这使得它成为编写操作系统、编译器和…...
信息安全管理:网络安全
1 网络的定义和特征 1.1 网络的定义 (根本懒得说。。你们自己wiki吧) 网络的用处 What is a network…Devices in a network…LAN, WAN and InternetworksWhat do networks do for you… Sharing resourcesUse/share applications 1.2 网络的特征 Ch…...
python-leetcode-轮转数组
189. 轮转数组 - 力扣(LeetCode) class Solution:def rotate(self, nums: List[int], k: int) -> None:"""Do not return anything, modify nums in-place instead."""n len(nums)k % n # 如果 k 大于 n,…...
Windows上安装Go并配置环境变量(图文步骤)
前言 1. 本文主要讲解的是在windows上安装Go语言的环境和配置环境变量; Go语言版本:1.23.2 Windows版本:win11(win10通用) 下载Go环境 下载go环境:Go下载官网链接(https://golang.google.cn/dl/) 等待…...
【JS】期约的Promise.all()和 Promise.race()区别
概述 Promise.all() 和 Promise.race() 都是 JavaScript 中处理多个异步操作的 Promise 方法,但它们的行为和返回结果有所不同。 Promise.all()和Promise.race() 1. Promise.all() Promise.all() 接受一个由多个 Promise 实例组成的可迭代对象(例如数…...
【Linux】信号处理
一、Linux系统信号 1、常见的系统信号 常见的Linux系统信号 信号值描述1SIGHUP挂起(hang up)进程2SIGINT中断进(interrupt)程3SIGQUIT停止(stop)进程9SIGKILL无条件终止(terminate)…...
Diffusion Transformer(DiT)——将扩散过程中的U-Net换成ViT:近频繁用于视频生成与机器人动作预测(含清华PAD详解)
前言 本文最开始属于此文《视频生成Sora的全面解析:从AI绘画、ViT到ViViT、TECO、DiT、VDT、NaViT等》 但考虑到DiT除了广泛应用于视频生成领域中,在机器人动作预测也被运用的越来越多,加之DiT确实是一个比较大的创新,影响力大&…...
144:vue+leaflet 使用canvas绘制不同方向、不同颜色的模仿船只三角形
作者: 还是大剑师兰特 ,曾为美国某知名大学计算机专业研究生,现为国内GIS领域高级前端工程师,CSDN知名博主,深耕openlayers、leaflet、mapbox、cesium,canvas,echarts等技术开发,欢迎加微信(gis-dajianshi),一起交流。 查看本专栏目录 - 本文是第 144个示例 文章目录…...
c# 快捷键模块
文章目录 命名空间和类类成员静态成员 静态方法GenerateHotkeyIdWndProcGetWindowHandleAndSourceRegisterUnregister 静态方法(外部调用)RegisterHotKey 和 UnRegisterHotKey 委托HotKeyCallbackHandler 枚举HotkeyModifiers 应用示例 using System; us…...
npm install 安装选项 -d -s -g
在使用 npm install 时,-d、-g 和 -s 是不同的选项,它们分别代表不同的安装模式或行为。以下是它们的详细解释: 1. -d:--save-dev 含义:将包安装为开发依赖(devDependencies)。使用场景&#…...