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

星痕共鸣数据分析2

今天实验内容是攻击力部分

1.思路
由于昨天数据分析出了一个函数
这个函数可以把奇怪的字节变成正常的数字

int parse_varint(unsigned const char* data, int count)
{int value = 0;int shift = 0;for (int i = 0; i < count; i++) {unsigned char byte = data[i];value |= ((byte & 0x7F) << shift);shift += 7;}return value;
}

然后,我们把函数逆推,得到下面的函数
这个函数可以把正常的数字变成奇怪的字符

void encode_varint(unsigned char* output, int* count, int value)
{*count = 0;do {unsigned char byte = value & 0x7F;value >>= 7;if (value != 0) {byte |= 0x80;  // 设置最高位表示还有后续字节}output[(*count)++] = byte;} while (value != 0);
}

然后我们攻击一下场景内的怪物,造成伤害346,然后抓包
346代入上面的函数,得到0xda, 0x02
结合抓包信息
在这里插入图片描述
我们可以看到伤害0xda, 0x02已经在包里面出现了(这个包的数据量比较多)
为了确保正确性,可以多次抓包验证

然后,分析字节数据发现大多数数据都是0x12+长度
可以用这个分析结构

#include <iostream>
#include <vector>
#include <iomanip>
#include <memory>
#include"XHGM.h"
// 定义段节点结构
struct Segment {int length;  // 数据段长度(不包括起始的0x12和长度字节)std::vector<unsigned char> data;  // 段数据(可能包含子段)std::vector<std::unique_ptr<Segment>> children;  // 子段列表
};// 递归解析数据为树形结构
std::unique_ptr<Segment> parseSegment(const unsigned char* data, int data_size, int& index, int depth = 0) {if (index >= data_size) return nullptr;// 创建新节点auto node = std::make_unique<Segment>();// 验证起始字节if (data[index] != 0x12) {std::cerr << "Error: Expected 0x12 at index " << index << ", found 0x"<< std::hex << std::setw(2) << std::setfill('0')<< static_cast<int>(data[index]) << std::endl;index++;  // 跳过无效字节return nullptr;}index++;  // 跳过0x12// 获取段长度if (index >= data_size) {std::cerr << "Error: Missing length byte at index " << index << std::endl;return nullptr;}node->length = static_cast<int>(data[index]);index++;  // 跳过长度字节// 提取段数据int end_index = index + node->length;if (end_index > data_size) {std::cerr << "Error: Incomplete segment at index " << index<< ", declared length: " << node->length << std::endl;return nullptr;}// 递归解析嵌套的子段while (index < end_index) {if (data[index] == 0x12) {// 递归解析子段auto child = parseSegment(data, data_size, index, depth + 1);if (child) {node->children.push_back(std::move(child));}}else {// 添加普通数据字节node->data.push_back(data[index]);index++;}}return node;
}// 打印树形结构
void printSegmentTree(const Segment* node, int depth = 0) {if (!node) return;// 缩进表示层级std::string indent(depth * 2, ' ');// 打印当前节点信息std::cout << indent.c_str() << "Segment (Length=" << node->length << "): ";// 打印原始数据if (!node->data.empty()) {std::cout << "Data: ";for (auto byte : node->data) {std::cout << "0x" << std::hex << std::setw(2) << std::setfill('0')<< static_cast<int>(byte) << " ";}/*int lens = node->data.size();char *t = new char[lens];int t1 = 0;for (auto byte : node->data) {t[t1++] = byte;}int tt = parse_varint(t, lens);std::cout << tt;delete[] t;*/}std::cout << std::endl;// 递归打印子节点for (const auto& child : node->children) {printSegmentTree(child.get(), depth + 1);}
}int main() {// 原始数据unsigned char peer0_5[] = {0x12, 0x0b, 0x08, 0x96, 0xa1, 0x3e, 0x10, 0xa9, 0x06, 0x18, 0xe4, 0xaf, 0x01,
0x12, 0x0a, 0x08, 0x97, 0xa1, 0x3e, 0x10, 0xe0, 0x04, 0x18, 0x98, 0x75,
0x12, 0x0a, 0x08, 0x98, 0xa1, 0x3e, 0x10, 0xc7, 0x06, 0x18, 0x98, 0x75,
0x12, 0x04, 0x08, 0xf7, 0xa1, 0x3e, 
0x12, 0x0b, 0x08, 0xf8, 0xa1, 0x3e, 0x10, 0xec, 0x03, 0x18, 0x80, 0xe1, 0x01, 
0x12, 0x04, 0x08, 0xf9, 0xa1, 0x3e, 
0x12, 0x0a, 0x08, 0xfa, 0xa1, 0x3e, 0x10, 0x01, 0x18, 0x8c, 0xf6, 0x01, 
0x12, 0x0a, 0x08, 0xfb, 0xa1, 0x3e, 0x10, 0x03, 0x18, 0xf8, 0xd2, 0x01,
0x12, 0x04, 0x08, 0xfc, 0xa1, 0x3e, 
0x12, 0x0b, 0x08, 0xfd, 0xa1, 0x3e, 0x10, 0x8e, 0x01, 0x18, 0x88, 0xef, 0x01, 
0x12, 0x0b, 0x08, 0xfe, 0xa1, 0x3e, 0x10, 0xeb, 0x04, 0x18, 0xfc, 0xd9, 0x01};int data_size = sizeof(peer0_5) / sizeof(peer0_5[0]);int index = 0;std::vector<std::unique_ptr<Segment>> rootSegments;// 解析所有顶级段while (index < data_size) {auto segment = parseSegment(peer0_5, data_size, index);if (segment) {rootSegments.push_back(std::move(segment));}else {// 跳过无效字节index++;}}// 打印解析结果std::cout << "Found " << rootSegments.size() << " root segments:\n";for (size_t i = 0; i < rootSegments.size(); ++i) {std::cout << "\nRoot Segment " << i + 1 << ":\n";printSegmentTree(rootSegments[i].get());}return 0;
}

在这里插入图片描述

http://www.dtcms.com/a/296912.html

相关文章:

  • 【Guava】1.1.我的报告
  • 移动前端开发与 Web 前端开发的区别
  • 电商接口常见误区与踩坑提醒
  • 3.SOAP
  • 跨境支付入门~国际支付结算(风控篇)
  • 酷狗最新版KG-DEVID 算法分析
  • Unity 时间抗锯齿(Temporal Antialiasing, TAA)技术解析
  • T-RO顶刊|单视角“找相似”,大阪大学提出新型点云描述符(C-FPFH),杂乱场景一抓一个准!
  • 2025国自然青基、面上会评结束,资助率或创新低,跌破11.19%!
  • 期货交易系统用户操作与应用逻辑全析
  • springboot实战demo2
  • 图像识别任务的边界正在改变
  • Linux系统编译安装PostgreSQL 12.8(含报错处理与配置热加载)
  • C++标准库算法实战指南
  • Linux 进程间通信:共享内存详解
  • 2025年人形机器人动捕技术研讨会于7月31日在京召开
  • 如何使用 pdfMake 中文字体
  • Next.js 中配置不同页面布局方案
  • 无锡市亨达电机盛装亮相 2025上海生物发酵展引关注
  • 深入理解大语言模型生成参数:temperature、top\_k、top\_p 等全解析
  • 首发即开源!DAWorkBench数据可视化分析软件正式发布!(附源码下载网址)
  • ubuntu安装teams解决方法
  • JavaScript中this的5大核心规则详解
  • vue 项目中 components 和 views 包下的组件功能区别对比,示例演示
  • Eureka-服务注册,服务发现
  • CSDN技术专栏开篇:高效开发环境搭建指南
  • Android Activity与Fragment生命周期变化
  • 深度学习(鱼书)day01--感知机
  • springboot实战篇2
  • 磁悬浮转子不平衡质量控制:比例谐振控制器深度解析