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

某手游完整性校验分析

前言

只是普通的单机手游,广告比较多,所以分析处理了下,校验流程蛮有意思的,所以就分享出来了

1.重打包崩溃处理

样本进行了加固,对其dump出dex后重打包出现崩溃

ida分析地址发现为jni函数引起

利用Xposed直接替换该函数,崩溃问题解决

1

2

3

4

5

6

XposedHelpers.findAndHookMethod("com.unity3d.player.UnityPlayerActivity", classLoader, "IsHDR_DisplayBoot", java.lang.String.class, java.lang.String.classnew XC_MethodReplacement() {

    @Override

    protected Object replaceHookedMethod(MethodHookParam methodHookParam) throws Throwable {

        return null;

    }

});

2.卡加载界面处理

但是出现了新的问题,游戏卡在了加载页面

对该类的其他jni函数进行分析,发现supportVulkan很明显进行了签名读取,对其去除签名校验。

此处参考项目:ApkSignatureKillerEx

3.地图无法进入问题分析(基于原包)

去除完签名校验后,游戏能正常进入主页面,但是点击游戏地图没有任何反应。

在对原包进行多次测试发现,在首次启动游戏时,如果断网也会出现无法正常进入地图的问题,怀疑是游戏首次启动进行了网络请求进行数据校验

经过抓包对比定位到可疑数据包

利用Frida的算法通杀脚本没有定位到相关内容,怀疑是so层进行了请求

3.1 hook send函数进行调用栈分析

通过调用栈可以很清晰看到请求是从unity引擎相关的so中发出的。

3.2 il2cppTrace对请求调用栈分析

查阅资料,在unity中,网络请求主要通过UnityWebRequest 类来执行网络请求,利用frida-il2cpp-bridge对UnityWebRequest进行trace,打印调用栈得

1

2

3

4

5

6

7

8

9

10

0x0247db9c ┌─UnityEngine.Networking.UnityWebRequest::.ctor(this = UnityEngine.Networking.UnityWebRequest, url = "http://106.54.194.167:8077/CheckUpdate", method = "POST")

0x0247db00 │ ┌─UnityEngine.Networking.UnityWebRequest::set_url(this = UnityEngine.Networking.UnityWebRequest, value = "http://106.54.194.167:8077/CheckUpdate")

0x0247ef38 │ │ ┌─UnityEngine.Networking.UnityWebRequest::InternalSetUrl(this = UnityEngine.Networking.UnityWebRequest, url = "http://106.54.194.167:8077/CheckUpdate")

0x0247ef38 │ │ └─UnityEngine.Networking.UnityWebRequest::InternalSetUrl

0x0247db00 │ └─UnityEngine.Networking.UnityWebRequest::set_url

0x0247dc1c │ ┌─UnityEngine.Networking.UnityWebRequest::set_method(this = UnityEngine.Networking.UnityWebRequest, value = "POST")

0x0247e4e0 │ │ ┌─UnityEngine.Networking.UnityWebRequest::InternalSetMethod(this = UnityEngine.Networking.UnityWebRequest, methodType = Post)

0x0247e4e0 │ │ └─UnityEngine.Networking.UnityWebRequest::InternalSetMethod

0x0247dc1c │ └─UnityEngine.Networking.UnityWebRequest::set_method

0x0247db9c └─UnityEngine.Networking.UnityWebRequest::.ctor

在IDA中进行交叉引用分析定位到UnitySDKManager类

1

2

3

追踪调用定位到

class UnitySDK.UnitySDKManager.<PostData>d__25 : System.Object, System.Collections.Generic.IEnumerator<System.Object>, System.Collections.IEnumerator, System.IDisposable

    private Boolean MoveNext() { }

增加UnitySDKManager类重新对其trace(因为出现报错,把参数输出关了)

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

0x00b15b44 ┌─UnitySDK.UnitySDKManager::ServerVerifyApk

0x00b04b3c │ ┌─UnitySDK.UnitySDKManager::GetFileInfoList

0x00b04b3c │ └─UnitySDK.UnitySDKManager::GetFileInfoList

0x00b06ec0 │ ┌─UnitySDK.UnitySDKManager::GetGamePackageName

0x00b06ec0 │ └─UnitySDK.UnitySDKManager::GetGamePackageName

0x00b06204 │ ┌─UnitySDK.UnitySDKManager::GetSDKVersion

0x00b06204 │ └─UnitySDK.UnitySDKManager::GetSDKVersion

0x00b06278 │ ┌─UnitySDK.UnitySDKManager::HexStringToHex

0x00b06278 │ └─UnitySDK.UnitySDKManager::HexStringToHex

0x00b10fcc │ ┌─UnitySDK.UnitySDKManager::EncryptString

0x00b10fcc │ └─UnitySDK.UnitySDKManager::EncryptString

0x00b100a4 │ ┌─UnitySDK.UnitySDKManager::PostData

0x00a341fc │ │ ┌─UnitySDK.UnitySDKManager.<PostData>d__25::.ctor

0x00a341fc │ │ └─UnitySDK.UnitySDKManager.<PostData>d__25::.ctor

0x00b100a4 │ └─UnitySDK.UnitySDKManager::PostData

0x00a3422c │ ┌─UnitySDK.UnitySDKManager.<PostData>d__25::MoveNext

0x00b12be4 │ │ ┌─UnitySDK.UnitySDKManager::GetUrl

0x00b12be4 │ │ └─UnitySDK.UnitySDKManager::GetUrl

0x0247db9c │ │ ┌─UnityEngine.Networking.UnityWebRequest::.ctor

0x0247db00 │ │ │ ┌─UnityEngine.Networking.UnityWebRequest::set_url

0x0247ef38 │ │ │ │ ┌─UnityEngine.Networking.UnityWebRequest::InternalSetUrl

0x0247ef38 │ │ │ │ └─UnityEngine.Networking.UnityWebRequest::InternalSetUrl

0x0247db00 │ │ │ └─UnityEngine.Networking.UnityWebRequest::set_url

0x0247dc1c │ │ │ ┌─UnityEngine.Networking.UnityWebRequest::set_method

0x0247e4e0 │ │ │ │ ┌─UnityEngine.Networking.UnityWebRequest::InternalSetMethod

0x0247e4e0 │ │ │ │ └─UnityEngine.Networking.UnityWebRequest::InternalSetMethod

0x0247dc1c │ │ │ └─UnityEngine.Networking.UnityWebRequest::set_method

0x0247db9c │ │ └─UnityEngine.Networking.UnityWebRequest::.ctor

0x0247e0f4 │ │ ┌─UnityEngine.Networking.UnityWebRequest::set_uploadHandler

0x0247e0f4 │ │ └─UnityEngine.Networking.UnityWebRequest::set_uploadHandler

0x0247dfdc │ │ ┌─UnityEngine.Networking.UnityWebRequest::set_downloadHandler

0x0247dfdc │ │ └─UnityEngine.Networking.UnityWebRequest::set_downloadHandler

0x0247f66c │ │ ┌─UnityEngine.Networking.UnityWebRequest::SetRequestHeader

0x0247f66c │ │ └─UnityEngine.Networking.UnityWebRequest::SetRequestHeader

0x0247e42c │ │ ┌─UnityEngine.Networking.UnityWebRequest::Send

0x0247e430 │ │ │ ┌─UnityEngine.Networking.UnityWebRequest::SendWebRequest

0x0247e42c │ │ │ └─UnityEngine.Networking.UnityWebRequest::Send

0x0247e430 │ │ └─UnityEngine.Networking.UnityWebRequest::SendWebRequest

0x00a3422c │ └─UnitySDK.UnitySDKManager.<PostData>d__25::MoveNext

0x00a34cd4 │ ┌─UnitySDK.UnitySDKManager.<PostData>d__25::System.Collections.IEnumerator.get_Current

0x00a34cd4 │ └─UnitySDK.UnitySDKManager.<PostData>d__25::System.Collections.IEnumerator.get_Current

0x00b15b44 └─UnitySDK.UnitySDKManager::ServerVerifyApk

通过调用栈可以初步对校验流程进行了解,主要通过ServerVerifyApk函数进行校验,经过一系列字符串加解密,最后进行网络请求

3.3 加解密函数hook分析

对关键函数进行hook分析

1

2

3

4

5

6

0x00b10fcc │ UnitySDK.UnitySDKManager::EncryptString

0x00b0b13c │ UnitySDK.UnitySDKManager::DecryptString

il2cpp: EncryptString:"{"appid":"com.meta.peopleground.dream","appName":"com.meta.peopleground.dream","appVer":"1.0.1","sdkVer":"2","appFileList":"981lDpbOb+vjRn/3yI74fI+1S5cr08qKLGq0xg7TcfFOA7hRePAQjXPCgIzEC+p58RThRtl4PIsPEgiJZVYn1e2oZl06jeKGD6+C0Zy6lQaDiAVaOtO5szilZxfmN2j8XtlBmBaOzOVBBi6ctJamGsfM2XbkGqYtf/TlNyvOZ8p5YDdOgnhG+WonkjG1sGEbuqc4sm+hkCxOC7dX1rEM4/5S6wT1erPL5+iWJoRpiTuHok15zCQjdNFCXn97Vwg+/h8eXrtxrDvkkLqqCff2D0WrAISmIOi4fY97ulhpz5Pey2vJlkLK5MdSApENx4exv3t4Q1sVfoPojwDueXAW9T1RTOc1LeK0cYMrBjsE1W8="}"

il2cpp: EncryptString result:"xoJRLdGOAd21Q0JEIDiJqlciJFWy0jtiSLU7lNue9ZLAOxsuEkWvJwP8o3ub4CfcIjulssJC+ocK0ai3lkr1XfNXlLi2QJ0iTtYzbCDQqYmqXr7uTTdOrAK3Y6NKkd+mYgFF+J2w7tY/rl5NBPPlwRWWbvw45CRp3JX34BkKTA2KEXiWywj90T3Qw72AnpWgBOo1rD3USuAVQeN8EOhxVc1jTjsBn2qSfZX38tNC73wvceexa4w5wOea9rzaRshViPWjFkNko/BDuaAyWDJbB656FNatES6/WA3+f7qMlQmEU4BGrX72+StLzsNQYc+QZ4KDFnWwqfhuH1zCudxxDoNpi53fqv+DavLwmRRE19e1clgW5ANilhelSIGi9U9nq2BcNr3GMJ8eI2FAV76U1FHONbyMUggUYr6cDc9Vo9l5Wc4UVD4+tqDmulUW1L1s8NTkieyVDEJxb1o6166fVVWdUKNBlrIXDfbWjE6gLheTHfp1/ywUy4EcVSklERsEkdufZrdKM57XVkXcKFnA0hutpuKqCbbkthULifwkAtwyQ/qSdcZHIh6pNYGuLOFF5NiCsHhJ6D/O03/uUgsR/V5WwRGuOeZFsM2NK+NcyYjHDkoKh6SjoEnZZ/yfg1M4kOUJy5qG/V1jR8IqOmZ84w=="

il2cpp: DecryptString:"+CVWCEji2Lgf4nUTWb7J/Q=="

il2cpp: DecryptString result:"100"

发现之前抓包获得的请求体相对应,其中,appFileList还是密文,继续分析

3.4 追EncryptString函数

与dump.cs中的函数进行对照发现v14 由字符串转hex转base64获得

1

System.Byte[] HexStringToHex(System.String inputHex); // 0x00b06278

hook HexStringToHex 函数获得参数

1

il2cpp: inputHex:"f7cd650e96ce6febe3467ff7c88ef87c8fb54b972bd3ca8a2c6ab4c60ed371f14e03b85178f0108d73c2808cc40bea79f114e146d9783c8b0f120889655627d5eda8665d3a8de2860faf82d19cba95068388055a3ad3b9b338a56717e63768fc5ed94198168ecce541062e9cb496a61ac7ccd976e41aa62d7ff4e5372bce67ca7960374e827846f96a279231b5b0611bbaa738b26fa1902c4e0bb757d6b10ce3fe52eb04f57ab3cbe7e896268469893b87a24d79cc242374d1425e7f7b57083efe1f1e5ebb71ac3be490baaa09f7f60f45ab0084a620e8b87d8f7bba5869cf93decb6bc99642cae4c75202910dc787b1bf7b78435b157e83e88f00ee797016f53d514ce7352de2b471832b063b04d56f"

IDA继续查找调用发现其中字符串由GetFileInfoList函数获得

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

// static System.IntPtr GetFileInfoList(); // 0x00b04b3c

__int64 sub_B04B3C()

{

  __int64 (*v0)(void); // x8

  __int64 v2[5]; // [xsp+0h] [xbp-40h] BYREF

  int v3; // [xsp+28h] [xbp-18h]

  char v4; // [xsp+2Ch] [xbp-14h]

  v0 = (__int64 (*)(void))qword_30365A0;

  if ( !qword_30365A0 )

  {

    v3 = 0;

    v2[0] = (__int64)"UnitySDK";

    v2[1] = 8LL;

    v2[2] = (__int64)"GetFileInfoList";

    v2[3] = 15LL;

    v2[4] = 0x200000000LL;

    v4 = 0;

    v0 = (__int64 (*)(void))sub_812FB4(v2);

    qword_30365A0 = (__int64)v0;

  }

  return v0();

}

很明显,调用了libUnitySDK.so中的GetFileInfoList函数获得

3.5 libUnitySDK.so分析

1

2

3

4

__int64 GetFileInfoList()

{

  return FileInfoListStr;

}

FileInfoListStr在writeFileJson函数中被赋值,而writeFileJson则是由java函数上文中的IsHDR_DisplayBoot调用(该函数首个参数为base.apk路径)

很明显,ll11l1l1ll函数 对之前的明文字符串进行了加密,frida hook打印参数

1

2

3

4

5

6

7

8

9

10

11

12

13

args: {

        "HashList" :

        {

                "AndroidManifest.xml" " c72b1d2",

                "assets/bin/Data/Managed/Metadata/game.dat" "a34a757d",

                "classes.dex" "58b6cf21",

                "lib/arm64-v8a/libUnitySDK.so" "b56d5af4",

                "lib/armeabi-v7a/libUnitySDK.so" "3d548ba2"

        },

        "fileCount" 1620

}

returnResult: f7cd650e96ce6febe3467ff7c88ef87c8fb54b972bd3ca8a2c6ab4c60ed371f14e03b85178f0108d73c2808cc40bea79f114e146d9783c8b0f120889655627d5eda8665d3a8de2860faf82d19cba95068388055a3ad3b9b338a56717e63768fc5ed94198168ecce541062e9cb496a61ac7ccd976e41aa62d7ff4e5372bce67ca7960374e827846f96a279231b5b0611bbaa738b26fa1902c4e0bb757d6b10ce3fe52eb04f57ab3cbe7e896268469893b87a24d79cc242374d1425e7f7b57083efe1f1e5ebb71ac3be490baaa09f7f60f45ab0084a620e8b87d8f7bba5869cf93decb6bc99642cae4c75202910dc787b1bf7b78435b157e83e88f00ee797016f53d514ce7352de2b471832b063b04d56f

其中 HashList 中文件对应的值为文件的 crc
至此,除了具体的字符串加密算法,游戏的校验流程已经很清晰

4.校验流程归纳

  • 签名校验
  • 读取base.apk进行关键文件crc读取
  • 进行服务器请求,对关键文件crc校验

5.后记

对该校验去除的思路:

  • 对读取安装包的函数 zip_open 或java层的 IsHDR_DisplayBoot 函数进行hook,进行参数替换,进行io重定向
  • 基于il2cpp中的ServerVerifyApk函数进行更详细的分析,直接对其检测去除

相关文章:

某手游完整性校验分析

前言 只是普通的单机手游&#xff0c;广告比较多&#xff0c;所以分析处理了下&#xff0c;校验流程蛮有意思的&#xff0c;所以就分享出来了 1.重打包崩溃处理 样本进行了加固&#xff0c;对其dump出dex后重打包出现崩溃 ida分析地址发现为jni函数引起 利用Xposed直接替换…...

【ElasticSearch】学习使用DSL和RestClient编写查询语句

文章目录 DSL和RestClient的学习前言1、DSL查询文档1.1 查询分类1.2 全文检索查询1.21 全文检索概述1.2.2 基本使用 1.3 精确查询1.3.1 term查询1.3.2 range查询 1.4 地理坐标查询1.4.1 geo_bounding_box查询1.4.2 geo_distance查询 1.5 复合查询1.5.1 常见相关性算法1.5.2 算分…...

asp.net外卖网站系统VS开发mysql数据库web结构c#编程Microsoft Visual Studio

一、源码特点 asp.net外卖网站系统 是一套完善的web设计管理系统&#xff0c;系统采用mvc模式&#xff08;BLLDALENTITY&#xff09;系统具有完整的源代码和数据库&#xff0c;系统主要采用B/S模式开发。开发环境为vs2010&#xff0c;数据库为mysql&#xff0c;使用c#语…...

2.4.0 Milky Way 强势登场!新功能大爆炸,让你High翻全场!

Yo开发达人们&#xff0c;我们有重磅新功能要给你们放送啦&#xff01; Check it out 数据汇总不再单调&#xff0c;新的聚合函数登场&#xff01; compact_state_agg #1359gauge_agg #1370first #1395last #1413mode #1440increase #1476delta #1395time_delta #1405rate #14…...

C语言----静态链接库和动态链接库

在前面的文章中讲到可执行程序的生成需要经过预处理&#xff0c;编译&#xff0c;汇编和链接四个步骤&#xff0c;链接阶段是链接器将该目标文件与其他目标文件、库文件、启动文件等链接起来生成可执行文件。 需要解读一下库文件&#xff0c;我们可以将库文件等价为压缩包文件&…...

PCA(主成分分析)数据降维技术代码详解

引言 随着大数据时代的到来&#xff0c;我们经常会面临处理高维数据的问题。高维数据不仅增加了计算复杂度&#xff0c;还可能引发“维度灾难”。为了解决这一问题&#xff0c;我们需要对数据进行降维处理&#xff0c;即在不损失太多信息的前提下&#xff0c;将数据从高维空间…...

Git版本控制系统之分支与标签(版本)

目录 一、Git分支&#xff08;Branch&#xff09; 1.1 分支作用 1.2 四种分支管理策略 1.3 使用案例 1.3.1 指令 1.3.2 结合应用场景使用 二、Git标签&#xff08;Tag&#xff09; 2.1 标签作用 2.2 标签规范 2.3 使用案例 2.3.1 指令 2.3.2 使用示例 一、Git分支&…...

JSP运行环境搭建

将安装JSP引擎的计算机称作一个支持JSP的Web服务器。这个服务器负责运行JSP&#xff0c;并将运行结果返回给用户。 JSP的核心内容之一就是编写JSP页面,JSP页面是Web应用程序的重要组成部分之一。一个简单Web应用程序可能只有一个JSP页面,而一个复杂的Web应用程序可能由许多JSP…...

React通过属性 (props) 和状态 (state) 来传递和管理组件的数据

import React, { useState } from react;// 子组件 const ChildComponent (props) > {return (<div><h2>Hello, {props.name}!</h2></div>); }// 父组件 const ParentComponent () > {const [name, setName] useState(John Doe);const handle…...

Web相机和浏览器的二维码扫描方案

Web相机和适用于浏览器的二维码扫描方案 qr-camera 在线体验 | English 功能 支持浏览器扫描二维码支持拍照支持录像功能支持二维码解析和生成 quickstart npm i qr-cameraimport {QRCamera} from qr-camera;function main(){const camera new QRCamera();document.body…...

云端部署ChatGLM-6B

大模型这里更新是挺快的&#xff0c;我参考的视频教程就和我这个稍微有些不一样&#xff0c;这距离教程发布只过去4天而已… 不过基本操作也差不多 AutoDL算力云&#xff1a;https://www.autodl.com/home ChatGLM3&#xff1a;https://github.com/THUDM/ChatGLM3/tree/main Hug…...

设计模式(3)-结构型模式

结构型模式 结构型模式描述如何将类或对象按某种布局组成更大的结构。它分为类结构型模式和对象结构型模式&#xff0c;前者采用继承机制来组织接口和类&#xff0c;后者釆用组合或聚合来组合对象。 由于组合关系或聚合关系比继承关系耦合度低&#xff0c;满足“合成复用原则…...

C/C++调试工具 - gdb详解

C/C调试工具 -gdb详解 1 简介 2 常用的命令 3 使用的条件 4 程序调试 4.1 直接运行程序 4.2 断点调试(在某一行) 4.3 断点调试(在函数入口处打断点) 5 调试core文件 5.1 生成core文件的方法 5.2 调试core文件 1 简介 GDB是Linux下非常好用且强大的调试工具。GD…...

传奇GOM引擎微端连接不上如何解决

Gom传奇引擎的微端连不上的原因可能有很多&#xff0c;比如网络问题、服务器配置问题、版本兼容性问题等。1.检查网络连接&#xff1a;首先要确保你的网络连接稳定。如果遇到网络问题&#xff0c;比如网络延迟过高&#xff0c;可能会导致你无法连接到服务器。建议使用稳定的网络…...

Easymesh介绍

1.什么是Easymesh 什么是Easymesh,这里需要介绍到有3个点,分别是WFA、MAP和Easymesh。 WFA是Wi-Fi 联盟,Wi-Fi 联盟是专门针对 Wi-Fi 主题的标准创建机构,并且制定新标准,在 Wi-Fi 基础上提供可用功能,全球成员超过 800 家(SoC、制造商和 SW 公司) MAP 是 Multi-AP Te…...

图像相似度对比方法

1.哈希方法&#xff0c;其中包括均值哈希、插值哈希、感知哈希方法。计算出图片的哈希值&#xff0c;一般使用汉明 距离计算两个图片间的差距。 2.直方图算法&#xff0c;其中包括灰度直方图算法&#xff0c;RGB直方图算法&#xff0c; 3.灰度图算法&#xff1a;MSE、SSIM、…...

C++ 配合图形库实现画线效果

#include<stdio.h> #include <conio.h> #include<math.h> #include <graphics.h> // 引用图形库头文件 #define N 12 int List[N][N];void draw() {for (int i 0; i < N; i) {int x 200 * cos(2 * 3.14 * i / N);int y 200 * sin(2 * 3.1…...

zookeeper应用之分布式屏障

分布式系统中某些节点任务当满足某个条件时才允许继续运行&#xff0c;如果不满足则当前节点需要等待。这个时候就需要一个屏障来阻止节点的处理。ZooKeeper Barrier是ZooKeeper提供的一种用于分布式环境中实现同步和协调的机制。具体逻辑就是&#xff1a; 1、检测某个barrier…...

PDBADMIN 的作用,命名,重建 以及能否DROP

Creating a pluggable database using below SQL: create pluggable database psample1 admin user psample_admin identified by "XXXXXXXXXXXXXXX roles(connect) create_file_destDGEHDB; What if user psample_admin gets dropped accidentally? Is it important?…...

华为L410上制作内网镜像模板02

原文链接&#xff1a;华为L410上制作离线安装软件模板02 hello&#xff0c;大家好啊&#xff0c;今天给大家带来第二篇在内网搭建Apache服务器&#xff0c;用于安装完内网操作系统后&#xff0c;在第一次开机时候&#xff0c;为系统安装软件的文章&#xff0c;今天给大家介绍在…...

基于距离变化能量开销动态调整的WSN低功耗拓扑控制开销算法matlab仿真

目录 1.程序功能描述 2.测试软件版本以及运行结果展示 3.核心程序 4.算法仿真参数 5.算法理论概述 6.参考文献 7.完整程序 1.程序功能描述 通过动态调整节点通信的能量开销&#xff0c;平衡网络负载&#xff0c;延长WSN生命周期。具体通过建立基于距离的能量消耗模型&am…...

家政维修平台实战20:权限设计

目录 1 获取工人信息2 搭建工人入口3 权限判断总结 目前我们已经搭建好了基础的用户体系&#xff0c;主要是分成几个表&#xff0c;用户表我们是记录用户的基础信息&#xff0c;包括手机、昵称、头像。而工人和员工各有各的表。那么就有一个问题&#xff0c;不同的角色&#xf…...

Java多线程实现之Callable接口深度解析

Java多线程实现之Callable接口深度解析 一、Callable接口概述1.1 接口定义1.2 与Runnable接口的对比1.3 Future接口与FutureTask类 二、Callable接口的基本使用方法2.1 传统方式实现Callable接口2.2 使用Lambda表达式简化Callable实现2.3 使用FutureTask类执行Callable任务 三、…...

精益数据分析(97/126):邮件营销与用户参与度的关键指标优化指南

精益数据分析&#xff08;97/126&#xff09;&#xff1a;邮件营销与用户参与度的关键指标优化指南 在数字化营销时代&#xff0c;邮件列表效度、用户参与度和网站性能等指标往往决定着创业公司的增长成败。今天&#xff0c;我们将深入解析邮件打开率、网站可用性、页面参与时…...

2025年渗透测试面试题总结-腾讯[实习]科恩实验室-安全工程师(题目+回答)

安全领域各种资源&#xff0c;学习文档&#xff0c;以及工具分享、前沿信息分享、POC、EXP分享。不定期分享各种好玩的项目及好用的工具&#xff0c;欢迎关注。 目录 腾讯[实习]科恩实验室-安全工程师 一、网络与协议 1. TCP三次握手 2. SYN扫描原理 3. HTTPS证书机制 二…...

从“安全密码”到测试体系:Gitee Test 赋能关键领域软件质量保障

关键领域软件测试的"安全密码"&#xff1a;Gitee Test如何破解行业痛点 在数字化浪潮席卷全球的今天&#xff0c;软件系统已成为国家关键领域的"神经中枢"。从国防军工到能源电力&#xff0c;从金融交易到交通管控&#xff0c;这些关乎国计民生的关键领域…...

微服务通信安全:深入解析mTLS的原理与实践

&#x1f525;「炎码工坊」技术弹药已装填&#xff01; 点击关注 → 解锁工业级干货【工具实测|项目避坑|源码燃烧指南】 一、引言&#xff1a;微服务时代的通信安全挑战 随着云原生和微服务架构的普及&#xff0c;服务间的通信安全成为系统设计的核心议题。传统的单体架构中&…...

热烈祝贺埃文科技正式加入可信数据空间发展联盟

2025年4月29日&#xff0c;在福州举办的第八届数字中国建设峰会“可信数据空间分论坛”上&#xff0c;可信数据空间发展联盟正式宣告成立。国家数据局党组书记、局长刘烈宏出席并致辞&#xff0c;强调该联盟是推进全国一体化数据市场建设的关键抓手。 郑州埃文科技有限公司&am…...

深度解析:etcd 在 Milvus 向量数据库中的关键作用

目录 &#x1f680; 深度解析&#xff1a;etcd 在 Milvus 向量数据库中的关键作用 &#x1f4a1; 什么是 etcd&#xff1f; &#x1f9e0; Milvus 架构简介 &#x1f4e6; etcd 在 Milvus 中的核心作用 &#x1f527; 实际工作流程示意 ⚠️ 如果 etcd 出现问题会怎样&am…...

Axure Rp 11 安装、汉化、授权

Axure Rp 11 安装、汉化、授权 1、前言2、汉化2.1、汉化文件下载2.2、windows汉化流程2.3、 macOs汉化流程 3、授权 1、前言 Axure Rp 11官方下载链接&#xff1a;https://www.axure.com/downloadthanks 2、汉化 2.1、汉化文件下载 链接: https://pan.baidu.com/s/18Clf…...