某漫画网站JS逆向反混淆流程分析
文章目录
- 1. 写在前面
- 1. 接口分析
- 2. 反混淆分析
【🏠作者主页】:吴秋霖
【💼作者介绍】:擅长爬虫与JS加密逆向分析!Python领域优质创作者、CSDN博客专家、阿里云博客专家、华为云享专家。一路走来长期坚守并致力于Python与爬虫领域研究与开发工作!
【🌟作者推荐】:对爬虫领域以及JS逆向分析感兴趣的朋友可以关注《爬虫JS逆向实战》《深耕爬虫领域》
未来作者会持续更新所用到、学到、看到的技术知识!包括但不限于:各类验证码突防、爬虫APP与JS逆向分析、RPA自动化、分布式爬虫、Python领域等相关文章
作者声明:文章仅供学习交流与参考!严禁用于任何商业与非法用途!否则由此产生的一切后果均与作者无关!如有侵权,请联系作者本人进行删除!
1. 写在前面
前段时间有几个小伙伴咨询过关于某漫画网站的图片数据如何下载获取,看了一下觉得这个网站蛮适合初学者或者逆向分析爱好者练手的!它涉及到反调试、数据解密、JS反混淆、Cookie反爬虫、TLS指纹的检测
分析目标:
aHR0cHM6Ly93d3cuY29sYW1hbmdhLmNvbS9tYW5nYS1tZjg3NDEyNy8xLzU2Lmh0bWw=
初看时有小伙伴也提出过使用自动化的方式来获取图片链接再下载,但是这个链接是临时的。自动化是可以的,但只能是等待所有服务端下发的图片内容加载完毕渲染呈现到页面后使用截图的方式来获取,如下所示:
1. 接口分析
打开网站准备调试分析之前是有一个反调试的,一般这种大多通过动态生成的函数或代码片段触发!然后过这种反调试的方案是很多的(还有一些大佬开源分享的绝大场景下通杀的方案)如下所示:
这里我们也是可以通过重写构造函数与其原型方法拦截且移除动态生成代码中反调试语句,代码如下所示:
(function () {'use strict';const OriginalFunction = Function;Function = function (...args) {handleDebuggerRemoval(args);logStackTrace("Function");return OriginalFunction(...args);};Function.prototype = OriginalFunction.prototype;Function.prototype.constructor = function (...args) {handleDebuggerRemoval(args);logStackTrace("Function.constructor");return OriginalFunction(...args);};/*** 移除字符串参数中的 "debugger" 语句* @param {Array} args - 参数数组*/function handleDebuggerRemoval(args) {for (let i = 0; i < args.length; i++) {if (typeof args[i] === "string") {args[i] = args[i].replace(/debugger/g, "");}}}function logStackTrace(context) {const stackTrace = new Error().stack;log(`[${context}] Call Stack:`, stackTrace);if (DEBUG?.deb === 0) {debugger;}log(`[${context}] =============== End ===============`);}
})();
过了反调试之后,我们首先去看一下发包的情况。其实初次看的话没有明确的特征告诉我们从哪里下手,只能花点时间来各方面来分析一下,如下所示:
点击可发现这个接口貌似就是图片请求加载的发包(不过注意请求的是.enc.webp)大概率是经过处理的,而且在Cookies中也是添加了某些关键的字段,如下所示:
这里猜测在后续的请求中可能是需要携带这个Cookie参数请求的
这种场景下通过经验来梳理一下流程分析我们可以从网页加载的源码中来开始,它这种实时章节的加载大概率是不断的拼接后续的漫画图来获取资源的!然后在首次请求页面资源的时候肯定有基础的数据或者一些特征可以挖掘的
这里我们过掉反调试之后重方一下页面请求(请求记得过一下TLS检测)并保证Cookie请求的时候携带了__cf__bkm参数,如下所示:
可以看到请求的HTML内容中有一串密文(C_DATA)这个就是需要去解密的,解密后会拿到当前漫画章节中的详情信息JSON数据
2. 反混淆分析
它这个JS代码都是经过混淆的!不要硬看,浪费时间。核心逻辑基本都在custom.js、read.js文件中,先把JS拿下来反混淆静态分析一下!找到解密C_DATA的地方,混淆代码如下所示:
整个这块拿下来先解一下混淆,静态分析就很清晰了。处理解密C_DATA的混淆源码还原之后的JS代码如下所示:
if (__cad.isInReadPage()) {let decryptedData;__cad.useCodeIndex = 1;try {decryptedData = window.devtools.jsd("USJZOHqNw84GoMA9",window.devtools.jsc.enc.Base64.parse(window.C_DATA).toString(window.devtools.jsc.enc.Utf8));if (decryptedData === '') {__cad.useCodeIndex = 2;decryptedData = window.devtools.jsd("c9UPIOaql84fJIoz",window.devtools.jsc.enc.Base64.parse(window.C_DATA).toString(window.devtools.jsc.enc.Utf8));}window.devtools.jse(decryptedData);} catch (error) {__cad.useCodeIndex = 2;decryptedData = window.devtools.jsd("c9UPIOaql84fJIoz",window.devtools.jsc.enc.Base64.parse(window.C_DATA).toString(window.devtools.jsc.enc.Utf8));}window.devtools.jse(decryptedData);const decodedUrls = window.devtools.jsc.enc.Base64.parse(window.image_info.urls__direct).toString(window.devtools.jsc.enc.Utf8);window.__images_yy = decodedUrls.split("|SEPARATER|");window.__specialDisplay = 1;if (!window.image_info.img_type) {window.__specialDisplay = 0;}
}
直接在控制台把进行解密的JS代码执行可以看到明文的C_DATA数据,如下所示:
来!接下来分析一下上面还原之后的JS代码到底做了些什么。首先可以看到入口则是检测是否处于阅读页面,开始对C_DATA密文数据进行解密操作,它这个解密的逻辑基本都是一样的,先尝试使用默认的第一个密钥加B64的解码,数据钥匙解出来没有继续尝试切换使用第二个密钥!最后解密图片的URL信息并分割URL列表,最后的话是设置显示的操作
下面作者根据反混淆之后的JS代码使用Python算法来实现对C_DATA的解密操作,代码实现所示:
import base64
from loguru import logger
from Crypto.Cipher import AES
from Crypto.Util.Padding import unpad
from Crypto.Protocol.KDF import scryptdef base64Decode(base64Str):return base64.b64decode(base64Str).decode('utf-8')def aesDecrypt(encData, key):key_bytes = key.encode('utf-8')cipher = AES.new(key_bytes, AES.MODE_ECB)decrypted = unpad(cipher.decrypt(encData), AES.block_size)return decrypted.decode('utf-8')def jsd(key, encryptedData):decodedData = base64Decode(encryptedData)encData = base64.b64decode(decodedData)return aesDecrypt(encData, key)def decryptCData(c_data):key1 = 'USJZOHqNw84GoMA9'decryptedData = jsd(key1, c_data)logger.info(f"解密数据:{decryptedData}")if __name__ == '__main__':c_data = '' # 密文数据decryptCData(c_data)
这里直接到浏览扣一个加密数据丢进去测试,得到运行如下所示:
通过下面混淆代码调试标记出来的的几处不难发现大致的流程
对混淆的JS代码简单做一下还原可以更加直观有效的帮助分析。__cad[_0x3b6833(0x591)]实则就是一个setCookieValue的操作,通过获取上面JSON数据中的enc_code2跟enc_code1的值来对下面Cookies中的值进行一个解密操作,如下所示:
接下来,针对还原后的JS代码来进行分析,代码如下所示:
let decryptedValue = window.devtools.jsd(_0x447fdd,window.devtools.jsc.enc.Base64.parse(window.mh_info.enc_code2).toString(window.devtools.jsc.enc.Utf8)
);if (decryptedValue === '') {decryptedValue = window.devtools.jsd("RMjidK1Dgv0Ojuhm", window.devtools.jsc.enc.Base64.parse(window.mh_info.enc_code2).toString(window.devtools.jsc.enc.Utf8));
}if (!decryptedValue.startsWith(mh_info.mhid + '/')) {decryptedValue = window.devtools.jsd("RMjidK1Dgv0Ojuhm", window.devtools.jsc.enc.Base64.parse(window.mh_info.enc_code2).toString(window.devtools.jsc.enc.Utf8));
}let cookieOptions = { "expires": 0.005 };
__cad.cookie(_0x29107e, decryptedValue, cookieOptions);let decryptedValue2 = window.devtools.jsd(_0x447fdd,window.devtools.jsc.enc.Base64.parse(window.mh_info.enc_code1).toString(window.devtools.jsc.enc.Utf8)
);if (decryptedValue2 === '') {decryptedValue2 = window.devtools.jsd("HNoYX7fJXcM1PWAK", window.devtools.jsc.enc.Base64.parse(window.mh_info.enc_code1).toString(window.devtools.jsc.enc.Utf8));
}// 转换解密后的值为整数
let valueAsInt = parseInt(decryptedValue2);// 如果转换失败(NaN),再次尝试解密
if (String(valueAsInt) === "NaN") {decryptedValue2 = window.devtools.jsd("HNoYX7fJXcM1PWAK", window.devtools.jsc.enc.Base64.parse(window.mh_info.enc_code1).toString(window.devtools.jsc.enc.Utf8));
}// 存储第二个cookie
let cookieOptions2 = { "expires": 0.005 };
__cad.cookie(_0x3ee2e4, decryptedValue2, cookieOptions2);
通过对上面还原后的JS代码进行静态分析可以发现,初始化的时候是给了一个密钥,然后假设解密是空的,就会使用默认的密钥进行解密!如果解密值不符合预期(不以mh_info.mhid/
开头),则重试解密,enc_code1的流程差不多
接下来我们看一下devtools.jsd的解密算法调用,用的什么
这里我们根据调试以及反混淆后的JS代码还原一下对mh_info参数中的字段解密,加密算法如下所示:
const CryptoJS = require('crypto-js');function aesDecrypt(encData, key) {const parsedKey = CryptoJS.enc.Utf8.parse(key);const decrypted = CryptoJS.AES.decrypt(encData, parsedKey, {mode: CryptoJS.mode.ECB,padding: CryptoJS.pad.Pkcs7});return CryptoJS.enc.Utf8.stringify(decrypted);
}function parseBase64(encodedStr) {return CryptoJS.enc.Base64.parse(encodedStr);
}function decryptProcess(encCode1, encCode2, pageId, mhId) {const key1 = "ZsfOA40m7kWjodMH";const parsedEncCode2 = parseBase64(encCode2).toString(CryptoJS.enc.Utf8);const parsedEncCode1 = parseBase64(encCode1).toString(CryptoJS.enc.Utf8);let decryptedEncCode2;try {decryptedEncCode2 = aesDecrypt(parsedEncCode2, key1);if (!decryptedEncCode2 || !decryptedEncCode2.startsWith(`${mhId}/`)) {decryptedEncCode2 = aesDecrypt(parsedEncCode2, key2);}} catch (e) {decryptedEncCode2 = aesDecrypt(parsedEncCode2, key2);}return {cookie: { key: `_tkb_${pageId}`, value: decryptedEncCode2 },};
}// 测试数据
const mh_info = {"startimg": 1,"enc_code1": "cDJSdkkyUFUzbVZrUXZ1S213TFBuQT09","mhid": "873947","enc_code2": "Q1FrNTVrRGZHZjhQM3dEdkg0cU4vYnVmTU9RWjBWdzMzYmhYSlpyKzM0QjN3cmxFSTdYV1VVWUlXRkNMVHhhNw==","mhname": "捉刀人","pageid": 7557687,"pagename": "56","pageurl": "1/57.html","readmode": 3,"maxpreload": 10,"defaultminline": 1,"domain": "img.colamanga.com","manga_size": "","default_price": 0,"price": 0,"use_server": "","webPath": "/manga-mf874127/"
};const result = decryptProcess(mh_info.enc_code1, mh_info.enc_code2, mh_info.pageid, mh_info.mhid);
console.log(result);
注意一下上面算法解密所使用到的AES密钥是每天都在更新的哈
解决完Cookie生成解密后我们来看最终的图片如何才能去下载的!从前往后分析的话已经拿到了C_DATA数据并解密,通过对解密数据中的Key成功解密获取到Cookie参数,下面就需要知道完整的图片地址,携带Cookie去请求即可,如下继续分析:
图片地址生存获取的JS混淆代码同样需要还原,还原如下所示:
window.getpice = function (pageIndex) {let imageUrl = '';if (!window.image_info.img_type) {let currentLine = window.lines[chapter_id].use_line;let imageIndex = parseInt(window.mh_info.startimg) + pageIndex - 1;let fileName = __cr.PrefixInteger(imageIndex, 4) + ".jpg";if (window.image_info.imgKey != undefined && window.image_info.imgKey !== '') {fileName = __cr.PrefixInteger(imageIndex, 4) + ".enc.webp";}let baseDomain;let sanitizedDomain = currentLine.replace("img.", '');sanitizedDomain = document.domain.replace("www.", '');let cookieValue = __cad.getCookieValue();let pageId = mh_info.pageid;let cookieKey = cookieValue[0] + pageId.toString();let encodedPath = __cad.cookie(cookieKey);if (encodedPath == null) {__cad.setCookieValue();encodedPath = __cad.cookie(cookieKey);}if (mh_info.use_server === '') {baseDomain = `//img.${sanitizedDomain}/comic/${encodeURI(encodedPath)}${fileName}`;} else {baseDomain = `//img${mh_info.use_server}.${sanitizedDomain}/comic/${encodeURI(encodedPath)}${fileName}`;}imageUrl = baseDomain;} else {let imagePath = window.__images_yy[pageIndex - 1];if (window.image_info.img_type === '1') {imageUrl = __cr.switchWebp(imagePath, window.mh_info.manga_size);} else {imageUrl = imagePath;}}return imageUrl;
};
先获取当前章节的线路信息再计算图片序号,根据序号生成图片文件名JPG然后替换它的主域名。其中也进行了一些Cookie的设置操作最终拿到完整图片路径
最后的图片数据则是通过AES解密二进制图片数据,然后就可以直接下载了!_0x1d85d5是密文对象,包含了加密的图片数据,解密的结果_0x5183f2则是图片的二进制数据(WordArray类型)
var key = "KZTC0WwWqyeStZD2";
var _0x5183f2 = window.CryptoJS.AES.decrypt(_0x1d85d5, key, {'iv': window.CryptoJS.enc.Utf8.parse("0000000000000000"),'mode': window.CryptoJS.mode.CBC,'padding': window.CryptoJS.pad.Pkcs7
});
貌似不携带Cookie里面的参数也是可以的,感兴趣的自己尝试
相关文章:
某漫画网站JS逆向反混淆流程分析
文章目录 1. 写在前面1. 接口分析2. 反混淆分析 【🏠作者主页】:吴秋霖 【💼作者介绍】:擅长爬虫与JS加密逆向分析!Python领域优质创作者、CSDN博客专家、阿里云博客专家、华为云享专家。一路走来长期坚守并致力于Pyth…...
React 中事件机制详细介绍:概念与执行流程如何更好的理解
React 的事件机制是一个非常重要的概念,它涉及到 React 如何处理用户的交互事件。React 的事件系统与传统的 DOM 事件系统有所不同,它在底层使用了事件委托和合成事件(Synthetic Events)来优化性能。下面,我们将从 Rea…...
Day04-后端Web基础(Maven基础)
目录 Maven课程内容1. Maven初识1.1 什么是Maven?1.2 Maven的作用1.2.1 依赖管理1.2.2 项目构建1.2.3 统一项目结构 2. Maven概述2.1 Maven介绍2.2 Maven模型2.3 Maven仓库2.4 Maven安装2.4.1 下载2.4.2 安装步骤 3. IDEA集成Maven3.1 配置Maven环境3.1.2 全局设置 3.2 Maven项…...
vue3模板语法+响应式基础
模板语法 1. disabled指令,可以用于禁用按钮 <button :disabled"isButtonDisabled">Button</button> //:disabled是一个指令,用于根据isButtonDisabled的值来动态控制按钮的禁用状态。 使用场景: 1.防止用户重复点击…...
【面试题】简单聊一下什么是云原生、什么是k8s、容器,容器与虚机相比优势
云原生(Cloud Native) 定义:云原生是一种构建和运行应用程序的方法,旨在充分利用云计算的优势。它涵盖了一系列技术和理念,包括容器化、微服务架构、自动化部署与管理等。特点:云原生应用程序被设计为可弹性…...
数据挖掘实训:天气数据分析与机器学习模型构建
随着气候变化对各行各业的影响日益加剧,精准的天气预测已经变得尤为重要。降雨预测在日常生活中尤其关键,例如农业、交通和灾害预警等领域。本文将通过机器学习方法,利用历史天气数据预测明天是否会下雨,具体内容包括数据预处理、…...
STM32如何使用内部晶振作为晶振
目录 前言 首先说明一下芯片内部并没有时钟, 而是内部振荡。使用内部振荡的好处是外部无需设计晶振电路 ,再说的简单点 ,不用外部晶振依然可以让单片机正常运转。 环境: 芯片:STM32F103C8T6 Keil:V5.24…...
【Maui】导航栏样式调整
前言 .NET 多平台应用 UI (.NET MAUI) 是一个跨平台框架,用于使用 C# 和 XAML 创建本机移动和桌面应用。 使用 .NET MAUI,可从单个共享代码库开发可在 Android、iOS、macOS 和 Windows 上运行的应用。 .NET MAUI 是一款开放源代码应用,是 X…...
【黑马程序员三国疫情折线图——json+pyechart=数据可视化】
json数据在文末 将海量的数据处理成我们肉眼可以进行分析的形式,数据的可视化,可以分为两个步骤: 数据处理:利用三方网站厘清json层次格式化,再对文件的读取、检查是否符合JSON规范以及规范化、JSON格式的转化&#…...
如何实现多级缓存?
本文重点说一说在Java应用中,多级缓存如何实现。 多级缓存是比较常见的一种性能优化的手段,一般来说就是本地缓存分布式缓存。 本地缓存一般采用Caffeine和Guava,这两种是性能比较高的本地缓存的框架。他们都提供了缓存的过期、管理等功能。…...
Saas数据库迁移单租户数据
1、背景 租户使用Saas系统,用一段时间后要将系统、数据搬迁到自建服务器。该Saas系统没有按租户分库,且数据库数据量太大,需要将单租户的数据抽取出来。Saas系统使用Mysql5.7数据库,主要使用INFORMATION_SCHEMA.COLUMNS表进行数据…...
LeetCode100之括号生成(22)--Java
1.问题描述 数字 n 代表生成括号的对数,请你设计一个函数,用于能够生成所有可能的并且 有效的 括号组合。 示例1 输入:n 3 输出:["((()))","(()())","(())()","()(())","()()()&qu…...
阿里云ios镜像源
阿里云镜像源:阿里巴巴开源镜像站-OPSX镜像站-阿里云开发者社区 下载centos7...
芯片:为何英伟达的GPU能在AI基础设施领域扮演重要角色?
英伟达的GPU之所以能在AI基础设施领域扮演重要角色,主要源于其硬件架构的优势以及其与深度学习算法的高度兼容性。以下是几个关键因素: 1. 并行计算能力 GPU(图形处理单元)本质上是为处理大量并行计算任务而设计的。与CPU相比&a…...
Linux系统之hostname相关命令基本使用
Linux系统之hostname相关命令基本使用 一、检查本地系统版本二、hostname命令的帮助说明中文帮助说明 三、hostname命令的基本使用1. 查看计算机名2. 查看本机上所有IP地址3. 查看主机FQDN4. 查看短主机名 四、hostnamectl命令的使用1. 查看主机详细信息2. 设置主机名3. hostna…...
Domain Adaptation(李宏毅)机器学习 2023 Spring HW11 (Boss Baseline)
1. 领域适配简介 领域适配是一种迁移学习方法,适用于源领域和目标领域数据分布不同但学习任务相同的情况。具体而言,我们在源领域(通常有大量标注数据)训练一个模型,并希望将其应用于目标领域(通常只有少量或没有标注数据)。然而,由于这两个领域的数据分布不同,模型在…...
在php中,Fiber、Swoole、Swow这3个协程都是如何并行运行的?
文章精选推荐 1 JetBrains Ai assistant 编程工具让你的工作效率翻倍 2 Extra Icons:JetBrains IDE的图标增强神器 3 IDEA插件推荐-SequenceDiagram,自动生成时序图 4 BashSupport Pro 这个ides插件主要是用来干嘛的 ? 5 IDEA必装的插件&…...
SQLite PRAGMA
SQLite的PRAGMA命令是一种特殊的命令,用于在SQLite环境中控制各种环境变量和状态标志。PRAGMA值可以被读取,也可以根据需求进行设置【0†source】。 PRAGMA命令的语法格式如下: 要查询当前的PRAGMA值,只需提供该PRAGMA的名字&am…...
使用python调用JIRA6 REST API及遇到的问题
JIRA认证方式简述 JIRA接口调用有两种认证方式访问Jira Rest API,基本认证⽅式(⽤户名和密码)和OAuth1认证方式。 基本认证⽅式:因为⽤户名和密码会被浏览器重复地请求和发送,即使采⽤ SSL/TLS 发送,也会有安全隐患,…...
基于STM32的智能电表可视化设计:ESP8266、AT指令集、python后端Flask(代码示例)
一、项目概述 随着智能家居的普及,智能电表作为家庭用电管理的重要工具,能够实时监测电流、电压及功率,并将数据传输至后台进行分析和可视化。本项目以STM32C8T6为核心,结合交流电压电流监测模块、ESP8266 Wi-Fi模块、OLED显示屏…...
图片和短信验证码(头条项目-06)
1 图形验证码接口设计 将后端⽣成的图⽚验证码存储在redis数据库2号库。 结构: {img_uuid:0594} 1.1 创建验证码⼦应⽤ $ cd apps $ python ../../manage.py startapp verifications # 注册新应⽤ INSTALLED_APPS [django.contrib.admin,django.contrib.auth,…...
2501,wtl显示html
原文 在MFC程序中有专门封装的CHTMLView来显示超文本文件,如果在对话框中显示网页可用CDHTMLDialog,甚至可实现多页超文本向导风格的对话框,但是在WTL中却没有单独封装超文本的对应控件,这是因为COM组件的使用和编写本来就是ATL的强项,WTL扩展的是ATL欠缺的桌面应用的功能部分…...
嵌入式C语言:什么是指针?
目录 一、指针的基本概念 1.1. 定义指针 1.2. 赋值给指针 1.3. 解引用指针 1.4. 指针运算 1.5. 空指针 1.6. 函数参数 1.7. 数组和指针 1.8. 示例代码 二、指针在内存中的表示 2.1. 内存地址存储 2.2. 内存模型 2.3. 指针与硬件交互 2.4. 示例代码 三 、指针的重…...
解锁 KaiwuDB 数据库工程师,开启进阶之路
解锁 KaiwuDB 数据库工程师试题,开启进阶之路 一、KaiwuDB 数据库全方位洞察 (一)核心特性深度解析 原生分布式架构:摒弃传统集中式存储的局限,KaiwuDB 采用原生分布式架构,将数据分散存于多个节点。这不仅能有效避免单点故障风险,保障数据的高可用性,还能凭借并行处…...
ffmpeg7.0 aac转pcm
#pragma once #define __STDC_CONSTANT_MACROS #define _CRT_SECURE_NO_WARNINGSextern "C" { #include "libavcodec/avcodec.h" }//缓冲区大小(缓存5帧数据) #define AUDIO_INBUF_SIZE 40960 /*name depthu8 8s16 …...
【Pandas】pandas Series rdiv
Pandas2.2 Series Binary operator functions 方法描述Series.add()用于对两个 Series 进行逐元素加法运算Series.sub()用于对两个 Series 进行逐元素减法运算Series.mul()用于对两个 Series 进行逐元素乘法运算Series.div()用于对两个 Series 进行逐元素除法运算Series.true…...
线程安全问题介绍
文章目录 **什么是线程安全?****为什么会出现线程安全问题?****线程安全问题的常见场景****如何解决线程安全问题?**1. **使用锁**2. **使用线程安全的数据结构**3. **原子操作**4. **使用volatile关键字**5. **线程本地存储**6. **避免死锁*…...
为AI聊天工具添加一个知识系统 之27 支持边缘计算设备的资源存储库及管理器
本文问题 现在我们回到 ONE/TWO/TREE 的资源存储库 的设计--用来指导 足以 支持 本项目(为AI聊天工具增加一套知识系统)的 核心能力 “语言处理” 中 最高难度系数的“自然语言处理” 中最具挑战性的“含糊性” 问题的解决。--因为足以解决 自然语言中最…...
初识verilog HDL
为什么选择用Verilog HDL开发FPGA??? 硬件描述语言(Hardware Descriptipon Lagnuage,HDL)通过硬件的方式来产生与之对应的真实的硬件电路,最终实现所设计的预期功能,其设计方法与软件…...
VS2015 + OpenCV + OnnxRuntime-Cpp + YOLOv8 部署
近期有个工作需求是进行 YOLOv8 模型的 C 部署,部署环境如下 系统:WindowsIDE:VS2015语言:COpenCV 4.5.0OnnxRuntime 1.15.1 0. 预训练模型保存为 .onnx 格式 假设已经有使用 ultralytics 库训练并保存为 .pt 格式的 YOLOv8 模型…...
做网站需要多少钱 做/东莞网站关键词优化排名
android西部牛仔横版跑酷冒险游戏源码Cowboy Runner,包含Buildbox和dEclipse工程文件,项目基于buildbox 2.2.8开发,支持关卡解锁和无限两种模式,兼容手机和平板电脑,支持AdMob广告,带声音开关、动画菜单、复…...
泰安北京网站建设/seo推广是做什么的
ikvmc 将 Java 字节码转换成 .NET dll 文件或是 .exe 文件。 本文内容 用法选项备注 例子用法 ikvmc [ options ] classOrJarfile [ classOrJarfile ... ] 其中, options 将在下面介绍。classOrJarfile 是 Java .class 文件或 jar 文件,可以包含通配符&…...
网站建设合同法/百度站长工具app
今天来聊一个面试中经常会被问到的问题,咱们一起必须把这个问题搞懂。 问题:spring 中为什么需要用三级缓存来解决这个问题?用二级缓存可以么? 我先给出答案:不可用。 这里先声明下: 本文未指明 bean scope…...
iis配置网站是什么/互联网营销具体做什么
一、下列命令可以用来操纵进程任务: ps列出系统中正在运行的进程。 kill发送信号给一个或多个进程(经常用来杀死一个进程)。 jobs列出当前shell环境中已启动的任务状态,若未指定jobsid,则显示所有活动的任务状态信息&a…...
廊坊做网站哪家好/必应搜索引擎地址
一 背景 最近在园子了浏览了几篇有关Socket文章,得到了一些启发萌生了想要重构公司在2000年用.NET Framework 2.0 与 Visual Studio 2005开发的AsySocket项目为了希望能够尽快的了解公司这个项目,Google了很多国内外的网站让我对Socket有了更深层次的了解…...
怎么自己做歌曲网站/石家庄抖音seo
来源:广东自然资源8月29日是第17个全国测绘法宣传日,广东省自然资源厅全面开展测绘法宣传日暨国家版图意识宣传周活动。通过一系列主题活动,宣传倡导正确使用地图,呼吁公众“规范使用地图 一点都不能错”(☞ 具体内容,…...