MTK Logo 逆向解析之 rawx 全解压

紧接上一篇

MTK Logo 逆向解析之 bin 转 rawx

查看 zpipe 源码发现压缩使用 zlib 算法,其中也包含了解压的代码,但直接执行发现并不好使,有bug。很明显 mtk

并没有真正用过解压,那就需要我们自己来修复一下了,总比没有代码需要我们自己新写容易些。

知识储备,关于 zlib 使用介绍可以参考这篇

第三方库介绍——zlib库

对 zlib 有一定认知后,我们就来看看 zpipe 源码

一、分析源码

主看 main 函数,一开始做了参数类型判断,参数一 -l 就走 compress 逻辑,否则就 decompress 逻辑

源码中提示的执行指令为 compress -l 9 logo.raw battery.raw

input 对应 battery.raw output 对应 logo.raw

根据实际传参数量申请大小为 filenum*4 的 unsigned int pinfo ,然后将数据全部初始化为 0 memset((void)pinfo, 0, sizeof(int)*filenum);

关键代码来了

if(sizeof(int)filenum != fwrite(pinfo, 1, filenumsizeof(int), output)) 将文件数量数据写入 output 头部

pinfo[pinfo[0]+2]=ftell(output); 将指针移动到头部数据后一位,同时 pinfo[2] 存储头部数据大小

if (Z_OK != def(input, output, level)) 执行压缩算法,压缩数据跟在头部数据后面
{
ret = -2;
goto done;
}
pinfo[0] = pinfo[0]+1; 记录压缩了几次

for (i = 5; i < argc; i++)
{
fclose(input);

input = fopen(argv[i], "rb");  重新赋值input,重复上面核心逻辑pinfo[pinfo[0]+2]=ftell(output);
if (Z_OK != def(input, output, level)) 
{fprintf(stderr, "compress error\n");ret = -2;goto done;
}
pinfo[0] = pinfo[0]+1;

}
done:
fseek(output, 0L, SEEK_END); 文件指针移动到末尾
pinfo[1] = ftell(output); 获取 output 完整数据
fseek(output, 0L, SEEK_SET); 恢复文件指针位置
fwrite(pinfo, 1, filenum*sizeof(int), output); 写入完整数据

假如执行指令为 ./zpipe -l 9 log.raw wxganl_bat_animation_01.raw wxganl_bat_animation_02.raw wxganl_bat_animation_03.raw

压缩过程为
wxganl_bat_animation_01.raw --> log.raw
wxganl_bat_animation_02.raw --> log.raw
wxganl_bat_animation_03.raw --> log.raw

pinfo[0]=压缩次数 pinfo[1]=第一次压缩后数据大小 pinfo[2]=要压缩文件数量大小 pinfo[3]=第一次压缩后数据大小 pinfo[4]=第一次压缩后数据大小


#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <assert.h>
#include "zlib.h"#if defined(MSDOS) || defined(OS2) || defined(WIN32) || defined(__CYGWIN__)
#  include <fcntl.h>
#  include <io.h>
#  define SET_BINARY_MODE(file) setmode(fileno(file), O_BINARY)
#else
#  define SET_BINARY_MODE(file)
#endif#define CHUNK 16384/* Compress from file source to file dest until EOF on source.def() returns Z_OK on success, Z_MEM_ERROR if memory could not beallocated for processing, Z_STREAM_ERROR if an invalid compressionlevel is supplied, Z_VERSION_ERROR if the version of zlib.h and theversion of the library linked do not match, or Z_ERRNO if there isan error reading or writing the files. */
int def(FILE *source, FILE *dest, int level)
{int ret, flush;unsigned have;z_stream strm;unsigned char in[CHUNK];unsigned char out[CHUNK];/* allocate deflate state */strm.zalloc = Z_NULL;strm.zfree = Z_NULL;strm.opaque = Z_NULL;ret = deflateInit(&strm, level);if (ret != Z_OK)return ret;/* compress until end of file */do {strm.avail_in = fread(in, 1, CHUNK, source);if (ferror(source)) {(void)deflateEnd(&strm);return Z_ERRNO;}flush = feof(source) ? Z_FINISH : Z_NO_FLUSH;strm.next_in = in;/* run deflate() on input until output buffer not full, finishcompression if all of source has been read in */do {strm.avail_out = CHUNK;strm.next_out = out;ret = deflate(&strm, flush);    /* no bad return value */assert(ret != Z_STREAM_ERROR);  /* state not clobbered */have = CHUNK - strm.avail_out;if (fwrite(out, 1, have, dest) != have || ferror(dest)) {(void)inflateEnd(&strm);return Z_ERRNO;}} while (strm.avail_out == 0);assert(strm.avail_in == 0);     /* all input will be used *//* done when last data in file processed */} while (flush != Z_FINISH);assert(ret == Z_STREAM_END);        /* stream will be complete *//* clean up and return */(void)deflateEnd(&strm);return Z_OK;
}/* Decompress from file source to file dest until stream ends or EOF.inf() returns Z_OK on success, Z_MEM_ERROR if memory could not beallocated for processing, Z_DATA_ERROR if the deflate data isinvalid or incomplete, Z_VERSION_ERROR if the version of zlib.h andthe version of the library linked do not match, or Z_ERRNO if thereis an error reading or writing the files. */
int inf(FILE *source, FILE *dest)
{int ret;unsigned int have;z_stream strm;unsigned char in[CHUNK];unsigned char out[CHUNK];/* allocate inflate state */strm.zalloc = Z_NULL;strm.zfree = Z_NULL;strm.opaque = Z_NULL;strm.avail_in = 0;strm.next_in = Z_NULL;ret = inflateInit(&strm);if (ret != Z_OK)return ret;/* decompress until deflate stream ends or end of file */do {strm.avail_in = fread(in, 1, CHUNK, source);if (ferror(source)) {(void)inflateEnd(&strm);return Z_ERRNO;}if (strm.avail_in == 0)break;strm.next_in = in;/* run inflate() on input until output buffer not full */do {strm.avail_out = CHUNK;strm.next_out = out;ret = inflate(&strm, Z_NO_FLUSH);assert(ret != Z_STREAM_ERROR);  /* state not clobbered */switch (ret) {case Z_NEED_DICT:ret = Z_DATA_ERROR;     /* and fall through */case Z_DATA_ERROR:case Z_MEM_ERROR:(void)inflateEnd(&strm);return ret;}have = CHUNK - strm.avail_out;if (fwrite(out, 1, have, dest) != have || ferror(dest)) {(void)inflateEnd(&strm);return Z_ERRNO;}} while (strm.avail_out == 0);/* done when inflate() says it's done */} while (ret != Z_STREAM_END);/* clean up and return */(void)inflateEnd(&strm);return ret == Z_STREAM_END ? Z_OK : Z_DATA_ERROR;
}/* report a zlib or i/o error */
void zerr(int ret)
{fputs("zpipe: ", stderr);switch (ret) {case Z_ERRNO:if (ferror(stdin))fputs("error reading stdin\n", stderr);if (ferror(stdout))fputs("error writing stdout\n", stderr);break;case Z_STREAM_ERROR:fputs("invalid compression level\n", stderr);break;case Z_DATA_ERROR:fputs("invalid or incomplete deflate data\n", stderr);break;case Z_MEM_ERROR:fputs("out of memory\n", stderr);break;case Z_VERSION_ERROR:fputs("zlib version mismatch!\n", stderr);}
}/* compress or decompress from stdin to stdout */
int process(int argc, char **argv)
{int ret;/* avoid end-of-line conversions */SET_BINARY_MODE(stdin);SET_BINARY_MODE(stdout);/* do compression if no arguments */if (argc == 1) {ret = def(stdin, stdout, Z_DEFAULT_COMPRESSION);if (ret != Z_OK)zerr(ret);return ret;}/* do decompression if -d specified */else if (argc == 2 && strcmp(argv[1], "-d") == 0) {ret = inf(stdin, stdout);if (ret != Z_OK)zerr(ret);return ret;}/* otherwise, report usage */else {fputs("zpipe usage: zpipe [-d] < source > dest\n", stderr);return 1;}
}int main(int argc, char **argv)
{int ret = 0;int i;FILE *input, *output;if (argc < 4 || (strcmp(argv[1], "-l") && strcmp(argv[1], "-d"))) {printf("[Usage] compress -l n output input1 [input2]\n");printf("Example: compress -l 9 logo.raw battery.raw\n");return -1;}// compressif(!strcmp(argv[1], "-l")){char *ptemp;unsigned int *pinfo;int level = -1;int filenum = argc - 2;level = atoi(argv[2]);input = fopen(argv[4], "rb");output = fopen(argv[3], "wb");ptemp = (char*)malloc(1024*1024);pinfo = (unsigned int*)malloc(filenum*sizeof(int));if(input < 0 || output < 0 || ptemp == NULL || pinfo == NULL){fprintf(stderr, "open file and allocate temp buffer fail\n");fprintf(stderr, "input = %d, output = %d, ptemp = 0x%08x, pinfo = 0x%08x\n", input, output, ptemp, pinfo);ret = -1;goto done;}// structre of pinfo:// pinfo[0] ==> size of pinfo // pinfo[1] ==> offset of zip chunk[1]// pinfo[2] ==> offset of zip chunk[2]// ...// pinfo[n] ==> offset of zip chunk[n]// "offset" is the distance from the begining of the file, not the zip chunkmemset((void*)pinfo, 0, sizeof(int)*filenum);// write information header to output firstif(sizeof(int)*filenum != fwrite(pinfo, 1, filenum*sizeof(int), output)){ret = -2;goto done;}pinfo[pinfo[0]+2]=ftell(output);if (Z_OK != def(input, output, level)) {ret = -2;goto done;}pinfo[0] = pinfo[0]+1;for (i = 5; i < argc; i++) {fclose(input);input = fopen(argv[i], "rb");pinfo[pinfo[0]+2]=ftell(output);if (Z_OK != def(input, output, level)) {fprintf(stderr, "compress error\n");ret = -2;goto done;}pinfo[0] = pinfo[0]+1;}done:fseek(output, 0L, SEEK_END);pinfo[1] = ftell(output);fseek(output, 0L, SEEK_SET);fwrite(pinfo, 1, filenum*sizeof(int), output);fclose(input);fclose(output);free(ptemp);free(pinfo);return ret;}// decompresselse{unsigned int temp;unsigned int *pinfo;char outputfilename[256];input = fopen(argv[3], "rb");if(input < 0){printf("open file fail\n");printf("input = %d\n", input);ret = -1;goto done2;}fread(&temp, 1, sizeof(int), input);printf("temp=%d\n", temp);pinfo = malloc(temp*sizeof(int));if(pinfo == NULL){printf("allocate pinfo failed\n");ret = -1;goto done2;}fread(pinfo, 1, temp*sizeof(int), input);for(i=0;i<temp;i++)printf("pinfo[%d]=%d\n", i, pinfo[i]);for(i = 0;i < temp;i++){sprintf(outputfilename, "%d_%s", i, argv[2]);output = fopen(outputfilename, "wb");if(output < 0){printf("create output file %s fail\n", outputfilename);goto done2;}fseek(input, pinfo[i], SEEK_SET);if(Z_OK != inf(input, output)){printf("decompress error\n");ret = -2;goto done2;}fclose(output);output = 0;}
done2:fclose(input);if(output) fclose(output);return ret;}
}

二、改造源码

直接执行解压指令 ./zpipe -d xx ./logo.raw 会报错 decompress error

经过分析是解压文件数量计算不对导致循环出错,结合上面的压缩过程结论,

需要跳过包含 pinfo[x]=要压缩文件数量大小 无效数据

然后我们增加参数 -d 判断, xx 就是解压后文件命名,最终会得到 0_xx.raw 1_xx.raw 等

可以通过文件 md5 指令比对压缩前原文件和解压后的文件


#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>
#include <string.h>
#include <assert.h>
#include <zlib.h>#if defined(MSDOS) || defined(OS2) || defined(WIN32) || defined(__CYGWIN__)
#  include <fcntl.h>
#  include <io.h>
#  define SET_BINARY_MODE(file) setmode(fileno(file), O_BINARY)
#else
#  define SET_BINARY_MODE(file)
#endif#define CHUNK 16384/* Compress from file source to file dest until EOF on source.def() returns Z_OK on success, Z_MEM_ERROR if memory could not beallocated for processing, Z_STREAM_ERROR if an invalid compressionlevel is supplied, Z_VERSION_ERROR if the version of zlib.h and theversion of the library linked do not match, or Z_ERRNO if there isan error reading or writing the files. */
int def(FILE *source, FILE *dest, int level)
{int ret, flush;unsigned have;z_stream strm;unsigned char in[CHUNK];unsigned char out[CHUNK];/* allocate deflate state */strm.zalloc = Z_NULL;strm.zfree = Z_NULL;strm.opaque = Z_NULL;ret = deflateInit(&strm, level);if (ret != Z_OK)return ret;/* compress until end of file */do {strm.avail_in = fread(in, 1, CHUNK, source);if (ferror(source)) {(void)deflateEnd(&strm);return Z_ERRNO;}flush = feof(source) ? Z_FINISH : Z_NO_FLUSH;strm.next_in = in;/* run deflate() on input until output buffer not full, finishcompression if all of source has been read in */do {strm.avail_out = CHUNK;strm.next_out = out;ret = deflate(&strm, flush);    /* no bad return value */assert(ret != Z_STREAM_ERROR);  /* state not clobbered */have = CHUNK - strm.avail_out;if (fwrite(out, 1, have, dest) != have || ferror(dest)) {(void)inflateEnd(&strm);return Z_ERRNO;}} while (strm.avail_out == 0);assert(strm.avail_in == 0);     /* all input will be used *//* done when last data in file processed */} while (flush != Z_FINISH);assert(ret == Z_STREAM_END);        /* stream will be complete *//* clean up and return */(void)deflateEnd(&strm);return Z_OK;
}/* Decompress from file source to file dest until stream ends or EOF.inf() returns Z_OK on success, Z_MEM_ERROR if memory could not beallocated for processing, Z_DATA_ERROR if the deflate data isinvalid or incomplete, Z_VERSION_ERROR if the version of zlib.h andthe version of the library linked do not match, or Z_ERRNO if thereis an error reading or writing the files. */
int inf(FILE *source, FILE *dest)
{int ret;unsigned int have;z_stream strm;unsigned char in[CHUNK];unsigned char out[CHUNK];/* allocate inflate state */strm.zalloc = Z_NULL;strm.zfree = Z_NULL;strm.opaque = Z_NULL;strm.avail_in = 0;strm.next_in = Z_NULL;ret = inflateInit(&strm);if (ret != Z_OK)return ret;/* decompress until deflate stream ends or end of file */do {strm.avail_in = fread(in, 1, CHUNK, source);if (ferror(source)) {(void)inflateEnd(&strm);return Z_ERRNO;}if (strm.avail_in == 0)break;strm.next_in = in;/* run inflate() on input until output buffer not full */do {strm.avail_out = CHUNK;strm.next_out = out;ret = inflate(&strm, Z_NO_FLUSH);assert(ret != Z_STREAM_ERROR);  /* state not clobbered */switch (ret) {case Z_NEED_DICT:ret = Z_DATA_ERROR;     /* and fall through */case Z_DATA_ERROR:case Z_MEM_ERROR:(void)inflateEnd(&strm);return ret;}have = CHUNK - strm.avail_out;if (fwrite(out, 1, have, dest) != have || ferror(dest)) {(void)inflateEnd(&strm);return Z_ERRNO;}} while (strm.avail_out == 0);/* done when inflate() says it's done */} while (ret != Z_STREAM_END);/* clean up and return */(void)inflateEnd(&strm);return ret == Z_STREAM_END ? Z_OK : Z_DATA_ERROR;
}/* report a zlib or i/o error */
void zerr(int ret)
{fputs("zpipe: ", stderr);switch (ret) {case Z_ERRNO:if (ferror(stdin))fputs("error reading stdin\n", stderr);if (ferror(stdout))fputs("error writing stdout\n", stderr);break;case Z_STREAM_ERROR:fputs("invalid compression level\n", stderr);break;case Z_DATA_ERROR:fputs("invalid or incomplete deflate data\n", stderr);break;case Z_MEM_ERROR:fputs("out of memory\n", stderr);break;case Z_VERSION_ERROR:fputs("zlib version mismatch!\n", stderr);}
}/* compress or decompress from stdin to stdout */
int process(int argc, char **argv)
{int ret;/* avoid end-of-line conversions */SET_BINARY_MODE(stdin);SET_BINARY_MODE(stdout);/* do compression if no arguments */if (argc == 1) {ret = def(stdin, stdout, Z_DEFAULT_COMPRESSION);if (ret != Z_OK)zerr(ret);return ret;}/* do decompression if -d specified */else if (argc == 2 && strcmp(argv[1], "-d") == 0) {ret = inf(stdin, stdout);if (ret != Z_OK)zerr(ret);return ret;}/* otherwise, report usage */else {fputs("zpipe usage: zpipe [-d] < source > dest\n", stderr);return 1;}
}int main(int argc, char **argv)
{int ret = 0;int i;FILE *input, *output;if (argc < 4 || (strcmp(argv[1], "-l") && strcmp(argv[1], "-d"))) {printf("[compress Example]: zpipe   -l 9 logo.raw battery.raw\n");printf("[decompress Example]: zpipe -d xx.raw logo.raw\n");return -1;}// compressif(!strcmp(argv[1], "-l")){char *ptemp;unsigned int *pinfo;int level = -1;int filenum = argc - 2;level = atoi(argv[2]);input = fopen(argv[4], "rb");output = fopen(argv[3], "wb");ptemp = (char*)malloc(1024*1024);pinfo = (unsigned int*)malloc(filenum*sizeof(int));if(input < 0 || output < 0 || ptemp == NULL || pinfo == NULL){fprintf(stderr, "open file and allocate temp buffer fail\n");fprintf(stderr, "input = %d, output = %d, ptemp = 0x%08x, pinfo = 0x%08x\n", input, output, ptemp, pinfo);ret = -1;goto done;}// structre of pinfo:// pinfo[0] ==> size of pinfo // pinfo[1] ==> offset of zip chunk[1]// pinfo[2] ==> offset of zip chunk[2]// ...// pinfo[n] ==> offset of zip chunk[n]// "offset" is the distance from the begining of the file, not the zip chunkmemset((void*)pinfo, 0, sizeof(int)*filenum);// write information header to output first//将文件个数写入第一位if(sizeof(int)*filenum != fwrite(pinfo, 1, filenum*sizeof(int), output)){ret = -2;goto done;}//获取当前指针位置,也就是文件个数写入内容的实际长度pinfo[pinfo[0]+2]=ftell(output);printf("pinfo[0]=%d\n", pinfo[0]);printf("pinfo[pinfo[0]+2]=%d\n", pinfo[pinfo[0]+2]);//开始压缩第一个文件if (Z_OK != def(input, output, level)) {fprintf(stderr, "compress error 111\n");ret = -2;goto done;}pinfo[0] = pinfo[0]+1;printf("argc=%d\n", argc);for (i = 5; i < argc; i++) {fclose(input);//循环上面过程input = fopen(argv[i], "rb");pinfo[pinfo[0]+2]=ftell(output);if (Z_OK != def(input, output, level)) {fprintf(stderr, "compress error\n");ret = -2;goto done;}pinfo[0] = pinfo[0]+1;}done://将指针移动到文件末尾fseek(output, 0L, SEEK_END);//获取文件大小pinfo[1] = ftell(output);// printf("pinfo[1]=%d\n", pinfo[1]);//将指针恢复到原来位置fseek(output, 0L, SEEK_SET);//写入数据fwrite(pinfo, 1, filenum*sizeof(int), output);for (int i = 0; i < filenum; ++i){printf("pinfo[%d]=%d\n", i , pinfo[i]);}fclose(input);fclose(output);free(ptemp);free(pinfo);return ret;}// decompresselse{unsigned int temp;unsigned int *pinfo;char outputfilename[256];//打开要解压的文件例如  logo.rawinput = fopen(argv[3], "rb");if(input < 0){printf("open file fail\n");printf("input = %d\n", input);ret = -1;goto done2;}//将文件大小读取到 tempfread(&temp, 1, sizeof(int), input);printf("temp=%d\n", temp);/*int tempLength = (temp+2)*sizeof(int);printf("tempLength=%d\n", tempLength);*/temp = temp + 1;//core//申请指定大小空间pinfo = malloc(temp*sizeof(int));if(pinfo == NULL){printf("allocate pinfo failed\n");ret = -1;goto done2;}//将文件数据读取到 pinfofread(pinfo, 1, temp*sizeof(int), input);/*for(i=0;i<temp;i++)printf("pinfo[%d]===%d\n", i, pinfo[i]);*/// int seekIndex = 0;for(i = 0;i < temp;i++){if (i == 0){printf("skip pinfo 0\n");continue;//core}printf("pinfo[%d]=%d\n", i, pinfo[i]);//拼接要保存的文件名称,0_xxx.rawsprintf(outputfilename, "%d_%s", i, argv[2]);//打开要保存文件流output = fopen(outputfilename, "wb");if(output < 0){printf("create output file %s fail\n", outputfilename);goto done2;}//跳过 pinfo[i]fseek(input, pinfo[i], SEEK_SET);/*if (i == 0){seekIndex = tempLength;}printf("seekIndex=%d\n", seekIndex);fseek(input, seekIndex, SEEK_SET);*///解压读取数据写入if(Z_OK != inf(input, output)){printf("decompress error\n");ret = -2;goto done2;}fclose(output);output = 0;printf("decompress %s done\n", outputfilename);// seekIndex += pinfo[i];}
done2:fclose(input);if(output) fclose(output);return ret;}
}

三、编译指令

gcc -o zpipe zpipe.c -lz

zpipe下载

四、解压 rawx 文件

使用方法

[compress Example]: zpipe -l 9 logo.raw battery.raw
[decompress Example]: zpipe -d xx.raw logo.raw

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

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

相关文章

MR混合现实在石油化工课堂教学中的应用演示

MR混合现实是一种结合虚拟现实&#xff08;VR&#xff09;和增强现实&#xff08;AR&#xff09;的技术。它不仅能创造出逼真的虚拟环境&#xff0c;还能实时地将数据、图像和信息叠加在真实世界中&#xff0c;为教学提供了无限可能。通过MR混合现实&#xff0c;学生可以在安全…

4D5D影院设备发展前景7D互动影院体验馆应用

5D影院设备发展前景广阔。随着科技的不断进步&#xff0c;5D影院设备在电影行业中的应用越来越广泛。5D影院设备以其独特的沉浸式体验和互动性&#xff0c;吸引了大量观众。未来&#xff0c;随着技术的不断创新和成本的降低&#xff0c;5D影院设备将会得到更多的应用和推广。 首…

微信小程序抓包

https://github.com/water-kid/WeChatOpenDevTools 抓包工具 第一次安装成功了&#xff0c;公众号能抓&#xff0c;&#xff0c;小程序报错&#xff0c;&#xff0c;卸载后安装不起了 方法二&#xff1a; 将version.dll 放入 微信所在目录 E:\Program Files\Tencent\WeChat\[…

黑盒测试方法:原理+实战

目录 一、如何设计测试用例 二、黑盒测试常用方法 1、基于需求进行测试用例的设计 2、等价类 3、边界值 4、判定表分析法&#xff08;因果分析法&#xff09; 5、正交表 6、场景设计法 三、案例补充 1、使用Fiddler模拟弱网 2、针对一个接口该如何测试 一、如何设计测试…

2023Node.js零基础教程(小白友好型),nodejs新手到高手,(二)NodeJS入门——buffer模块、计算机基础、fs模块、path模块

就算步子乱了又如何&#xff0c;接着跳下去就好了。——《闻香识女人》 开始 011_Buffer_介绍与创建 hello&#xff0c;大家好&#xff0c;我们来学习一下buffer。首先来看看 buffer 是一个什么东东。buffer&#xff0c;中文译为缓冲区&#xff0c;是一个类似于数组的对象&am…

视频通话中的Camera操作

视频通话也有打开本地摄像头预览的场景&#xff0c;但打开本地Camera预览逻辑&#xff0c;并非在Dailer APP中实现&#xff0c;具体流程图如下。 Dialer app中只调用 1、setCamera用于打开摄像头 相关动作在Ims apk中实现&#xff0c;open函数最后调用了VTSource.java中的doOp…

“比特币震荡中的秘密信号?技术分析揭示最近走势的关键!“

技术分析 比特币维持在 27,000 美元的支撑位&#xff0c;甚至在此价格水平上形成了新的更高低点。这标志着一个非常有利的发展&#xff0c;表明每小时和每日时间框架上的看涨趋势。 然而&#xff0c;当考虑每周和每月的观点时&#xff0c;我们仍然遇到阻力&#xff0c;这可以…

文本编辑器去除PDF水印

用文本编辑器打开pdf&#xff0c;搜索水印的特殊文字&#xff0c;全部替换。 另外一个水印字母间有空格。 替换完后保存。 重新打开pdf&#xff1a;

基于 ACK Fluid 的混合云优化数据访问(一):场景与架构

作者&#xff1a;车漾&#xff08;必嘫&#xff09; 本系列文章将介绍如何基于 ACK Fluid 支持和优化混合云的数据访问场景。 概述 在 AI 和大数据时代&#xff0c;算力即正义&#xff0c;强大的算力推动了源源不断的创新。然而&#xff0c;企业自建的算力集群存在资源容量和…

浏览器插件开发爬虫记录

常用爬虫有各种各样的反爬限制&#xff0c;而如果是小数据量并且该网站反爬手段非常厉害的前提下&#xff0c;可以考虑使用浏览器插件作为爬虫手段 基本代码来源于这位博主分享的插件代码&#xff0c; 主要在他的基础上加了 请求代理、管理面板、脚本注入拦截到的请求数据和管…

最新AI智能创作系统源码AI绘画系统/支持GPT联网提问/支持Prompt应用

AI绘图专业设计 不得将程序用作任何违法违纪内容&#xff0c;不要让亲人两行泪 界面部分图解构&#xff1a; 前台show&#xff1a; 前端部署&#xff1a; 安装pm2管理器 点击设置 选择v16.19.1版本-切换版本 再新建一个网站 点击设置 添加反向代理-代理名称随便…

【轻松玩转MacOS】安全隐私篇

引言 这一篇将介绍如何保护MacOS的安全&#xff0c;包括如何设置密码&#xff0c;使用防火墙&#xff0c;备份数据等重要环节&#xff0c;避免因不慎操作或恶意攻击带来的安全风险&#xff0c;让你的MacOS之旅更安心、更放心。 一、设置密码&#xff1a;保护你的MacOS的第一道…

windows下在cmd和git bash中执行bash download.sh失败

cmd报错信息&#xff1a; 解决办法&#xff1a; win64-wget-1.21.4 安装软件wget&#xff0c;如下这是64位的包&#xff0c;解压后&#xff0c;下面有个wget.exe&#xff0c;拷贝到C:\Windows\System32、 然后打开cmd&#xff0c;执行wget -V 如上&#xff0c;有版本信息就O…

C语言内存函数

目录 memcpy(Copy block of memory)使用和模拟实现memcpy的模拟实现 memmove(Move block of memory)使用和模拟实现memmove的模拟实现: memset(Fill block of memory)函数的使用扩展 memcmp(Compare two blocks of memory)函数的使用 感谢各位大佬对我的支持,如果我的文章对你有…

教资成绩什么时候出来 2023教资笔试成绩查询时间介绍

上半年教资笔试成绩查询开放时期为2023年4月13日&#xff0c;面试成绩查询开放时间在6月14日。而下半年教资笔试成绩查询开放时间为2023年11月8日&#xff0c;2023下半年教资面试时间是2023年12月9日-10日。 值得一提的是如果考生对成绩有异议的话&#xff0c;还可以在成绩公布…

解决远程视频会议卡顿问题,优化企业网络办公体验

视频会议、在线语音这种交互类的应用都是对网络链路质量有高要求的场景&#xff0c; 而造成视频会议卡顿的原因也是有多方面因素的&#xff0c;比如视频应用服务器或者终端的原因造成&#xff0c;网络当然也是其中很重要的一个因素&#xff0c;比如网络线路质量不稳定&#xff…

PowerShell pnpm : 无法加载文件 C:\Users\lenovo\AppData\Roaming\npm\pnpm.ps1

1、右键点击【开始】&#xff0c;打开Windows PowerShell&#xff08;管理员&#xff09; 2、运行命令set-ExecutionPolicy RemoteSigned 3、根据提示&#xff0c;输入A,回车 此时管理员权限已经可以运行pnpm 如果vsCode还报该错误 继续输入 4、右键点击【开始】&#xff0c;打…

d3dcompiler_43.dll是什么文件?缺失d3dcompiler_43.dll文件修复与解决方法

今天我要和大家分享的是关于d3dcompiler_43.dll丢失的解决方法。我相信很多网友在使用电脑时都遇到过这个问题&#xff0c;那么接下来就让我们一起来探讨一下如何解决这个问题吧&#xff01; 首先&#xff0c;让我们来了解一下d3dcompiler_43.dll文件的总体介绍。d3dcompiler_…

linux将miniconda移去其它位置

linux 机上将 miniconda 的文件夹从 /data/itom/miniconda3 移去 /share/itom/miniconda3&#xff1a; mv /data/itom/miniconda3 /share/itom/之后需要改一系列路径&#xff0c;参考 [1]。因为要改多个文件&#xff0c;遂写个脚本批量改。 ~/.bashrc ~/.bashrc 中 conda 写…

视频怎么压缩?这样做视频变小还清晰

在我们的日常生活和工作中&#xff0c;视频已经成为了不可或缺的一部分。然而&#xff0c;随着视频文件的增大&#xff0c;如何有效地压缩视频以方便存储和传输成了一个重要的问题&#xff0c;如果你还不知道怎么压缩视频大小&#xff0c;不妨试试下面的方法吧~ 方法一&#xf…