赞赏码 & 联系方式 & 个人闲话

逆向工程前言

Lab7

1、阅读https://www.pediy.com/kssd/pediy07/pediy7-705.htm怎样攻破 RSA-1024的算法保护 ?

作者针对RSA算法的弱点借助软件保护程序ASProtect,对随机产生的大素数进行穷举破解。ASProtect - 是一种软件保护软件,能帮助软件设计者很快捷地设立软件辅助保护机制。ASProtect还能提供诸如注册码或不同版本的设置。看似安全的注册码在缩小测试范围,并对爆破机算法加以改进后,在不需要计算随机数种子的条件下,也可以得到在RSA算法中对其安全性起决定性作用的大数p和q。

2、Crackme2.exe

Rules:
1. Do not Patch
2. Sniff a serial for your name
3. write a keygen

Step1: ida反汇编后分析代码

程序比较简单,它对输入的Name进行一些变化操作,从而得到一个字符串。然后将该字符串与输入的Serial进行比对,相同则成功,不同则报错。

Step2:编写密钥机破解原程序
Name经变化操作后的字符串即为密钥,将其打印出来即可。
密钥机代码如下:

#include<iostream>
using namespace std;
int main() {int v5=0;string v10;char v6[20];double v3;cout << "Your Name: ";cin >> v10;v3 = (long double)(-880 * (554445 * v10.length() / 0x64));sprintf(v6, "%i-x019871", v3, 0, 1, v3, v5); //实际上0,1,v3,v5这几个参数都没用cout << "Available Key: ";cout << v6 << endl;return 0;
}

运行结果如下:

Step3:验证

将运行结果输入到原程序进行验证,可以看到该密钥是正确的。

3、Pseudo Random Number Generation Lab

http://www.cis.syr.edu/~wedu/seed/Labs_16.04/Crypto/Crypto_Random_Number/

Task1: Generate Encryption Key in a Wrong Way

1)首先我们运行题目给的程序:

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define KEYSIZE 16
void main()
{int i;char key[KEYSIZE];printf("%lld\n", (long long)time(NULL));srand(time(NULL)); for (i = 0; i < KEYSIZE; i++) {key[i] = rand() % 256;printf("%.2x", (unsigned char)key[i]);}printf("\n");
}

2)程序执行两次,可以看到秒数和生成密钥都是不同的:

3)把“srand(time(NULL));”注释掉,会发现秒数不同但是生成的密钥会一样:

查阅资料可以分析出上述情况产生的原因:

time()函数返回自纪元 Epoch(1970-01-01 00:00:00 UTC)起经过的时间,以秒为单位。

srand()函数播种由函数 rand 使用的随机数发生器。

rand()函数返回一个范围在 0 到 RAND_MAX 之间的伪随机数。

rand()需要借助系统提供的种子来生成伪随机数序列。而srand(unsigned seed)通过参数seed改变系统提供的种子值,从而可以使得每次调用rand函数生成的伪随机数序列不同。如果系统提供的种子没有变化,每次调用rand函数生成的伪随机数序列都是一样的,这也是我们注释掉srand后随机数不再改变的原因。而往往我们会利用time()获取系统时间作为seed。

Task2: Guessing the Key

我们知道密钥的生成方法就是Task1中的方法,而且本题题目给出了IV和一段密文及其对应的明文。所以想要猜解出密钥的方法比较简单,就是从加密文件的时间戳“2018-04-17 23:08:49”往前遍历。当然我们不需使用time函数,直接往srand函数中送入我们指定的秒数即可。按上所述暴力破解,只要得到的密文和题目给的密文一样就说明我们找到了正确的密钥。

代码如下:

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define KEYSIZE 16/*s盒矩阵:The AES Substitution Table*/// 256 位的密匙256 位支持长度为32 个字符
static const unsigned char sbox[256] = {   //static:内部变量  const:只读,不可变常量0x63,0x7c,0x77,0x7b,0xf2,0x6b,0x6f,0xc5,0x30,0x01,0x67,0x2b,0xfe,0xd7,0xab,0x76,0xca,0x82,0xc9,0x7d,0xfa,0x59,0x47,0xf0,0xad,0xd4,0xa2,0xaf,0x9c,0xa4,0x72,0xc0,0xb7,0xfd,0x93,0x26,0x36,0x3f,0xf7,0xcc,0x34,0xa5,0xe5,0xf1,0x71,0xd8,0x31,0x15,0x04,0xc7,0x23,0xc3,0x18,0x96,0x05,0x9a,0x07,0x12,0x80,0xe2,0xeb,0x27,0xb2,0x75,0x09,0x83,0x2c,0x1a,0x1b,0x6e,0x5a,0xa0,0x52,0x3b,0xd6,0xb3,0x29,0xe3,0x2f,0x84,0x53,0xd1,0x00,0xed,0x20,0xfc,0xb1,0x5b,0x6a,0xcb,0xbe,0x39,0x4a,0x4c,0x58,0xcf,0xd0,0xef,0xaa,0xfb,0x43,0x4d,0x33,0x85,0x45,0xf9,0x02,0x7f,0x50,0x3c,0x9f,0xa8,0x51,0xa3,0x40,0x8f,0x92,0x9d,0x38,0xf5,0xbc,0xb6,0xda,0x21,0x10,0xff,0xf3,0xd2,0xcd,0x0c,0x13,0xec,0x5f,0x97,0x44,0x17,0xc4,0xa7,0x7e,0x3d,0x64,0x5d,0x19,0x73,0x60,0x81,0x4f,0xdc,0x22,0x2a,0x90,0x88,0x46,0xee,0xb8,0x14,0xde,0x5e,0x0b,0xdb,0xe0,0x32,0x3a,0x0a,0x49,0x06,0x24,0x5c,0xc2,0xd3,0xac,0x62,0x91,0x95,0xe4,0x79,0xe7,0xc8,0x37,0x6d,0x8d,0xd5,0x4e,0xa9,0x6c,0x56,0xf4,0xea,0x65,0x7a,0xae,0x08,0xba,0x78,0x25,0x2e,0x1c,0xa6,0xb4,0xc6,0xe8,0xdd,0x74,0x1f,0x4b,0xbd,0x8b,0x8a,0x70,0x3e,0xb5,0x66,0x48,0x03,0xf6,0x0e,0x61,0x35,0x57,0xb9,0x86,0xc1,0x1d,0x9e,0xe1,0xf8,0x98,0x11,0x69,0xd9,0x8e,0x94,0x9b,0x1e,0x87,0xe9,0xce,0x55,0x28,0xdf,0x8c,0xa1,0x89,0x0d,0xbf,0xe6,0x42,0x68,0x41,0x99,0x2d,0x0f,0xb0,0x54,0xbb,0x16,
};
//逆向S 盒矩阵
static const unsigned char contrary_sbox[256] = {0x52,0x09,0x6a,0xd5,0x30,0x36,0xa5,0x38,0xbf,0x40,0xa3,0x9e,0x81,0xf3,0xd7,0xfb,0x7c,0xe3,0x39,0x82,0x9b,0x2f,0xff,0x87,0x34,0x8e,0x43,0x44,0xc4,0xde,0xe9,0xcb,0x54,0x7b,0x94,0x32,0xa6,0xc2,0x23,0x3d,0xee,0x4c,0x95,0x0b,0x42,0xfa,0xc3,0x4e,//0x4e0x08,0x2e,0xa1,0x66,0x28,0xd9,0x24,0xb2,0x76,0x5b,0xa2,0x49,0x6d,0x8b,0xd1,0x25,0x72,0xf8,0xf6,0x64,0x86,0x68,0x98,0x16,0xd4,0xa4,0x5c,0xcc,0x5d,0x65,0xb6,0x92,0x6c,0x70,0x48,0x50,0xfd,0xed,0xb9,0xda,0x5e,0x15,0x46,0x57,0xa7,0x8d,0x9d,0x84,0x90,0xd8,0xab,0x00,0x8c,0xbc,0xd3,0x0a,0xf7,0xe4,0x58,0x05,0xb8,0xb3,0x45,0x06,0xd0,0x2c,0x1e,0x8f,0xca,0x3f,0x0f,0x02,0xc1,0xaf,0xbd,0x03,0x01,0x13,0x8a,0x6b,0x3a,0x91,0x11,0x41,0x4f,0x67,0xdc,0xea,0x97,0xf2,0xcf,0xce,0xf0,0xb4,0xe6,0x73,0x96,0xac,0x74,0x22,0xe7,0xad,0x35,0x85,0xe2,0xf9,0x37,0xe8,0x1c,0x75,0xdf,0x6e,0x47,0xf1,0x1a,0x71,0x1d,0x29,0xc5,0x89,0x6f,0xb7,0x62,0x0e,0xaa,0x18,0xbe,0x1b,0xfc,0x56,0x3e,0x4b,0xc6,0xd2,0x79,0x20,0x9a,0xdb,0xc0,0xfe,0x78,0xcd,0x5a,0xf4,0x1f,0xdd,0xa8,0x33,0x88,0x07,0xc7,0x31,0xb1,0x12,0x10,0x59,0x27,0x80,0xec,0x5f,0x60,0x51,0x7f,0xa9,0x19,0xb5,0x4a,0x0d,0x2d,0xe5,0x7a,0x9f,0x93,0xc9,0x9c,0xef,0xa0,0xe0,0x3b,0x4d,0xae,0x2a,0xf5,0xb0,0xc8,0xeb,0xbb,0x3c,0x83,0x53,0x99,0x61,0x17,0x2b,0x04,0x7e,0xba,0x77,0xd6,0x26,0xe1,0x69,0x14,0x63,0x55,0x21,0x0c,0x7d,
};
/*轮常量表 The key schedule rcon table*/
static const unsigned char Rcon[10] = {0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80,0x1b,0x36 };//辅助函数
/*有限域*2乘法 The x2time() function */
static unsigned char x2time(unsigned char x)
{if (x & 0x80){return (((x << 1) ^ 0x1B) & 0xFF);}return x << 1;
}
/*有限域*3乘法 The x2time() function */
static unsigned char x3time(unsigned char x)
{return (x2time(x) ^ x);
}
/*有限域*4乘法 The x4time() function */
static unsigned char x4time(unsigned char x)
{return (x2time(x2time(x)));
}
/*有限域*8乘法 The x8time() function */
static unsigned char x8time(unsigned char x)
{return (x2time(x2time(x2time(x))));
}
/*有限域9乘法 The x9time() function */
static unsigned char x9time(unsigned char x)    //9:1001
{return (x8time(x) ^ x);
}
/*有限域*B乘法 The xBtime() function */
static unsigned char xBtime(unsigned char x)    //B:1011
{return (x8time(x) ^ x2time(x) ^ x);
}
/*有限域*D乘法 The xDtime() function */
static unsigned char xDtime(unsigned char x)    //D:1101
{return (x8time(x) ^ x4time(x) ^ x);
}
/*有限域*E乘法 The xEtime() function */
static unsigned char xEtime(unsigned char x)    //E:1110
{return (x8time(x) ^ x4time(x) ^ x2time(x));
}
/*第三类操作:列混合操作 MixColumns: Process the entire block*/
static void MixColumns(unsigned char *col)//列混合
{unsigned char tmp[4], xt[4];int i;for (i = 0; i < 4; i++, col += 4)  //col代表一列的基地址,col+4:下一列的基地址{tmp[0] = x2time(col[0]) ^ x3time(col[1]) ^ col[2] ^ col[3];  //2 3 1 1tmp[1] = col[0] ^ x2time(col[1]) ^ x3time(col[2]) ^ col[3];   //1 2 3 1tmp[2] = col[0] ^ col[1] ^ x2time(col[2]) ^ x3time(col[3]);   //1 1 2 3tmp[3] = x3time(col[0]) ^ col[1] ^ col[2] ^ x2time(col[3]);   //3 1 1 2//修改后的值 直接在原矩阵上修改col[0] = tmp[0];col[1] = tmp[1];col[2] = tmp[2];col[3] = tmp[3];}
}
//逆向列混淆
static void Contrary_MixColumns(unsigned char *col)
{unsigned char tmp[4];unsigned char xt2[4];//colx2unsigned char xt4[4];//colx4unsigned char xt8[4];//colx8int x;for (x = 0; x < 4; x++, col += 4){tmp[0] = xEtime(col[0]) ^ xBtime(col[1]) ^ xDtime(col[2]) ^ x9time(col[3]);tmp[1] = x9time(col[0]) ^ xEtime(col[1]) ^ xBtime(col[2]) ^ xDtime(col[3]);tmp[2] = xDtime(col[0]) ^ x9time(col[1]) ^ xEtime(col[2]) ^ xBtime(col[3]);tmp[3] = xBtime(col[0]) ^ xDtime(col[1]) ^ x9time(col[2]) ^ xEtime(col[3]);col[0] = tmp[0];col[1] = tmp[1];col[2] = tmp[2];col[3] = tmp[3];}
}
/*第二类操作:行移位:行左循环移位 ShiftRows:Shifts the entire block*/
static void ShiftRows(unsigned char *col)//正向行移位
{unsigned char t;t = col[1]; col[1] = col[5]; col[5] = col[9]; col[9] = col[13]; col[13] = t;t = col[2]; col[2] = col[10]; col[10] = t;t = col[6]; col[6] = col[14]; col[14] = t;t = col[15]; col[15] = col[11]; col[11] = col[7]; col[7] = col[3]; col[3] = t;
}
//逆向行移位
static void Contrary_ShiftRows(unsigned char *col)
{unsigned char t;t = col[13]; col[13] = col[9]; col[9] = col[5]; col[5] = col[1]; col[1] = t;t = col[2]; col[2] = col[10]; col[10] = t;t = col[6]; col[6] = col[14]; col[14] = t;t = col[3]; col[3] = col[7]; col[7] = col[11]; col[11] = col[15]; col[15] = t;
}
/*第一类操作:s盒字节代换替换 SubBytes*/
static void SubBytes(unsigned char *col)//字节代换
{int x;for (x = 0; x < 16; x++){col[x] = sbox[col[x]];}
}
//逆向字节代换
static void Contrary_SubBytes(unsigned char *col)
{int x;for (x = 0; x < 16; x++){col[x] = contrary_sbox[col[x]];}
}
/*第四类操作:轮密钥加 AddRoundKey*/
static void AddRoundKey(unsigned char *col, unsigned char *expansionkey, int round)//密匙加
{int x;for (x = 0; x < 16; x++)   //每1轮操作:4*32bit密钥 = 16个字节密钥{col[x] ^= expansionkey[(round << 4) + x];}
}
/* AES加密总函数 10轮4类操作 Encrypt a single block with Nr Rounds(10,12,14)*/
void AesEncrypt(unsigned char *blk, unsigned char *expansionkey, int Nr)//加密一个区块
{int round;//第1轮之前:轮密钥加AddRoundKey(blk, expansionkey, 0);//第1-9轮:4类操作:字节代换、行移位、列混合、轮密钥加for (round = 1; round <= (Nr - 1); round++){SubBytes(blk);ShiftRows(blk);MixColumns(blk);AddRoundKey(blk, expansionkey, round);}//第10轮:不进行列混合SubBytes(blk);ShiftRows(blk);AddRoundKey(blk, expansionkey, Nr);
}
//AES 解密总函数
void Contrary_AesEncrypt(unsigned char *blk, unsigned char *expansionkey, int Nr)
{int x;AddRoundKey(blk, expansionkey, Nr);Contrary_ShiftRows(blk);Contrary_SubBytes(blk);for (x = (Nr - 1); x >= 1; x--){AddRoundKey(blk, expansionkey, x);Contrary_MixColumns(blk);Contrary_ShiftRows(blk);Contrary_SubBytes(blk);}AddRoundKey(blk, expansionkey, 0);
}void ScheduleKey(unsigned char *inkey, unsigned char *outkey, int Nk, int Nr)//安排一个保密密钥使用
{unsigned char temp[4], t;int x, i;/*copy the key*///第0组:[0-3]直接拷贝for (i = 0; i < (4 * Nk); i++){outkey[i] = inkey[i];}//第1-10组:[4-43]i = Nk;while (i < (4 * (Nr + 1))) //i=4~43 WORD 32bit的首字节地址,每一个4字节{//1次循环生成1个字节扩展密钥,4次循环生成一个WORDfor (x = 0; x < 4; x++)temp[x] = outkey[(4 * (i - 1)) + x];  //i:32bit的首字节地址//i是4的倍数的时候if (i%Nk == 0){/*字循环:循环左移1字节 RotWord()*/t = temp[0]; temp[0] = temp[1]; temp[1] = temp[2]; temp[2] = temp[3]; temp[3] = t;/*字节代换:SubWord()*/for (x = 0; x < 4; x++){temp[x] = sbox[temp[x]];}/*轮常量异或:Rcon[j]*/temp[0] ^= Rcon[(i / Nk) - 1];}for (x = 0; x < 4; x++){outkey[(4 * i) + x] = outkey[(4 * (i - Nk)) + x] ^ temp[x];}++i;}
}
int main()
{//加密后应该得到的密文char Ciphertext[17] = "\xd0\x6b\xf9\xd0\xda\xb8\xe8\xef\x88\x06\x60\xd2\xaf\x65\xaa\x82";//IVchar IV[17] = "\x09\x08\x07\x06\x05\x04\x03\x02\x01\x00\xA2\xB2\xC2\xD2\xE2\xF2";//2018-04-17 23:08:49秒数int ttime = 1524020929;int k;//从2018-04-17 23:08:49往前遍历10个小时for (k = ttime ; k > ttime - 10 * 3600; k--){//明文unsigned char pt[17] = "\x25\x50\x44\x46\x2d\x31\x2e\x35\x0a\x25\xd0\xd4\xc5\xd8\x0a\x34";unsigned char key[KEYSIZE];int i;int j;srand(k);for (j = 0; j < KEYSIZE; j++) {key[j] = rand() % 256;printf("%.2x", (unsigned char)key[j]);}printf("\n");for (i = 0; i < 16; i++){pt[i] = pt[i] ^ IV[i];}unsigned char expansionkey[15 * 16];/*加密*/ScheduleKey(key, expansionkey, 4, 10);  //1、密钥扩展生成AesEncrypt(pt, expansionkey, 10);     //2、AES 加密char result[17];for (i = 0; i < 16; i++){result[i] = pt[i];}//检验是否和应输出的密文一样int flag = 1;for (i = 0; i < 16; i++){if (result[i] != Ciphertext[i]){flag = 0;break;}}//若一致则输出if (flag == 1){printf("we found it: ");for (i = 0; i < KEYSIZE; i++) {//key[i] = rand() % 256;printf("%.2x", (unsigned char)key[i]);}printf("\n");break;}}return 0;
}

运行结果:

最终我们找到了加密密钥:95fa2030e73ed3f8da761b4eb805dfd7

Task 3: Measure the Entropy of Kernel

执行语句:watch -n .1 cat /proc/sys/kernel/random/entropy_avail

Linux下的随机数生成是通过I/O,键盘终端、内存使用量、CPU利用率等方式来收集噪音的,如果噪音不够生成随机数的时候就会被阻塞。

所以移动鼠标、点击鼠标、阅读一个大文件等等只要影响上述因素的操作都会对熵产生影响,我们的观察也验证了我们的猜测。

Task 4: Get Pseudo Random Numbers from /dev/random

执行语句:cat /dev/random | hexdump

仔细观察可以看到如果我不移动鼠标或键入任何内容随机数就会停止生成,但是如果移动鼠标或键入一些东西,随机数就会继续生成。这是因为每当设备给出一个随机数时,随机池的熵就会减小,当熵值达到零时/dev/random会阻塞。

Task 5: Get Random Numbers from /dev/urandom

1)执行语句:cat /dev/urandom | hexdump

执行结果显示,随机数会非常快速地源源不断地生产出来,与移动鼠标之类的操作并没有明显的关联。

2)执行语句:

$ head -c 1M /dev/urandom > output.bin

$ ent output.bin

可以看出虽然是伪随机数,但是随机性依然非常好,ent证实其完全不相关(totally uncorrelated)

3)编写如下代码,生成256位密钥

#include<stdio.h>
#define LEN 32 // 256 bits
int main()
{unsigned char *key = (unsigned char *)malloc(sizeof(unsigned char)*LEN);FILE* random = fopen("/dev/urandom", "r");fread(key, sizeof(unsigned char)*LEN, 1, random);int i;for (i = 0; i < sizeof(unsigned char)*LEN; i++){printf("%.2x", key[i]);}printf("\n");fclose(random);
}

运行结果:

可以看出,实验成功!

4、(选做)gl.exe

Step 1:安装ida插件IDAGolangHelper,还原所有符号

Ida反汇编原程序后,程序的各个函数名称都被省去。这里我们借助IDAGolangHelper脚本,恢复所有符号信息。

Step 2: 分析代码

Mian_main函数如下,它里面调用的函数全是系统函数,没有切入点。

该题的切入点是Mian_main_func2这个函数,代码如下:

它通过对输入的字符串进行chansend1和chanrecv1操作。如果操作使得v22的值变为1,则打印Succeed,并退出;反之则打印Failed,并继续接收用户的输入。我们对if(v22)这个判断语句进行修改,将jnz改为jz,不过这样做会引起进程死锁。所以还是需要分析调用chansend1后,程序对字符串进行了何种操作。但我们确实是分析不出来了。

逆向工程实验Lab7相关推荐

  1. 逆向工程实验——lab8(C/C++反逆向、Java字节码反逆向)

    文章目录 1.Wintel Machine Code Anti-Reversing Exercise 标题的提示文字 6个功能的提示文字 功能2:添加记录 方法一:修改跳转 方法二:修改返回值 第一种 ...

  2. 逆向工程实验——pre9(可执行文件的加密MD5碰撞lab)

    目录标题 1.阅读 2.阅读 3.阅读 4.阅读下面这三篇文章: 5.MD5 Collision Attack Lab Task 1:使用相同的MD5哈希值生成两个不同的文件 问题1:如果前缀文件的长 ...

  3. 逆向工程实验Lab6

    赞赏码 & 联系方式 & 个人闲话 逆向工程前言 Lab6 1.Yet another crackme (or rather keygenme). Executables: Linux ...

  4. 逆向工程实验_lab0(密码学算法逆向)

    文章目录 一级目录 1. cipher text 2. cipher text 3. Vigenere cipher text 4.Rar file without password 一级目录 1. ...

  5. 逆向工程实验Lab0

    赞赏码 & 联系方式 & 个人闲话 逆向工程前言 Lab0 1. cipher text bmjs dtz uqfd ymj lfrj tk ymwtsjx dtz bns tw dt ...

  6. 逆向工程实验Lab1

    赞赏码 & 联系方式 & 个人闲话 逆向工程前言 Lab1 1.This is a security check to prevent automated programs from ...

  7. 逆向工程实验Lab3

    赞赏码 & 联系方式 & 个人闲话 逆向工程前言 Lab3 1.阅读:https://blog.csdn.net/cnhk1225/article/details/53568996然后 ...

  8. 逆向工程实验_pre1(密码学算法破解)

    文章目录 一.Base64编码算法 二.pyc文件反编译 三.sha1算法破解 四.数据库的sha1密码破解 一.Base64编码算法 一.搜索Base64算法资料,详细解释该算法.用Python实现 ...

  9. 逆向工程实验Pre5

    赞赏码 & 联系方式 & 个人闲话 逆向工程前言 Pre5 1.阅读PE文件格式全接触 https://bbs.pediy.com/thread-22892.htm 可移植的可执行文件 ...

最新文章

  1. window远程桌面连接centos7
  2. rabbitmq系列问题解决:406, “PRECONDITION_FAILED - inequivalent arg ‘durable‘
  3. iis+nginx实现负载均衡
  4. 机器人学习--全局定位(阿尔伯塔大学张宏教授报告)
  5. 五分钟带你了解Django框架设计思想!
  6. 【HDU - 1263】 水果(STL)
  7. Google 地图 google map api / 地图有关
  8. JS你可能还不知道的一些知识点(一)
  9. 摊牌了!2021年3D视觉算法岗求职群
  10. Spring+Mybatis+SpringMVC后台与前台分页展示实例(附工程)(转)
  11. 关于Big-Endian 和Little-Endian
  12. SPSS24.0输了授权码还不能用怎么破?
  13. 精益软件开发(Lean Software Development)
  14. 获取打印机分辨率_喵喵机体验——爱不释手的错题打印机
  15. 计算机进入端口模式命令提示符,Win10使用命令提示符删除端口占用方法Win10查看端口占用状态...
  16. VS2015+Qt5.13.1安装教程
  17. 进入加密的QQ空间方法
  18. 杭州电子科技大学acm--2006
  19. exactly-once在Flink里的实现
  20. 网上得到的一个3D渲染引擎

热门文章

  1. Pannel DB支持定时文件、数据库备份、系统防御、监控告警、中间件安装
  2. 卸载了瑞星防火墙 感觉真是爽
  3. 5G注册流程分级详解Step4-8
  4. 透过容抗来看电容量和频率的关系
  5. HTML5期末大作业:出行网站设计——西安旅游-高质量(9页) HTML+CSS+JavaScript 学生DW网页设计
  6. 群控 云控营销神器代码研究
  7. IOS错误之----警告 Local declaration of 'XXX' hides insta
  8. C3AE: Exploring the Limits of Compact Model for Age Estimation
  9. 谷歌浏览器打开金格在线编辑插件
  10. 很火的区块链头部游戏《Axie Infinity》单日盈收竟与王者荣耀争锋,它是什么?