当前位置: 首页 > article >正文

[KCTF]CORE CrackMe v2.0

这个Reverse比较古老,已经有20多年了,但难度确实不小。

先查壳

upx压缩壳,0.72,废弃版本,工具无法解压。

反正不用IDA进行调试,直接x32dbg中,dump内存,保存后拖入IDA。

这里说一下,网上常规的脱壳都是OEP->dump->IAT表修复等步骤,如果不需要在IDA中进行调试,直接dump内存,就可以IDA分析静态代码,伪代码都是正常的。

int __usercall sub_4020A0@<eax>(int a1@<ecx>, int a2@<ebx>, int a3@<edi>, int a4@<esi>)
{int v4; // eaxchar *i; // ecxint v6; // ebxchar *v7; // ediint v8; // eaxint v9; // esiint v10; // eaxchar *j; // ecxint v12; // ebxint v14; // eaxchar v15[100]; // [esp+8Ch] [ebp-66Ch] BYREFchar v16[500]; // [esp+F0h] [ebp-608h] BYREFchar v17[500]; // [esp+2E4h] [ebp-414h] BYREFchar v18[500]; // [esp+4D8h] [ebp-220h] BYREFint v19; // [esp+6CCh] [ebp-2Ch] BYREFint v20; // [esp+6D0h] [ebp-28h] BYREFint v21; // [esp+6D4h] [ebp-24h] BYREF_DWORD v22[4]; // [esp+6D8h] [ebp-20h] BYREFchar v23[4]; // [esp+6E8h] [ebp-10h] BYREFchar v24[4]; // [esp+6ECh] [ebp-Ch] BYREFchar v25[4]; // [esp+6F0h] [ebp-8h] BYREFint v26; // [esp+6F4h] [ebp-4h]v26 = a1;if ( (unsigned int)dword_417158(a2, a4, a3) >= 0x80000000 )dword_4171D0(v15, aSoftwareMicros_0);elsedword_4171D0(v15, aSoftwareMicros);memset(v16, 0, sizeof(v16));memset(v17, 0, sizeof(v17));memset(v18, 0, sizeof(v18));sub_412706((_DWORD *)(v26 + 0x5C), (int)v16, 100);// 获取namesub_412706((_DWORD *)(v26 + 0xAC), (int)v17, 100);// codestrcpy(v18, v16);sub_408D70(v18);                              // 逆序strcat(v16, v18);dword_41700C(0x80000002, v15, &v19);v20 = 1;v21 = 256;dword_417008(v19, dword_422480, 0, &v20, v18, &v21);strcat(v16, v18);v20 = 1;v21 = 256;dword_417008(v19, dword_4224A0, 0, &v20, v18, &v21);strcat(v16, v18);v4 = 0;for ( i = v16; *i; ++v4 )++i;v6 = v4;sub_4014E0(v22);v7 = &v16[v6];*(_DWORD *)v7 = 0;*((_DWORD *)v7 + 1) = 0;*((_DWORD *)v7 + 2) = 0;*((_DWORD *)v7 + 3) = 0;*((_DWORD *)v7 + 4) = 0;*((_DWORD *)v7 + 5) = 0;*((_DWORD *)v7 + 6) = 0;*((_DWORD *)v7 + 7) = 0;*((_DWORD *)v7 + 8) = 0;*((_DWORD *)v7 + 9) = 0;*((_DWORD *)v7 + 10) = 0;*((_DWORD *)v7 + 11) = 0;*((_DWORD *)v7 + 12) = 0;*((_DWORD *)v7 + 13) = 0;*((_DWORD *)v7 + 14) = 0;*((_DWORD *)v7 + 15) = 0;*((_DWORD *)v7 + 16) = 0;*((_DWORD *)v7 + 17) = 0;*((_DWORD *)v7 + 18) = 0;v7[76] = 0;v7[77] = 0;v7[78] = 0;v16[v6] = 0x80;v8 = 64 - (((_BYTE)v6 + 1) & 0x3F);if ( v8 <= 7 )v8 = 128 - (((_BYTE)v6 + 1) & 0x3F);v9 = v8 + v6 + 1;v10 = 0;for ( j = v16; *j; ++v10 )++j;v12 = 0;for ( *(_DWORD *)&v16[v9 - 8] = 8 * v10; v12 < v9; v12 += 64 )sub_401500((int)&v16[v12], v22);if ( sub_404797((int)v17, (unsigned __int8 *)"%lx%lx%lx", v23, v24, v25) != 3 )// sscanfreturn sub_4115A6(aHmmmYouDonTEve, aFailed, 48);// MessageBoxsub_401AD0((int *)v23, dword_41C2C0, dword_41C3C0);sub_401AD0((int *)v24, dword_41C4C0, dword_41C5C0);v14 = -3;while ( *(&v26 + v14) == v22[v14 + 3] ){if ( !++v14 )return sub_4115A6(aManYouReGoodEn, aWelcome, 64);// MessageBox}return sub_4115A6(aBetterLuckNext, aFailed, 48);// MessageBox
}

代码不多,整体逻辑并不复杂,首先获取name和code,然后name反转(指定的name是KCTF,反转就是FTCK),反转后的name拼接3次,再拼接原始name,最后组成FTCKFTCKFTCKKCTF,再调用sub_401500进行魔改hash计算,hash值是不可逆的,算code也不需要完全复现hash算法,根据调试,KCTF为用户名,得到的hash值是0D15B8BA2C8F30576BD8A9AEC0C6DBFA。

sub_404797就是sscanf,要求输入3个16进制字符串,再调用sub_401AD0,经过2次不同的掩码数组加密,得到3组_DWORD值,并将hash值看作_DWORD数组,数组的前三个值,与加密后的3组值一一对应。

int *__cdecl sub_401AD0(int *a1, _DWORD *a2, _DWORD *a3)
{int v5; // esiint v6; // ediint v7; // esiint v8; // ediint *result; // eaxint *v10; // [esp+18h] [ebp-24h]unsigned __int8 v11; // [esp+1Ch] [ebp-20h]int v12; // [esp+1Ch] [ebp-20h]int v13; // [esp+20h] [ebp-1Ch]unsigned __int8 v14; // [esp+20h] [ebp-1Ch]int v15; // [esp+28h] [ebp-14h]v5 = 0;v6 = 0;v10 = a1 + 1;do{v13 = *a3 & *v10;v11 = sub_401AB0(*a2 & *a1);++v5;++a3;++a2;v6 = ((unsigned __int8)sub_401AB0(v13) ^ v11) & 1 ^ (2 * v6);}while ( (unsigned __int8)v5 < 0x20u );v7 = 0;v15 = v6;v8 = 0;do{v12 = *a3 & *v10;v14 = sub_401AB0(*a2 & *a1);++v7;++a3;++a2;v8 = ((unsigned __int8)sub_401AB0(v12) ^ v14) & 1 ^ (2 * v8);}while ( (unsigned __int8)v7 < 0x20u );result = a1;*a1 = v15;*v10 = v8;return result;
}
int __cdecl sub_401AB0(int a1)
{int v1; // edxint result; // eaxv1 = a1;for ( result = 0; v1; v1 &= v1 - 1 )++result;return result;
}

sub_401AB0是计算参数的二进制表示中,1的个数,也就是汉明距离。sub_401AD0中,将2次汉明距离异或后,与1做按位与运算,也就是汉明距离的奇偶性,并以此作为2进制值计算出v6和v8.

说实话,这个逆运算困扰了我很久,按照反编译的代码,根本找不到逆运算的任何思路。看雪论坛在当年有一个帖子解释这个程序里有一句话,汉明距离奇偶性的判断有另外的等效计算方法,而那个方法是可逆的。于是寻找奇偶性计算的替代方法。

其实,奇偶性计算就是一个偶消奇不消的过程,值为1的位数是奇数还是偶数,那么,把每一bit进行异或即可,但没必要运行那么多次,折半异或性能更好。于是找到替代函数

static int haming_weight(_QWORD x)
{x = (x >> 32) ^ (x & 0xffffffff);x = (x >> 16) ^ (x & 0xffff);x = (x >> 8) ^ (x & 0xff);x = (x >> 4) ^ (x & 0xf);x = (x >> 2) ^ (x & 0x3);x = (x >> 1) ^ (x & 0x1);return x;
}

同时,汉明距离异或值的奇偶性,等于汉明距离奇偶的异或值,这里就有一种豁然开朗的感觉,入参数组的data[0]和data[1]可以看作一个64位整数,两组key同时拼接为一组64为整数的数组,于是sub_401AD0可以等效替换为

static void __cdecl encrypt(_DWORD* Data, _DWORD* maskKey1, _DWORD* maskKey2)
{_DWORD v8 = 0;_DWORD v6 = 0;for (int i = 0;i < 32;++i){_QWORD data = ((_QWORD)Data[1] << 32) | Data[0];_QWORD key = ((_QWORD)maskKey2[i] << 32) | maskKey1[i];_QWORD key2 = ((_QWORD)maskKey2[i + 32] << 32) | maskKey1[i + 32];//printf("Data:%llX, key:%llX, key2:%llX\n", data, key, key2);v6 = haming_weight(data & key) ^ (v6 << 1);v8 = haming_weight(data & key2) ^ (v8 << 1);}Data[0] = v6;Data[1] = v8;
}

但到了这里,解密仍然是个老大难问题,干脆把代码交给deepseek试试,AI给出的结论是要用逆矩阵来解密,逆矩阵用高斯消元法。于是,经过AI多次给出错误答案并修修补补后,得到最终解密函数

// 预计算密钥的奇偶性矩阵
static void build_key_matrix(_DWORD* maskKey1, _DWORD* maskKey2, _DWORD matrix[64][64]) {for (int i = 0; i < 32; ++i) {_QWORD key1 = ((_QWORD)maskKey2[31 - i] << 32) | maskKey1[31 - i];_QWORD key2 = ((_QWORD)maskKey2[63 - i] << 32) | maskKey1[63 - i];// 填充矩阵的奇数行(key1)和偶数行(key2)for (int j = 0; j < 64; ++j) {matrix[i][j] = (key1 >> j) & 1;matrix[i + 32][j] = (key2 >> j) & 1;}}
}static bool matrix_inverse(_DWORD input[64][64], _DWORD output[64][64])
{_DWORD aug[64][128]; // 增广矩阵 [I | A]// 初始化增广矩阵for (int i = 0; i < 64; ++i) {for (int j = 0; j < 64; ++j) {aug[i][j] = input[i][j];aug[i][j + 64] = (i == j) ? 1 : 0; // 右侧初始化为单位矩阵}}// 高斯-若尔当消元法for (int col = 0; col < 64; ++col) {// 寻找主元int pivot = -1;for (int row = col; row < 64; ++row) {if (aug[row][col]) {pivot = row;break;}}if (pivot == -1) return false; // 矩阵不可逆// 交换行if (pivot != col) {for (int j = 0; j < 128; ++j) {uint8_t temp = aug[col][j];aug[col][j] = aug[pivot][j];aug[pivot][j] = temp;}}// 消元处理for (int row = 0; row < 64; ++row) {if (row != col && aug[row][col]) {for (int j = 0; j < 128; ++j) {aug[row][j] ^= aug[col][j];}}}}// 提取逆矩阵for (int i = 0; i < 64; ++i) {for (int j = 0; j < 64; ++j) {output[i][j] = aug[i][j + 64];}}return true;
}static void __cdecl decrypt(_DWORD* Data, _DWORD* maskKey1, _DWORD* maskKey2) {_DWORD key_matrix[64][64];_DWORD inv_matrix[64][64];// 预计算阶段build_key_matrix(maskKey1, maskKey2, key_matrix);matrix_inverse(key_matrix, inv_matrix); // 需实现矩阵求逆// 解密阶段_DWORD cipher_bits[64];for (int i = 0; i < 32; i++) {cipher_bits[i] = (Data[0] >> (i)) & 1;cipher_bits[i + 32] = (Data[1] >> (i)) & 1;}// 矩阵乘法恢复原始数据_QWORD plain = 0;for (int i = 0; i < 64; i++) {_DWORD bit = 0;for (int j = 0; j < 64; j++) {bit ^= inv_matrix[i][j] & cipher_bits[j];}plain ^= (_QWORD)bit << i;}Data[0] = (DWORD)(plain & 0xFFFFFFFF);Data[1] = (DWORD)(plain >> 32);
}

最后,解密过程为

    _DWORD dword_41C5C0[] = {0xDFCF8EDF, 0xFE7C76FE, 0xFCF8EDFC, 0xF9F1DBF9, 0xF3E3B7F2, 0xBF9F1DBF, 0x7F3E3B7F, 0xE7C76FE5,0xCF8EDFCB, 0x7C76FE5F, 0xF8EDFCBE, 0x9F1DBF97, 0x3E3B7F2F, 0x8EDFCBE0, 0x1DBF97C1, 0xC76FE5F0,0xF1DBF97C, 0xE3B7F2F8, 0x3B7F2F82, 0x76FE5F05, 0xBF97C156, 0x6FE5F055, 0xDBF97C15, 0xB7F2F82A,0xDFCBE0AB, 0xEDFCBE0A, 0xF97C1561, 0xF2F82AC3, 0xE5F05586, 0x7F2F82AC, 0xFE5F0558, 0xFCBE0AB0,0xCBE0AB0C, 0x97C15619, 0x2F82AC32, 0x5F055865, 0x7C156197, 0xF82AC32E, 0xF055865C, 0xE0AB0CB9,0xC1561973, 0x82AC32E7, 0xBE0AB0CB, 0x055865CE, 0x0AB0CB9C, 0x2AC32E72, 0x15619739, 0x55865CE4,0xAB0CB9C8, 0xAC32E723, 0x5865CE46, 0xB0CB9C8D, 0x6197391B, 0xC32E7236, 0x865CE46C, 0x0CB9C8D9,0x56197391, 0x65CE46CB, 0xCB9C8D96, 0x197391B2, 0x32E72365, 0x97391B2C, 0x2E723659, 0x5CE46CB3};_DWORD dword_41C4C0[] = {0xAE10E7F5, 0x7087FFB6, 0xE10FFF6D, 0x421FDEDF, 0x843FBDBF, 0xDC21EFEF, 0x3843FFDB, 0x887F5B7B,0x90FE96F3, 0x07F45782, 0x0FE8AF04, 0xA1FD0DE3, 0xC3FA3BC3, 0xFE8AF04F, 0x7D15C09B, 0x7F457827,0x1FD15E09, 0x3FA2BC13, 0xFA2B8136, 0x74572268, 0x15CA5A45, 0xC5728693, 0x515CA9A5, 0xA2B9534B,0x0AE52D22, 0xE8AE44D0, 0xDCA5845F, 0x394B28BB, 0x72965177, 0x2B94B48B, 0x57296916, 0xAE52D22D,0xE52CA2EF, 0x4A5965DB, 0x94B2CBB7, 0xA965B76A, 0x2596BDA5, 0x4B2D7B4A, 0x965AF695, 0xACB5CD2F,0xD96BBA5B, 0x32D754B3, 0xD2CB4ED0, 0x65AEA967, 0xCB5D52CE, 0x2D750B30, 0x16BA8598, 0x5AEA1660,0xB5D42CC0, 0x5750D30E, 0xAEA1A61D, 0xDD436C3E, 0x3A86F879, 0x750DF0F2, 0xEA1BE1E5, 0x5437E3CF,0xEBA87985, 0x21BF7E74, 0x437EFCE8, 0xA86FC79E, 0xD0DFAF38, 0x86FDF9D1, 0x8DFBD3A7, 0x9BF7874A};_DWORD dword_41C3C0[] = { 0x9B4D1349, 0x369A2692, 0xCDA689A4, 0xDA689A48, 0xB4D13490, 0x69A26921, 0xD344D243, 0x6D344D24,0xA689A486, 0x4D13490D, 0x9A26921A, 0x689A486B, 0x344D2435, 0xD13490D7, 0xA26921AE, 0x89A486BA,0x44D2435D, 0x13490D75, 0x26921AEA, 0x4D2435D5, 0x9A486BAA, 0x3490D754, 0x6921AEA9, 0xD2435D52,0xA486BAA5, 0x490D754B, 0x921AEA96, 0x2435D52C, 0x486BAA58, 0x90D754B1, 0x21AEA962, 0x435D52C4,0x86BAA589, 0x1AEA9624, 0x0D754B12, 0x35D52C48, 0x6BAA5890, 0xD754B120, 0x5D52C481, 0xBAA58902,0xAEA96240, 0xEA96240A, 0x754B1205, 0xAA58902A, 0x54B12055, 0xA96240AA, 0x52C48154, 0xD52C4815,0xA58902A9, 0x4B120553, 0x96240AA7, 0x2C48154E, 0x58902A9D, 0xB120553A, 0x6240AA75, 0xC48154EA,0x48154EAB, 0x902A9D56, 0x20553AAC, 0x8902A9D5, 0x120553AA, 0x240AA755, 0x8154EAB3, 0x40AA7559};_DWORD dword_41C2C0[] = { 0x0BCFEF35, 0x179FDE6B, 0xC5E7E798, 0x5E7F79AC, 0xBCFEF359, 0xF9FDC6B7, 0x73FBAD6A, 0x2F3FBCD6,0xE7F75AD5, 0x4FEE95AF, 0x9FDD2B5E, 0xFF74CD76, 0xBFBA76B9, 0x7EE9BAE8, 0xFDD375D1, 0xF74D974E,0x7BA6CBA7, 0x6E9B0E99, 0xDD361D32, 0x3A6C1A60, 0x74D834C0, 0xE9B06981, 0x5360F306, 0xA6C1E60C,0xCD83EC1D, 0x1B07F83F, 0x360FF07E, 0x6C1FE0FD, 0xD83FC1FA, 0x307FA3F0, 0x60FF47E1, 0xC1FE8FC2,0x03FD3F80, 0x0FF4FE02, 0x07FA7F01, 0x1FE9FC04, 0x3FD3F808, 0x7FA7F010, 0x7E9FE047, 0xFD3FC08E,0xFF4FE021, 0xF4FF4232, 0x7A7FA119, 0xD3FD48C3, 0x27FAB183, 0x4FF56306, 0x9FEAC60D, 0x69FEA461,0xBFD5AC1E, 0xFFAB7839, 0x7F56D076, 0xFEADA0ED, 0x7D5B61DE, 0xFAB6C3BC, 0x756DA77D, 0xEADB4EFA,0x2DB58F80, 0x5B6B1F00, 0xB6D63E01, 0x55B6BDF1, 0xAB6D7BE3, 0xD6DAD7C2, 0x5B589808, 0xEDAC5C06 };_DWORD Data[] = { 0xBAB8150D, 0x57308F2C, 0xAEA9D86B };decrypt(Data + 1, dword_41C4C0, dword_41C5C0);decrypt(Data, dword_41C2C0, dword_41C3C0);printf("%X %X %X\n", Data[0], Data[1], Data[2]);

附上程序内执行成功的截图

最后,吐槽一下看雪,答案提交上去显示错误,很好奇那3个人如何提交成功的。现在好多题都是提交答案无果,还有好多题没有附件,看来是没有人继续维护了。

相关文章:

[KCTF]CORE CrackMe v2.0

这个Reverse比较古老&#xff0c;已经有20多年了&#xff0c;但难度确实不小。 先查壳 upx压缩壳&#xff0c;0.72&#xff0c;废弃版本&#xff0c;工具无法解压。 反正不用IDA进行调试&#xff0c;直接x32dbg中&#xff0c;dump内存&#xff0c;保存后拖入IDA。 这里说一下…...

Redis——Cluster配置

目录 分片 一、分片的本质与核心价值 二、分片实现方案对比 三、分片算法详解 1. ‌范围分片&#xff08;顺序分片&#xff09;‌ 2. ‌哈希分片‌ 3. ‌虚拟槽分片&#xff08;Redis Cluster 方案&#xff09;‌ 四、Redis Cluster 分片实践要点 五、经典问题解析 C…...

Ubuntu 安装 Mysql 数据库

首先更新apt-get工具&#xff0c;执行命令如下&#xff1a; apt-get upgrade安装Mysql&#xff0c;执行如下命令&#xff1a; apt-get install mysql-server 开启Mysql 服务&#xff0c;执行命令如下&#xff1a; service mysql start并确认是否成功开启mysql,执行命令如下&am…...

结合PDE反应扩散方程与物理信息神经网络(PINN)进行稀疏数据预测的技术方案

以下是一个结合PDE反应扩散方程与物理信息神经网络(PINN)进行稀疏数据预测的技术方案,包含完整数学推导、PyTorch/TensorFlow双框架实现代码及对比实验分析。 基于PINN的反应扩散方程稀疏数据预测与大规模数据泛化能力研究 1. 问题定义与数学模型 1.1 反应扩散方程 考虑标…...

从0开始一篇文章学习Nginx

Nginx服务 HTTP介绍 ## HTTP协议是Hyper Text Transfer Protocol&#xff08;超文本传输协议&#xff09;的缩写,是用于从万维网&#xff08;WWW:World Wide Web &#xff09;服务器传输超文本到本地浏览器的传送协议。 ## HTTP工作在 TCP/IP协议体系中的TCP协议上&#…...

Java高级 |【实验八】springboot 使用Websocket

隶属文章&#xff1a;Java高级 | &#xff08;二十二&#xff09;Java常用类库-CSDN博客 系列文章&#xff1a;Java高级 | 【实验一】Springboot安装及测试 |最新-CSDN博客 Java高级 | 【实验二】Springboot 控制器类相关注解知识-CSDN博客 Java高级 | 【实验三】Springboot 静…...

scan_mode设计原则

scan_mode设计原则 在进行mtp controller设计时&#xff0c;基本功能设计完成后&#xff0c;需要设计scan_mode设计。 1、在进行scan_mode设计时&#xff0c;需要保证mtp处于standby模式&#xff0c;不会有擦写、编程动作。 2、只需要固定mtp datasheet说明的接口即可&#xf…...

设计模式-3 行为型模式

一、观察者模式 1、定义 定义对象之间的一对多的依赖关系&#xff0c;这样当一个对象改变状态时&#xff0c;它的所有依赖项都会自动得到通知和更新。 描述复杂的流程控制 描述多个类或者对象之间怎样互相协作共同完成单个对象都无法单独度完成的任务 它涉及算法与对象间职责…...

qt 双缓冲案例对比

双缓冲 1.双缓冲原理 单缓冲&#xff1a;在paintEvent中直接绘制到屏幕&#xff0c;绘制过程被用户看到 双缓冲&#xff1a;先在redrawBuffer绘制到缓冲区&#xff0c;然后一次性显示完整结果 代码结构 单缓冲&#xff1a;所有绘制逻辑在paintEvent中 双缓冲&#xff1a;绘制…...

2025年全国I卷数学压轴题解答

第19题第3问: b b b 使得存在 t t t, 对于任意的 x x x, 5 cos ⁡ x − cos ⁡ ( 5 x t ) < b 5\cos x-\cos(5xt)<b 5cosx−cos(5xt)<b, 求 b b b 的最小值. 解: b b b 的最小值 b m i n min ⁡ t max ⁡ x g ( x , t ) b_{min}\min_{t} \max_{x} g(x,t) bmi…...

JS设计模式(5): 发布订阅模式

解锁JavaScript发布订阅模式&#xff1a;让代码沟通更优雅 在JavaScript的世界里&#xff0c;我们常常会遇到这样的场景&#xff1a;多个模块之间需要相互通信&#xff0c;但是又不想让它们产生过于紧密的耦合。这时候&#xff0c;发布订阅模式就像一位优雅的信使&#xff0c;…...

实现p2p的webrtc-srs版本

1. 基本知识 1.1 webrtc 一、WebRTC的本质&#xff1a;实时通信的“网络协议栈”类比 将WebRTC类比为Linux网络协议栈极具洞察力&#xff0c;二者在架构设计和功能定位上高度相似&#xff1a; 分层协议栈架构 Linux网络协议栈&#xff1a;从底层物理层到应用层&#xff08;如…...

Android多媒体——音/视频数据播放(十八)

在媒体数据完成解码并准备好之后,播放流程便进入了最终的呈现阶段。为了确保音视频内容能够顺利输出,系统需要首先对相应的播放设备进行初始化。只有在设备初始化成功后,才能真正开始音视频的同步渲染与播放。这一过程不仅影响播放的启动速度,也直接关系到播放的稳定性和用…...

第2篇:BLE 广播与扫描机制详解

本文是《BLE 协议从入门到专家》专栏第二篇,专注于解析 BLE 广播(Advertising)与扫描(Scanning)机制。我们将从协议层结构、广播包格式、设备发现流程、控制器行为、开发者 API、广播冲突与多设备调度等方面,全面拆解这一 BLE 最基础也是最关键的通信机制。 一、什么是 B…...

开源 vGPU 方案:HAMi,实现细粒度 GPU 切分

本文主要分享一个开源的 GPU 虚拟化方案&#xff1a;HAMi&#xff0c;包括如何安装、配置以及使用。 相比于上一篇分享的 TimeSlicing 方案&#xff0c;HAMi 除了 GPU 共享之外还可以实现 GPU core、memory 得限制&#xff0c;保证共享同一 GPU 的各个 Pod 都能拿到足够的资源。…...

EC2安装WebRTC sdk-c环境、构建、编译

1、登录新的ec2实例&#xff0c;证书可以跟之前的实例用一个&#xff1a; ssh -v -i ~/Documents/cert/qa.pem ec2-user70.xxx.165.xxx 2、按照sdk-c demo中readme的描述开始安装环境&#xff1a; https://github.com/awslabs/amazon-kinesis-video-streams-webrtc-sdk-c 2…...

盲盒一番赏小程序:引领盲盒新潮流

在盲盒市场日益火爆的今天&#xff0c;如何才能在众多盲盒产品中脱颖而出&#xff1f;盲盒一番赏小程序给出了答案&#xff0c;它以创新的玩法和优质的服务&#xff0c;引领着盲盒新潮流。 一番赏小程序的最大特色在于其独特的赏品分级制度。赏品分为多个等级&#xff0c;从普…...

边缘计算设备全解析:边缘盒子在各大行业的落地应用场景

随着工业物联网、AI、5G的发展&#xff0c;数据量呈爆炸式增长。但你有没有想过&#xff0c;我们生成的数据&#xff0c;真的都要发回云端处理吗&#xff1f;其实不一定。特别是在一些对响应时间、网络带宽、数据隐私要求高的行业里&#xff0c;边缘计算开始“火”了起来&#…...

Linux实现线程同步的方式有哪些?

什么是线程同步&#xff1f; 想象一下超市收银台&#xff1a;如果所有顾客&#xff08;线程&#xff09;同时挤向同一个收银台&#xff08;共享资源&#xff09;&#xff0c;场面会一片混乱。线程同步就是给顾客们发"排队号码牌"&#xff0c;确保&#xff1a; 有序访…...

python打卡day47

昨天代码中注意力热图的部分顺移至今天 知识点回顾&#xff1a; 热力图 作业&#xff1a;对比不同卷积层热图可视化的结果 import torch import torch.nn as nn import torch.optim as optim from torchvision import datasets, transforms from torch.utils.data import D…...

python学习day39

图像数据与显存 知识点回顾 1.图像数据的格式&#xff1a;灰度和彩色数据 2.模型的定义 3.显存占用的4种地方 a.模型参数梯度参数 b.优化器参数 c.数据批量所占显存 d.神经元输出中间状态 4.batchisize和训练的关系 import torch import torchvision import torch.nn as nn imp…...

Ansible+Zabbix-agent2快速实现对多主机监控

ansible Ansible 是一款开源的自动化工具&#xff0c;用于配置管理&#xff08;Configuration Management&#xff09;、应用部署&#xff08;Application Deployment&#xff09;、任务自动化&#xff08;Task Automation&#xff09;和编排&#xff08;Orchestration&#xf…...

年度峰会上,抖音依靠人工智能和搜索功能吸引广告主

上周早些时候举行的第五届年度TikTok World产品峰会上&#xff0c;TikTok推出了一系列旨在增强该应用对广告主吸引力的功能。 新产品列表的首位是TikTok Market Scope&#xff0c;这是一个全新的分析平台&#xff0c;为广告主提供整个考虑漏斗的全面视图&#xff0c;使他们能够…...

Vuex:Vue.js 应用程序的状态管理模式

什么是Vuex&#xff1f; Vuex 是专门为 Vue.js 应用程序开发的状态管理模式 库。它采用集中式存储管理应用的所有组件的状态&#xff0c;并以相应的规则保证状态以一种可预测的方式发生变化。 在大型单页应用中&#xff0c;当多个组件共享状态时&#xff0c;简单的单向数据流…...

【中间件】Web服务、消息队列、缓存与微服务治理:Nginx、Kafka、Redis、Nacos 详解

Nginx 是什么&#xff1a;高性能的HTTP和反向代理Web服务器。怎么用&#xff1a;通过配置文件定义代理规则、负载均衡、静态资源服务等。为什么用&#xff1a;提升Web服务性能、高并发处理、负载均衡和反向代理。优缺点&#xff1a;轻量高效&#xff0c;但动态处理能力较弱&am…...

如何使用CodeRider插件在IDEA中生成代码

一、环境搭建与插件安装 1.1 环境准备 名称要求说明操作系统Windows 11JetBrains IDEIntelliJ IDEA 2025.1.1.1 (Community Edition)硬件配置推荐16GB内存50GB磁盘空间 1.2 插件安装流程 步骤1&#xff1a;市场安装 打开IDEA&#xff0c;进入File → Settings → Plugins搜…...

电脑定时关机工具推荐

软件介绍 本文介绍一款轻量级的电脑自动关机工具&#xff0c;无需安装&#xff0c;使用简单&#xff0c;可满足定时关机需求。 工具简介 这款关机助手是一款无需安装的小型软件&#xff0c;文件体积仅60KB&#xff0c;下载后可直接运行&#xff0c;无需复杂配置。 使用…...

Ubuntu 可执行程序自启动方法

使用 autostart&#xff08;适用于桌面环境&#xff09; 适用于 GNOME/KDE 桌面环境&#xff08;如 Ubuntu 图形界面&#xff09; 1. 创建 .desktop 文件 sudo vi ~/.config/autostart/my_laser.desktop[Desktop Entry] TypeApplication NameMy Laser Program Execbash -c &…...

Springboot多数据源配置实践

Springboot多数据源配置实践 基本配置文件数据库配置Mapper包Model包Service包中业务代码Mapper XML文件在某些复杂的业务场景中,我们可能需要使用多个数据库来存储和管理不同类型的数据,而不是仅仅依赖于单一数据库。本技术文档将详细介绍如何在 Spring Boot 项目中进行多数…...

第6章:Neo4j数据导入与导出

在实际应用中&#xff0c;数据的导入与导出是使用Neo4j的重要环节。无论是初始数据加载、系统迁移还是数据备份&#xff0c;都需要高效可靠的数据传输机制。本章将详细介绍Neo4j中的各种数据导入与导出方法&#xff0c;帮助读者掌握不同场景下的最佳实践。 6.1 数据导入策略 …...