逆向案例二十九——复杂扣代码,七某数据(一)

网址:aHR0cHM6Ly93d3cucWltYWkuY24vcmFuaw==

抓包分析载荷中有加密参数analysis:

获取数据代码,经过分析,发现analysis确实是校验参数cai:

import requestscookies = {'qm_check': 'A1sdRUIQChtxen8pI0dAMRcOUFseEHBeQF0JTjVBWCwycRd1QlhAXFEGFUdeSklaHQdKAAkABAsgJ1dBWD0TR1JRRAp0BQlFEBQ3TSZKFUdBbwxvBBRFIlQsSUhTFxsQU1FVV1NHXEVYVElWBRsCHAkSSQ%3D%3D','gr_user_id': '7b300ae1-1a2e-48f3-ac26-ef24f571d4c9','USERINFO': 'jHFy6VITNfYjO5gzKnxVCcHVKhkUrDYQL4rEoi%2Bu%2Fa3gWGxj5dQDgJzrkKFOU6FOm%2F4%2FLH%2BKRQ6Kkezd22166yCiZ%2FlYWomlIfHgN40yWpgrHONQD7IehPC71gALl3B5eweCfpHISDgX3EvMl7rYBQ%3D%3D','ada35577182650f1_gr_last_sent_cs1': 'qm21331348315','aso_ucenter': 'c0160lkfZZ3b6mCL6Ic%2FE9rfux%2FFzvScbLXxY1aeQwexSd5FHwlCTHtQXpRw3BnZag8','AUTHKEY': 'kieguXDTNdsivnTuTu%2FDz8rEJtxANQ3H4WyYIrC6WalwuS0e3QcGe2ynYUWdRmasuVvmGU65IVQ%2BOjFG4DNkWj%2BcAjh7wM9GbQyPulS5nrkz5m8CC7qAYQ%3D%3D','synct': '1714182214.703','syncd': '-138','PHPSESSID': '1g4mb7ol6ddoiej2h7rak6eh0k','ada35577182650f1_gr_session_id': '5b1ab32f-3236-4628-b301-aea7dcc57299','ada35577182650f1_gr_last_sent_sid_with_cs1': '5b1ab32f-3236-4628-b301-aea7dcc57299','ada35577182650f1_gr_cs1': 'qm21331348315','ada35577182650f1_gr_session_id_sent_vst': '5b1ab32f-3236-4628-b301-aea7dcc57299',
}headers = {'authority': 'api.qimai.cn','accept': 'application/json, text/plain, */*','accept-language': 'zh-CN,zh;q=0.9','cache-control': 'no-cache',# 'cookie': 'qm_check=A1sdRUIQChtxen8pI0dAMRcOUFseEHBeQF0JTjVBWCwycRd1QlhAXFEGFUdeSklaHQdKAAkABAsgJ1dBWD0TR1JRRAp0BQlFEBQ3TSZKFUdBbwxvBBRFIlQsSUhTFxsQU1FVV1NHXEVYVElWBRsCHAkSSQ%3D%3D; gr_user_id=7b300ae1-1a2e-48f3-ac26-ef24f571d4c9; USERINFO=jHFy6VITNfYjO5gzKnxVCcHVKhkUrDYQL4rEoi%2Bu%2Fa3gWGxj5dQDgJzrkKFOU6FOm%2F4%2FLH%2BKRQ6Kkezd22166yCiZ%2FlYWomlIfHgN40yWpgrHONQD7IehPC71gALl3B5eweCfpHISDgX3EvMl7rYBQ%3D%3D; ada35577182650f1_gr_last_sent_cs1=qm21331348315; aso_ucenter=c0160lkfZZ3b6mCL6Ic%2FE9rfux%2FFzvScbLXxY1aeQwexSd5FHwlCTHtQXpRw3BnZag8; AUTHKEY=kieguXDTNdsivnTuTu%2FDz8rEJtxANQ3H4WyYIrC6WalwuS0e3QcGe2ynYUWdRmasuVvmGU65IVQ%2BOjFG4DNkWj%2BcAjh7wM9GbQyPulS5nrkz5m8CC7qAYQ%3D%3D; synct=1714182214.703; syncd=-138; PHPSESSID=1g4mb7ol6ddoiej2h7rak6eh0k; ada35577182650f1_gr_session_id=5b1ab32f-3236-4628-b301-aea7dcc57299; ada35577182650f1_gr_last_sent_sid_with_cs1=5b1ab32f-3236-4628-b301-aea7dcc57299; ada35577182650f1_gr_cs1=qm21331348315; ada35577182650f1_gr_session_id_sent_vst=5b1ab32f-3236-4628-b301-aea7dcc57299','origin': 'https://www.qimai.cn','pragma': 'no-cache','sec-ch-ua': '"Not_A Brand";v="8", "Chromium";v="120", "Google Chrome";v="120"','sec-ch-ua-mobile': '?0','sec-ch-ua-platform': '"Windows"','sec-fetch-dest': 'empty','sec-fetch-mode': 'cors','sec-fetch-site': 'same-site','user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36',
}params = {'analysis': 'ew8nHiY7SQ17cgcaKht0BCtUIRsaPjRAUG8hCwMLAwkmREcKGBReHl4NAARBZgkTFEcaCxtbVWgKAE4JdkZTVVFNQUgHAQNQUSEaBQ==','brand': 'all','country': 'cn','device': 'iphone','genre': '36','date': '2024-04-27','page': '7',
}response = requests.get('https://api.qimai.cn/rank/indexPlus/brand_id/0', params=params, cookies=cookies, headers=headers)

采取搜索方法,发现搜不到,果断跟栈

分析栈,发现还有异步栈,点击第一个,开始send

发现v中有加密参数

直接跳过exports栈。从l.requests开始,遇到熟悉的n.then,打赏断点

进入第一个函数

打上断点,此时t中没有加密内容,那么肯定是在后面有加密,可能是函数后面,也可能是t中别的

在下方打上断点,嘿嘿,发现此时有了加密参数,添加到了url中,故肯定是里面某组函数进行了加密。这段代码明显是混淆代码。

 加密生成函数,e = (0,i[jt])((0, i[qt])(a, d)) ,又是i,又是a,又是d,所以先整体复制try里面的代码,在做删减。声明get_analysis函数,接收整个复制内容。

t = {"url": "/rank/indexPlus/brand_id/0","method": "get","headers": {"common": {"Accept": "application/json, text/plain, */*"},"delete": {},"get": {},"head": {},"post": {"Content-Type": "application/x-www-form-urlencoded"},"put": {"Content-Type": "application/x-www-form-urlencoded"},"patch": {"Content-Type": "application/x-www-form-urlencoded"}},"params": {"brand": "all","country": "cn","device": "iphone","genre": "36","date": "2024-04-27","page": 2},"baseURL": "https://api.qimai.cn","transformRequest": [null],"transformResponse": [null],"timeout": 15000,"withCredentials": true,"xsrfCookieName": "XSRF-TOKEN","xsrfHeaderName": "X-XSRF-TOKEN","maxContentLength": -1,"maxBodyLength": -1
}
function get_analysis(t) {var n;f || F != s || (n = (0,i[Wt])(m),s = c[x][k][Pt] = -(0,i[Wt])(l) || +new z[W] - a2 * n);var e, r = +new z[W] - (s || H) - 1661224081041, a = [];void 0 === t[Zt] && (t[Zt] = {})z[Z][i7](t[Zt])[M](function (n) {if (n == p)return !B;t[Zt][N2](n) && a[b](t[Zt][n])})a = a[Ot]()[I1](_)a = (0, i[jt])(a),a = (a += v + t[Jt][T](t[Mt], _)) + (v + r) + (v + 3),e = (0, i[jt])((0, i[qt])(a, d))return e}

要获得传入的参数,先放掉后面的断点

复制传入的t

现在逐行分析代码:

1.f || F != s || (n = (0, i[Wt])(m), s = c[x][k][Pt] = -(0, i[Wt])(l) || +new z[W] - a2 * n);

在提供的代码中,没有显式使用三元运算符。但是,可以通过逻辑运算符 || 和赋值语句来模拟三元运算符的功能。JavaScript 中的 || 运算符用于逻辑或操作,如果第一个操作数为真,则返回第一个操作数,否则返回第二个操作数。返回第一个被判断为真值的操作数

var a = 0;
var b = 10;
var c = 20;var result = a || b || c;
console.log(result); // 输出:10

在这个例子中,a 是假值,所以继续检查下一个操作数 b。因为 b 是真值,所以返回 b 的值 10

在上面的页面中,F != s 这个判断为真,f为假,因此整个代码返回F != s这个判断,因此没什么用,直接删除即可。

2.var e, r = +new z[W] - (s || H) - 1661224081041, a = [];

这明显是个混淆,我们可以在浏览器中查看混淆前是什么,从而替换一些自带的函数

z[W]是Date函数

s与H不知道怎么来的,先写成固定值 

3.void 0 === t[Zt] && (t[Zt] = {})

这段代码使用了 void 运算符,=== 严格相等运算符以及逻辑与 && 运算符。让我们一步步解释:

  • void 0: void 运算符用于生成 undefined 值。在这里,它将 undefinedt[Zt] 进行比较。
  • ===: 严格相等运算符用于比较两个值是否相等且类型相同。
  • t[Zt]: 这似乎是一个变量或对象的属性。它的值将与 undefined 进行比较。
  • &&: 逻辑与运算符用于将两个表达式连接起来,并且只有在第一个表达式为真时才会执行第二个表达式。

因此,整个表达式的含义是:如果 t[Zt] 的值严格等于 undefined,则将 t[Zt] 设置为空对象 {}

这种方式通常用于确保对象属性的存在,如果属性不存在,则进行初始化,以避免后续访问该属性时出现错误。是个判断的东西,删掉无用。

4.z[Z][i7](t[Zt])[M](function (n) { if (n == p) return !B; t[Zt][N2](n) && a[b](t[Zt][n]) })

很多逆向,我们可以在浏览器中还原。大Z是pychram中自带的object,然后是对象中的key方法,t[Zt]是传入的t字典中所带的params参数。M是forEach方法

改成下面这样 

Object.keys(t.params).forEach()

继续改写

if (n == "analysis")return false;t.params.hasOwnProperty(n) && a.push(t.params[n])

5.a = a[Ot]()[I1](_)

改写

a = a.sort().join('')

目前尝试打断点调试一下,发现a与浏览器中是一致的

6.   a = (0, i[jt])(a)

花指令,其实就是a=i[jt](a)

在页面中去找函数[jt]位置,并复制代码,将函数命名为i_jt发现也是高度混淆,且不知道里面有没有调用其他函数

7.对v函数的混淆作还原t = z[V1](t)[T](/%([0-9A-F]{2})/g, function(n, t)

t = encodeURIComponent(t).replace(/%([0-9A-F]{2})/g, function (n, t)
return o(Y1 + t),现在要找O函数所在的位置

对o方法,解混淆

还原后代码:

function o(n) {t = "",['66', '72', '6f', '6d', '43', '68', '61', '72', '43', '6f', '64', '65'].forEach(function(n) {t += unescape('%u00' + n)});var t, e = t;return String[e](n)};

8.还原了o函数之后,回到i_jt函数 return o(Y1 + t)

将Y1替换为0x

   t = encodeURIComponent(t).replace(/%([0-9A-F]{2})/g, function (n, t) {return o('0x' + t)

接着是下面的代码进行分析 

try {return z[Q1](t)
} catch (n) {return z[W1][K1](t)[U1](Z1)
}异常捕获,不用管异常部分

故只用对这行代码解混淆,return z[Q1](t)

 return btoa(t)

目前的代码:

t = {"url": "/rank/indexPlus/brand_id/0","method": "get","headers": {"common": {"Accept": "application/json, text/plain, */*"},"delete": {},"get": {},"head": {},"post": {"Content-Type": "application/x-www-form-urlencoded"},"put": {"Content-Type": "application/x-www-form-urlencoded"},"patch": {"Content-Type": "application/x-www-form-urlencoded"}},"params": {"brand": "all","country": "cn","device": "iphone","genre": "36","date": "2024-04-27","page": 2},"baseURL": "https://api.qimai.cn","transformRequest": [null],"transformResponse": [null],"timeout": 15000,"withCredentials": true,"xsrfCookieName": "XSRF-TOKEN","xsrfHeaderName": "X-XSRF-TOKEN","maxContentLength": -1,"maxBodyLength": -1
}
var s = 238;
var H = 0;
function o(n) {t = "",['66', '72', '6f', '6d', '43', '68', '61', '72', '43', '6f', '64', '65'].forEach(function(n) {t += unescape('%u00' + n)});var t, e = t;return String[e](n)};
function i_jt(t) {t = encodeURIComponent(t).replace(/%([0-9A-F]{2})/g, function (n, t) {return o('0x' + t)});return btoa(t)};function get_analysis(t) {var n;var e, r = +new Date - (s || H) - 1661224081041, a = [];Object.keys(t.params).forEach(function (n) {if (n == "analysis")return false;t.params.hasOwnProperty(n) && a.push(t.params[n])})a = a.sort().join('')a = i_jt(a)a = (a += v + t[Jt][T](t[Mt], _)) + (v + r) + (v + 3),e = (0, i[jt])((0, i[qt])(a, d))return e
}console.log(get_analysis(t))

debugger结果a的值

浏览器中结果是一致的,对于a的值

9.回到最开始的函数,a = (a += v + t[Jt][T](t[Mt], _)) + (v + r) + (v + 3)

var v='@#';
a = (a += v + t.url.replace(t.baseURL, '')) + (v + r) + (v + 3)

10.e = (0, i[jt])((0,i[qt])(a, d)) 

可以改写成e = i_jt(i[qt](a, d)) 

所以现在要找i[qt]a和d

进入i[qt],发现是一个h方法,在这里打上断点,并复制。将函数名改为i_qt。

function i_qt(n, t) {t = t || u();for (var e = (n = n[$1](_))[R], r = t[R], a = q1, i = H; i < e; i++)n[i] = o(n[i][a](H) ^ t[(i + 10) % r][a](H));return n[I1](_)};

逐行分析i_qt代码

t = t || u();但凡t有值,t就是t,所以代码无意义哦,省略。

解混淆for (var e = (n = n[$1](_))[R], r = t[R], a = q1, i = H; i < e; i++)

 for (var e = (n = n.split('')).length, r = t.length, a = "charCodeAt", i = H; i < e; i++)

解混淆  n[i] = o(n[i][a](H) ^ t[(i + 10) % r][a](H))

return n[I1](_)

其中o是已经定义过的

      n[i] = o(n[i][a](H) ^ t[(i + 10) % r][a](H));return n.join('')

完整i_qt方法

function i_qt(n, t) {for (var e = (n = n.split('')).length, r = t.length, a = "charCodeAt", i = H; i < e; i++)n[i] = o(n[i][a](H) ^ t[(i + 10) % r][a](H));return n.join('')};

11.回到最开始的函数

a = (a += v + t.url.replace(t.baseURL, '')) + (v + r) + (v + 3)
e = i_jt((i_qt(a, d))

现在缺少d,需要知道d的值

e = i_jt((i_qt(a, 'xyz517cda96efgh'))

最终代码呈现:

t = {"url": "/rank/indexPlus/brand_id/0","method": "get","headers": {"common": {"Accept": "application/json, text/plain, */*"},"delete": {},"get": {},"head": {},"post": {"Content-Type": "application/x-www-form-urlencoded"},"put": {"Content-Type": "application/x-www-form-urlencoded"},"patch": {"Content-Type": "application/x-www-form-urlencoded"}},"params": {"brand": "all","country": "cn","device": "iphone","genre": "36","date": "2024-04-27","page": 2},"baseURL": "https://api.qimai.cn","transformRequest": [null],"transformResponse": [null],"timeout": 15000,"withCredentials": true,"xsrfCookieName": "XSRF-TOKEN","xsrfHeaderName": "X-XSRF-TOKEN","maxContentLength": -1,"maxBodyLength": -1
}
var s = 238;
var H = 0;
var v = '@#';function i_qt(n, t) {for (var e = (n = n.split('')).length, r = t.length, a = "charCodeAt", i = H; i < e; i++)n[i] = o(n[i][a](H) ^ t[(i + 10) % r][a](H));return n.join('')
};function o(n) {t = "",['66', '72', '6f', '6d', '43', '68', '61', '72', '43', '6f', '64', '65'].forEach(function (n) {t += unescape('%u00' + n)});var t, e = t;return String[e](n)
};function i_jt(t) {t = encodeURIComponent(t).replace(/%([0-9A-F]{2})/g, function (n, t) {return o('0x' + t)});return btoa(t)};function get_analysis(t) {var n;var e, r = +new Date - (s || H) - 1661224081041, a = [];Object.keys(t.params).forEach(function (n) {if (n == "analysis")return false;t.params.hasOwnProperty(n) && a.push(t.params[n])})a = a.sort().join('')a = i_jt(a)a = (a += v + t.url.replace(t.baseURL, '')) + (v + r) + (v + 3)e = i_jt(i_qt(a, 'xyz517cda96efgh'))return e
}console.log(get_analysis(t))

最终结果展现:

实际上,函数只用到了t.params,t.url和t.baseURL,将其他的参数删除。

t = {"url": "/rank/indexPlus/brand_id/0","params": {"brand": "all","country": "cn","device": "iphone","genre": "36","date": "2024-04-27","page": 2},"baseURL": "https://api.qimai.cn",
}

我么希望是python传入这个参数,由js代码加密,然后返回python加密结果。 

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

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

相关文章

31.Gateway网关-跨域问题

跨域 1.域名不同&#xff1a;www.baidu.com和www.taobao.com,www.taobao.org 2.域名相同&#xff0c;端口不同。localhost:8080和localhost:8081 跨域问题 浏览器禁止请求的发起者与服务端发生跨域ajax请求&#xff0c;请求被浏览器拦截的问题。 解决方案 CORS 浏览器询…

安全开发实战(2)---域名反查IP

目录 安全开发专栏 前言 域名与ip的关系 域名反查ip的作用 1.2.1 One 1.2.2 Two 1.2.3 批量监测 ​总结 安全开发专栏 安全开发实战http://t.csdnimg.cn/25N7H 这步是比较关键的一步,一般进行cdn监测后,获取到真实ip地址后,或是域名时,然后进行域名反查IP地址,进行进…

PySide6 GUI 学习笔记——Python文件编译打包

前面编写的软件工具都必须运行在Python环境中&#xff0c;且通过命令行的方式运行&#xff0c;通过Python打包工具&#xff0c;我们可以把.py文件封装成对应平台的运行文件&#xff0c;供用户执行。 常见Python打包工具 工具简介官网/文档地址py2exe将Python脚本转换为Window…

速卖通自养号测评:如何规避安全风险?

对于初涉电商领域的新卖家而言&#xff0c;进行销量测评显得尤为关键。由于速卖通新店铺往往难以获得平台活动的支持&#xff0c;流量也相对匮乏&#xff0c;因此&#xff0c;开店的首要任务便是进行测评&#xff0c;通过积累一定的评论和销售数据。 测评的益处颇多&#xff0…

【大语言模型LLM】- Meta开源推出的新一代大语言模型 Llama 3

&#x1f525;博客主页&#xff1a;西瓜WiFi &#x1f3a5;系列专栏&#xff1a;《大语言模型》 很多非常有趣的模型&#xff0c;值得收藏&#xff0c;满足大家的收集癖&#xff01; 如果觉得有用&#xff0c;请三连&#x1f44d;⭐❤️&#xff0c;谢谢&#xff01; 长期不…

Unity对应的c#版本

本文主要是记录一下unity已经开始兼容c#的版本和.net版本&#xff0c;以便更好的利用c#的特性。 c#和.net对应情况 微软已经将.net开发到.net 9了&#xff0c;但是unity的迭代速度远没有c#迭代速度快&#xff0c;已知unity最新的LTS版本unity2023已经兼容了c#9 可以在unity手册…

【深度学习】yolo-World,数据标注,zeroshot,目标检测

仓库&#xff1a;https://github.com/AILab-CVC/YOLO-World 下载权重&#xff1a; 仓库下载和环境设置 下载仓库&#xff1a;使用以下命令从 GitHub 上克隆仓库&#xff1a; git clone --recursive https://github.com/AILab-CVC/YOLO-World.git创建并激活环境&#xff1a…

网络安全新挑战:通用人工智能(AGI)等级保护指南

通用人工智能&#xff08;AGI&#xff09;的发展现状及趋势 随着2023年大语言模型应用的划时代突破&#xff0c;以ChatGPT为杰出代表的此类技术犹如一股洪流&#xff0c;彻底颠覆了人类与机器智能交互的疆界&#xff0c;引领通用人工智能&#xff08;AGI&#xff09;步入一个崭…

【继承和多态】

闭上眼睛&#xff0c;什么都不听.............................................................................................................. 文章目录 前言 一、【继承】 1.1【继承的概念】 1.2【 继承的定义】 1.2.1【定义格式】 1.2.2【继承关系和访问限定符】 1.2…

回归预测 | Matlab实现SA-BP模拟退火算法优化BP神经网络多变量回归预测

回归预测 | Matlab实现SA-BP模拟退火算法优化BP神经网络多变量回归预测 目录 回归预测 | Matlab实现SA-BP模拟退火算法优化BP神经网络多变量回归预测预测效果基本描述程序设计参考资料 预测效果 基本描述 1.Matlab实现SA-BP模拟退火算法优化BP神经网络多变量回归预测&#xff0…

OGG extract进程占据大量虚拟内存导致服务器内存异常增长分析

现象 oracle服务器一节点内存&#xff0c;一个月来持续升高&#xff0c;近一月上涨10%左右。 问题分析 OS内存使用情况 使用内存最大的10个进程如下&#xff0c;PID为279417占用最大的内存。 查询279417&#xff0c;发现是ogg相关进程。 发现ogg的extract进程占用了大量的虚拟内…

27 - 数据传送指令

---- 整理自B站UP主 踌躇月光 的视频 文章目录 1. CPU 电路2. 数据传送指令的几种情况3. 实验工程4. 实验结果 1. CPU 电路 2. 数据传送指令的几种情况 # program.asm; 1. ; MOV A, 5;; 2. ; MOV A, B;; 3. ; MOV A, [5];; 4. ; MOV B, 6 ; MOV A, [B]; 5. ; MOV [0x2f], 5;; …

Apache RocketMQ ACL 2.0 全新升级

作者&#xff1a;徒钟 引言 RocketMQ 作为一款流行的分布式消息中间件&#xff0c;被广泛应用于各种大型分布式系统和微服务中&#xff0c;承担着异步通信、系统解耦、削峰填谷和消息通知等重要的角色。随着技术的演进和业务规模的扩大&#xff0c;安全相关的挑战日益突出&am…

为AI电脑生态注入强悍动力,安耐美PlatiGemini 1200W高性能电源

在DIY攒机的过程中&#xff0c;电源是非常重要的一环&#xff0c;现在高性能的硬件功耗往往很高&#xff0c;因此一款优秀的电源整个系统稳定运行的基石。最近&#xff0c;我发现一款由安耐美&#xff08;Enermax&#xff09;推出的PlatiGemini 1200W电源&#xff0c;它不仅满足…

云原生Kubernetes: K8S 1.29版本 部署ingress-nginx

目录 一、实验 1.环境 2. K8S 1.29版本 部署ingress-nginx 二、问题 1.kubectl 如何强制删除 Pod、Namespace 资源 2.创建pod失败 3.pod报错ImagePullBackOff 4.docker如何将镜像上传到官方仓库 5.创建ingress报错 一、实验 1.环境 &#xff08;1&#xff09;主机 表…

springboot如何使用RedisTemplate

第一步&#xff1a;创建一个spring boot项目 第二步&#xff1a;pom导入redis相关依赖 <!--reids依赖--> <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId> </depen…

微信小程序:12.页面导航

什么是页面导航 页面导航指的是页面之间的相互跳转。例如&#xff0c;浏览器中实现的页面导航的方式有两种&#xff1a; 连接location.href 小程序中实现页面导航的两种方式 声明式导航 在页面上声明一个导航组件 通过点击组件实现页面跳转 导航TabBar页面 是指配置TabB…

LM2576D2TR4-5G 3.0安15伏降压开关稳压器 PDF中文资料_参数_引脚图

LM2576D2TR4-5G 规格信息&#xff1a; 制造商:ON Semiconductor 产品种类:开关稳压器 RoHS:是 装置风格:SMD/SMT 封装 / 箱体:TO-263-5 输出电压:5 V 输出电流:3 A 输出端数量:1 Output 最大输入电压:45 V 拓扑结构:Buck 最小输入电压:7 V 开关频率:52 kHz 最小工作…

AndroidStudio中虚拟机(AVD)无法启动,出现unable to locate adb错误

1.检查Android SDK Platform-Tools是否安装(个人是通过这个方法解决的) 首先通过File-Project Structure-Project SDK检查SDK有没有被选中 步骤&#xff1a;打开file -> settings &#xff0c;搜索SDK 之后点击"-",在点击Apply进行安装 2.可能是驱动的问题 电脑…

Mudem,打造私密安全、高效稳定的私人空间

Mudem 是 Codigger 平台中的一个关键组件&#xff0c;它提供基础通讯服务&#xff0c;确保不同类型的机器之间可以进行安全和高效的连接。它其设计理念在于将本地机器、公有云以及私有云上的设备无缝地整合为一个可远程在线访问的工作站&#xff08;Workstation&#xff09;。这…