Siglus引擎 Unpack | 未完待续

前言

未完待续。
代码在这里:https://github.com/N0zoM1z0/SiglusEngine-Extract
以后随时会更新。()
因为我是选择直接逆向游戏引擎,在无源码,不hook的情况下硬逆Siglus……
路漫漫。。。

read.sav

可以直接逆SiglusCounter.exe
read.sav Unpack后可以得到游戏进度信息
在这里插入图片描述

# define _CRT_SECURE_NO_WARNINGS
#include<Windows.h>
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
using namespace std;
char data[0x20000];
void sub_401000(BYTE* a1, BYTE* a2, int a3) {BYTE* v3; // eaxunsigned int v4; // edxBYTE* v5; // ediBYTE* v6; // esiint i; // ecxunsigned int v10; // [esp+14h] [ebp+Ch]v3 = a2;v4 = *a1 + 256;v5 = a1 + 1;v10 = (unsigned int)&a2[a3];                  // 末尾if ((unsigned int)a2 < v10){do{if (v4 == 1)v4 = (unsigned __int8)*v5++ + 256;if ((v4 & 1) != 0){*v3++ = *v5++;}else{v6 = &v3[-(*(unsigned __int16*)v5 >> 4)];for (i = (*(WORD*)v5 & 0xF) + 2; i > 0; --i)*v3++ = *v6++;v5 += 2;}v4 >>= 1;} while ((unsigned int)v3 < v10);}
}
int main() {BYTE key[256] = { 0x8B, 0xE5, 0x5D, 0xC3, 0xA1, 0xE0, 0x30, 0x44, 0x00, 0x85, 0xC0, 0x74, 0x09, 0x5F, 0x5E, 0x33, 0xC0, 0x5B, 0x8B, 0xE5, 0x5D, 0xC3, 0x8B, 0x45, 0x0C, 0x85, 0xC0, 0x75, 0x14, 0x8B, 0x55, 0xEC, 0x83, 0xC2, 0x20, 0x52, 0x6A, 0x00, 0xE8, 0xF5, 0x28, 0x01, 0x00, 0x83, 0xC4, 0x08, 0x89, 0x45, 0x0C, 0x8B, 0x45, 0xE4, 0x6A, 0x00, 0x6A, 0x00, 0x50, 0x53, 0xFF, 0x15, 0x34, 0xB1, 0x43, 0x00, 0x8B, 0x45, 0x10, 0x85, 0xC0, 0x74, 0x05, 0x8B, 0x4D, 0xEC, 0x89, 0x08, 0x8A, 0x45, 0xF0, 0x84, 0xC0, 0x75, 0x78, 0xA1, 0xE0, 0x30, 0x44, 0x00, 0x8B, 0x7D, 0xE8, 0x8B, 0x75, 0x0C, 0x85, 0xC0, 0x75, 0x44, 0x8B, 0x1D, 0xD0, 0xB0, 0x43, 0x00, 0x85, 0xFF, 0x76, 0x37, 0x81, 0xFF, 0x00, 0x00, 0x04, 0x00, 0x6A, 0x00, 0x76, 0x43, 0x8B, 0x45, 0xF8, 0x8D, 0x55, 0xFC, 0x52, 0x68, 0x00, 0x00, 0x04, 0x00, 0x56, 0x50, 0xFF, 0x15, 0x2C, 0xB1, 0x43, 0x00, 0x6A, 0x05, 0xFF, 0xD3, 0xA1, 0xE0, 0x30, 0x44, 0x00, 0x81, 0xEF, 0x00, 0x00, 0x04, 0x00, 0x81, 0xC6, 0x00, 0x00, 0x04, 0x00, 0x85, 0xC0, 0x74, 0xC5, 0x8B, 0x5D, 0xF8, 0x53, 0xE8, 0xF4, 0xFB, 0xFF, 0xFF, 0x8B, 0x45, 0x0C, 0x83, 0xC4, 0x04, 0x5F, 0x5E, 0x5B, 0x8B, 0xE5, 0x5D, 0xC3, 0x8B, 0x55, 0xF8, 0x8D, 0x4D, 0xFC, 0x51, 0x57, 0x56, 0x52, 0xFF, 0x15, 0x2C, 0xB1, 0x43, 0x00, 0xEB, 0xD8, 0x8B, 0x45, 0xE8, 0x83, 0xC0, 0x20, 0x50, 0x6A, 0x00, 0xE8, 0x47, 0x28, 0x01, 0x00, 0x8B, 0x7D, 0xE8, 0x89, 0x45, 0xF4, 0x8B, 0xF0, 0xA1, 0xE0, 0x30, 0x44, 0x00, 0x83, 0xC4, 0x08, 0x85, 0xC0, 0x75, 0x56, 0x8B, 0x1D, 0xD0, 0xB0, 0x43, 0x00, 0x85, 0xFF, 0x76, 0x49, 0x81, 0xFF, 0x00, 0x00, 0x04, 0x00, 0x6A, 0x00, 0x76 };FILE* in;in = fopen("D:\\N0zoM1z0\\Sec-Learning\\Reverse\\游戏逆向\\read.sav", "rb");fread(data, sizeof(char), sizeof(data), in);DWORD* dw_data = (DWORD*)data;DWORD v12 = dw_data[2];DWORD v26 = dw_data[3];for (int i = 0x10; i < 0x10 + v12; i++) {data[i] ^= key[(i - 0x10) & 0xFF];}DWORD v25 = dw_data[5];void* Block = malloc(v25);sub_401000((BYTE*)data + 24, (BYTE*)Block, v25);printf("+++++++++++++++++++++++++++++++++++++++++++++++");for (int i = 0; i < v25; i++) {BYTE c = *((BYTE*)Block + i);} // checked ✔️FILE* Stream = fopen("D:\\N0zoM1z0\\Sec-Learning\\Reverse\\游戏逆向\\SiglusCounter.txt", "wb");FILE* v4; // eaxFILE* v5; // edichar* v6; // eaxconst char* v7; // edichar* v8; // eaxFILE* v9; // eaxFILE* v10; // edivoid* v11; // esiint* v13; // esiconst WCHAR* v14; // esiint* v15; // esiint v16; // ecxsize_t v17; // eaxint v19; // [esp-14h] [ebp-3A0h]char Buffer[304]; // [esp+Ch] [ebp-380h] BYREFCHAR MultiByteStr[260]; // [esp+13Ch] [ebp-250h] BYREFCHAR pszPath[304]; // [esp+240h] [ebp-14Ch] BYREFint v24; // [esp+374h] [ebp-18h]size_t v27; // [esp+380h] [ebp-Ch]size_t Size; // [esp+384h] [ebp-8h]if (Stream){v13 = (int*)Block;v24 = 0;Size = 0;if (v26 > 0){v25 = v26;do{v19 = *v13;v14 = (const WCHAR*)(v13 + 1);v26 = v19;MultiByteStr[WideCharToMultiByte(0x3A4u, 0, v14, v19, MultiByteStr, 256, 0, 0)] = 0;v15 = (int*)&v14[v26];v16 = *v15;v13 = v15 + 1;v26 = v16;if (v16){v17 = 0;v27 = 0;if (v16 > 0){v27 = v16;do{v17 += *(unsigned __int8*)v13;v13 = (int*)((char*)v13 + 1);--v27;} while (v27);v27 = v17;}Size += v17;v24 += v16;fprintf(Stream,"%6d/%6d   %3d.%d%%   %s\r\n",v27,v26,(int)(1000 * v17) / v16 / 10,(int)(1000 * v17) / v16 % 10,MultiByteStr);}--v25;} while (v25);}free(Block);fprintf(Stream,"----------------------------------------\r\n%6d/%6d   %3d.%d%%   (ALL)\r\n",Size,v24,(int)(1000 * Size) / v24 / 10,(int)(1000 * Size) / v24 % 10);fclose(Stream);}ShellExecuteA(0, "open", "D:\\N0zoM1z0\\Sec-Learning\\Reverse\\游戏逆向\\SiglusCounter.txt", NULL,NULL, 1);
}

mode.cgm

这个解出来是一个TABLE,感觉像是来索引各个g00图片文件的。
解出来大概长这样:在这里插入图片描述

nwa

网上有现成脚本,就不自己造轮子了。

https://github.com/mirrorange/NwaConverter

强烈建议解Rewrite的BGM017,散花!(sakuya😭)

g00

逆了好久。。。还只弄了一个分支。。。
占个坑,后面补完整。

终于可以解出Rewrite的CG了😭😭😭
在这里插入图片描述

# define _CRT_SECURE_NO_WARNINGS
#include<Windows.h>
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<stdint.h>
using namespace std;void Unpack_1(UINT8 a1,BYTE* a2,BYTE* a3,DWORD fileLen) {}
int Unpack_2(UINT8 a1, BYTE* a2, BYTE* a3,DWORD fileLen) {/**/int result; // eaxchar v4; // cfchar v5; // clint v6; // esiBYTE* v7; // esiBYTE* v8; // ediBYTE* v9; // [esp-4h] [ebp-4h]DWORD cnt = 0;DWORD id1 = 0, id2 = 0; // id1: edi  id2:esifileLen -= 0xD;DWORD flag = 0;while (TRUE) {if (!flag) {a1 = a3[id2];++id2;flag = 7;}else {flag--;}if (id2 >= fileLen)break;if(id1 == 0x10038)printf("[+] a1: %x   id1: %x\n", a1,id1);v4 = a1 & 1;a1 >>= 1;if (v4) {//for (int i = 0; i < 3; i++) {a2[id1 + i] = a3[id2 + i];}a2[id1 + 3] = 0;id1 += 4;id2 += 3;} // checkedelse {int WORD_a3 = *(WORD*)((BYTE*)a3 + id2);v5 = (WORD_a3 & 0xF) + 1;v6 = (id1 - (4 * (WORD_a3 >> 4))); // !!! 这里不能用WORD!!! ... 要int 。。。//cnt += 1;//printf("v6: %x  id1: %x\n", v6,id1);//if (cnt > 3)return;//return;do {for (int i = 0; i < 4; i++) {a2[id1 + i] = a2[v6 + i];}id1 += 4;v6 += 4;v5--;} while (v5);id2 += 2;}}return id1; // .... 开始手贱写成id2了...
}
DWORD dword_404337, dword_404333, dword_40433F, dword_404343;
void Trans2BMP_1() {}
int Trans2BMP_2(LPCVOID dword_40434B,LPCVOID lpBuffer) {int v2; // ebxint v3; // edi__int16 v4; // cx__int16 v5; // cx__int16 v6; // ax__int16 v7; // dxint result; // eaxint v9; // [esp-6h] [ebp-6h]__int16 v10; // [esp-2h] [ebp-2h]BYTE* v0 = (BYTE*)dword_40434B;BYTE* v1 = (BYTE*)lpBuffer;*(WORD*)lpBuffer = 0x4D42;*(DWORD*)(v1 + 2) = dword_404343 + 54;*(DWORD*)(v1 + 6) = 0;*(DWORD*)(v1 + 10) = 54;*(DWORD*)(v1 + 14) = 40;v2 = dword_404337;*(DWORD*)(v1 + 18) = dword_404333;*(DWORD*)(v1 + 22) = v2;*((WORD*)v1 + 13) = 1;*((WORD*)v1 + 14) = 24;*(DWORD*)(v1 + 30) = 0;*(DWORD*)(v1 + 34) = 0;*(DWORD*)(v1 + 38) = 0;*(DWORD*)(v1 + 42) = 0;*(DWORD*)(v1 + 46) = 0;*(DWORD*)(v1 + 50) = 0;v3 = (v2 - 1) * dword_40433F + 54;v4 = dword_404337;int idx_0 = 0;do {v10 = v4;v9 = v3;v5 = dword_404333;do {/*printf("v3: %x\n", v3);return 1;*/v1[v3] = v0[idx_0];v1[v3 + 1] = v0[idx_0 + 1];v1[v3 + 2] = v0[idx_0 + 2];idx_0 += 4;v3 += 3;--v5;} while (v5);v3 = v9 - dword_40433F;//if (v3 == 0x36)break;v4 = v10 - 1;} while (v10 != 1);result = dword_404337 * dword_40433F + 54;return result;
}
void Unpack_G00(const CHAR* FileName) {HANDLE hFile = CreateFileA(FileName, GENERIC_READ,FILE_SHARE_READ,NULL,OPEN_EXISTING,       FILE_ATTRIBUTE_NORMAL,NULL);if (hFile == INVALID_HANDLE_VALUE) {printf("[-] Error in CreateFileA!\n");return;}DWORD dwFileSize = GetFileSize(hFile, NULL);BYTE* buffer = (BYTE*)malloc(dwFileSize*2);ZeroMemory(buffer, dwFileSize);DWORD dwBytesToRead = dwFileSize;ReadFile(hFile, buffer, dwBytesToRead, &dwBytesToRead, NULL);printf("[+] BytesRead: %x\n", dwBytesToRead);LPCVOID lpBuffer = buffer;if (!(*(BYTE*)lpBuffer)) {DWORD fileLen;fileLen = *(DWORD*)((BYTE*)lpBuffer + 5) + 5;printf("[+] fileLen: %x\n", fileLen);BYTE* newBuf = (BYTE*)malloc(fileLen*2);DWORD dwUnpackSize = Unpack_2(*((BYTE*)lpBuffer + 0xD), newBuf, (BYTE*)((BYTE*)(lpBuffer) + 0xD), fileLen);FILE* out = fopen("D:\\N0zoM1z0\\Sec-Learning\\Reverse\\游戏逆向\\EXP\\g00cnv1\\etract", "wb");fwrite(newBuf, sizeof(BYTE), dwUnpackSize, out);printf("[+] Unpack Done!\n");// 9310000dword_404337 = *(unsigned __int16*)((char*)lpBuffer + 3);dword_404333 = *(unsigned __int16*)((char*)lpBuffer + 1);dword_40433F = (3 * dword_404333 + 3) & 0xFFFFFFFC;dword_404343 = dword_404337 * dword_40433F;LPCVOID pBMPBuffer = (BYTE*)malloc((16 * dword_404337 * dword_40433F + 54) + 1);DWORD dw_bmpSize = Trans2BMP_2(newBuf, pBMPBuffer);out = fopen("D:\\N0zoM1z0\\Sec-Learning\\Reverse\\游戏逆向\\EXP\\g00cnv1\\extract.bmp", "wb");fwrite(pBMPBuffer, sizeof(BYTE), dw_bmpSize, out);printf("[+] Transfer to BMP file done!\n");}else {}}
int main() {Unpack_G00("D:\\N0zoM1z0\\Sec-Learning\\Reverse\\游戏逆向\\Rewrite\\g00\\FGSZ08.g00");}

强烈吐槽IDA!!!
在这里插入图片描述
这个v6,IDA识别的是WORD类型,也就是无符号,但是,调试了好久,才发现要用有符号。。。这就是最开始extract半天没对的地方!。。

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

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

相关文章

Windows docker下载minio出现“Using default tag: latestError response from daemon”

Windows docker下载minio出现 Using default tag: latest Error response from daemon: Get "https://registry-1.docker.io/v2/": context deadline exceeded 此类情况&#xff0c;一般为镜像地址问题。 {"registry-mirrors": ["https://docker.re…

ue中使用webui有效果白色拖动条 有白边

这种类型&#xff0c;分析发现跟ue没有关系 是网页代码的问题 可以在外头加个overflow: hidden; <body style"height: 100%; margin: 0;overflow: hidden;">完美解决

记录java Collections.sort踩的坑

前言 java Collections.sort 排序失效&#xff1f;为什么会排序失效呢&#xff1f; 需求和问题 需求&#xff1a;获取指定文件夹下的所有文件&#xff0c;并且按照修改时间顺序从大到小排序&#xff0c;如果修改时间相同&#xff0c;则按照创建时间从大到小排序 // 输入lis…

MODBUS TCP转CANOpen网关

Modbus TCP转CANopen网关 型号&#xff1a;SG-TCP-COE-210 产品用途 本网关可以实现将CANOpen接口设备连接到MODBUS TCP网络中&#xff1b;并且用户不需要了解具体的CANOpen和Modbus TCP 协议即可实现将CANOpen设备挂载到MODBUS TCP接口的 PLC上&#xff0c;并和CANOpen设备…

为何数据库推荐将IPv4地址存储为32位整数而非字符串?

目录 一、IPv4地址在数据库中的存储方式&#xff1f; 二、IPv4地址的存储方式比较 &#xff08;一&#xff09;字符串存储 vs 整数存储 &#xff08;二&#xff09;IPv4地址"192.168.1.8"说明 三、数据库推荐32位整数存储方式原理 四、存储方式对系统性能的影响…

《译文》2024年11月数维杯国际大学生数学建模挑战赛题目

# 赛题正式发布 2024年第十届数维杯国际大学生数学建模挑战赛顺利开赛&#xff0c;竞赛开始时间为北京时间2024年11月15日09:00至北京时间2024年11月19日09:00&#xff0c;共计4天&#xff0c;竞赛题目正式发布&#xff0c;快来一起围观&#xff0c;你认为今年的哪个题目更具有…

机器学习(贝叶斯算法,决策树)

朴素贝叶斯分类 贝叶斯分类理论 假设现有两个数据集&#xff0c;分为两类 我们现在用p1(x,y)表示数据点(x,y)属于类别1(图中红色圆点表示的类别)的概率&#xff0c;用p2(x,y)表示数据点(x,y)属于类别2(图中蓝色三角形表示的类别)的概率&#xff0c;那么对于一个新数据点(x,y)…

【会话文本nlp】对话文本解析库pyconverse使用教程版本报错、模型下载等问题解决超参数调试

前言&#xff1a; 此篇博客用于记录调用pyconverse库解析对话文本时遇到的问题与解决思路&#xff0c;以供大家参考。 文章目录 pycoverse介绍代码github链接问题解决1 [cannot import name ‘cached_download‘ from ‘huggingface_hub‘ 问题解决](https://blog.csdn.net/wei…

5G的SUCI、SUPI、5G-GUTI使用场景及关系

使用场景(来源于对23.501、23.502、33.501、23.003的理解) 1、UE初始注册时&#xff0c;根据HN Public Key把SUPI加密成SUCI&#xff0c;并发送初始注册请求 2、AMF转发SUCI给AUSF和UDM进行认证&#xff0c;并获取解密后的SUPI 3、AMF根据SUPI生成一个5G-GUTI&#xff0c;并保…

2. kafka 生产者

一. 生产者消息发送流程 在消息发送的过程中&#xff0c;涉及到了两个线程&#xff1a;main线程和Sender线程。Producer发送的消息会分别经过Interceptors(拦截器)&#xff0c;Serializer(序列化器)&#xff0c;Partitioner(分区器)最终到达RecordAccumulator&#xff0c;Recor…

web应用安全和信息泄露预防

文章目录 1&#xff1a;spring actuator导致的信息泄露1.1、Endpoint配置启用检测1.2、信息泄露复现1.3、防御 2&#xff1a;服务端口的合理使用3&#xff1a;弱口令&#xff08;密码&#xff09;管理4&#xff1a;服务端攻击4.1、短信业务&#xff0c;文件上传等资源型接口1、…

智慧安防丨以科技之力,筑起防范人贩的铜墙铁壁

近日&#xff0c;贵州省贵阳市中级人民法院对余华英拐卖儿童案做出了一审宣判&#xff0c;判处其死刑&#xff0c;剥夺政治权利终身&#xff0c;并处没收个人全部财产。这一判决不仅彰显了法律的威严&#xff0c;也再次唤起了社会对拐卖儿童犯罪的深切关注。 余华英自1993年至2…

计算机编程中的测试驱动开发(TDD)及其在提高代码质量中的应用

&#x1f493; 博客主页&#xff1a;瑕疵的CSDN主页 &#x1f4dd; Gitee主页&#xff1a;瑕疵的gitee主页 ⏩ 文章专栏&#xff1a;《热点资讯》 计算机编程中的测试驱动开发&#xff08;TDD&#xff09;及其在提高代码质量中的应用 计算机编程中的测试驱动开发&#xff08;T…

【MYSQL】锁详解(全局锁、表级锁、行级锁)【快速理解】

目录 一、全局锁 二、表级锁 1.表锁 2.元数据锁 3.意向锁 三、行级锁 1. 行锁 2.间隙锁 3.临建锁 锁是处理并发情况下&#xff0c;对数据的一致性的关键因素&#xff0c;也是并发情况下对效率影响非常大的。 1、全局锁&#xff1a;锁定表中所有数据。 2、表级锁&#xff1a;…

thinkphp6 入门(2)--视图、渲染html页面、赋值

use think\facade\View;View::assign([name > ThinkPHP,email > thinkphpqq.com]);View::assign(data,[name > ThinkPHP,email > thinkphpqq.com]); View::fetch(index);助手函数 view(index, [name > ThinkPHP,email > thinkphpqq.com ]); 模板输出 {$na…

百度智能云 VectorDB 优势数量 TOP 1

近日&#xff0c;IDC 发布了《RAG 与向量数据库市场前景预测》报告&#xff0c;深入剖析了检索增强生成&#xff08;RAG&#xff09;技术和向量数据库市场的发展趋势。报告不仅绘制了 RAG 技术的发展蓝图&#xff0c;还评估了市场上的主要厂商。在这一评估中&#xff0c;百度智…

MySQL索引的底层实现原理是什么?

MySQL索引的底层实现主要基于B树数据结构。B树是一种平衡多路查找树&#xff0c;具有以下特点&#xff1a; 1、树的所有叶子节点都位于同一层&#xff1a; 这确保了从根节点到每个叶子节点的路径长度相同&#xff0c;保证了查询效率的一致性。 2、节点中的数据按键值大小有序…

手搓神经网络(MLP)解决MNIST手写数字识别问题 | 数学推导+代码实现 | 仅用numpy,tensor和torch基本计算 | 含正反向传播数学推导

手写数字识别&#xff08;神经网络入门&#xff09; 文章目录 手写数字识别&#xff08;神经网络入门&#xff09;实验概述实验过程数据准备模型实现线性变换层前向传播反向传播更新参数整体实现 激活函数层&#xff08;ReLU&#xff09;前向传播反向传播整体实现 Softmax层&am…

在MATLAB中导入TXT文件的若干方法

这是一篇关于如何在MATLAB中导入TXT文件的文章&#xff0c;包括示例代码和详细说明 文章目录 在MATLAB中导入TXT文件1. 使用readtable函数导入TXT文件示例代码说明 2. 使用load函数导入TXT文件示例代码说明 3. 使用importdata函数导入TXT文件示例代码说明 4. 自定义导入选项示例…

ks 小程序sig3

前言 搞了app版的快手之后 &#xff08;被风控麻了&#xff09; 于是试下vx小程序版的 抓包调试 小程序抓包问题 网上很多教程&#xff0c; github也有开源的工具代码 自行搜索 因为我们需要调试代码&#xff0c;所以就用了下开源的工具 &#xff08;可以用chrome的F12功能&a…