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.mzph.cn/bicheng/61316.shtml

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

相关文章

黑马嵌入式开发入门模电基础学习笔记

学习视频: 黑马程序员嵌入式开发入门模电&#xff08;模拟电路&#xff09;基础 文章目录 背景介绍电流电压组件仿真三极管ne555PCBEDA案例&#xff1a;非接触式电笔案例&#xff1a;电子琴 背景介绍 电流 电压 组件 仿真 三极管 mos管 ne555 PCB EDA 案例&#xff1a;非接触…

linux 中mysql查看慢日志

1、到mysql容器&#xff0c;先登录到数据库&#xff0c;查看是否开启 mysql -h 127.0.0.1 -uroot -p SHOW VARIABLES LIKE slow_query_log; 2、如果没有开启&#xff0c;需要先开启 set global slow_query_log ON; 3、查看慢日志文件 SHOW VARIABLES LIKE slow_query_log…

从0开始机器学习--Day30--异常检测算法

异常检测算法(Anomaly detection algorithm) 我们定义异常检测算法的输出&#xff0c;也写作&#xff0c;这里的每一项括号内代表的是每个特征都符合各自的高斯分布&#xff08;也就是正态分布&#xff09;&#xff0c;代表均值&#xff0c;决定了模型的中心位置&#xff1b;代…

架构图解析:如何构建高效的微服务系统

在当今的数字化浪潮中&#xff0c;构建高效、灵活且可扩展的系统已成为企业的重要目标。微服务架构作为一种先进的软件设计模式&#xff0c;通过将复杂的应用程序分解为一系列小型、独立的服务&#xff0c;显著提升了系统的灵活性、可扩展性和维护性。本文将通过解析微服务系统…

排序排序的概念及其运用和选择排序

排序排序的概念及其运用和选择排序 7. 排序7.1 排序的概念及其运用7.2 选择排序算法——直接选择排序选择排序基本思想&#xff1a;直接选择排序选择排序原理参考程序 如何交换数据直接选择排序的特性总结&#xff1a; 7. 排序 7.1 排序的概念及其运用 排序&#xff1a;所谓排…

Websocket如何分块处理数据量超大的消息体

若我们服务端一次性最大处理的字节数是1M,而客户端发来了2M的数据&#xff0c;此时服务端的数据就要被切割成两次传输解码。Http协议中有分块传输&#xff0c;而在Websocket也可以分块处理超大的消息体。在jsr356标准中使用javax.websocket.MessageHandler.Partial可以分块处理…

【澜舟科技-注册/登录安全分析报告】

前言 由于网站注册入口容易被机器执行自动化程序攻击&#xff0c;存在如下风险&#xff1a; 暴力破解密码&#xff0c;造成用户信息泄露&#xff0c;不符合国家等级保护的要求。短信盗刷带来的拒绝服务风险 &#xff0c;造成用户无法登陆、注册&#xff0c;大量收到垃圾短信的…

uni-app快速入门(十)--常用内置组件(下)

本文介绍uni-app的textarea多行文本框组件、web-view组件、image图片组件、switch开关组件、audio音频组件、video视频组件。 一、textarea多行文本框组件 textarea组件在HTML 中相信大家非常熟悉&#xff0c;组件的官方介绍见&#xff1a; textarea | uni-app官网uni-app,un…

Tomcat 如何管理 Session

Tomcat 如何管理 Session 我们知道&#xff0c;Tomcat 中每一个 Context 容器对应一个 Web 应用&#xff0c;而 Web 应用之间的 Session 应该是独立的&#xff0c;因此 Session 的管理肯定是 Context 级的&#xff0c;也就是一个 Context 一定关联多个 Session。 Tomcat 中主…

鸿蒙NEXT开发-用户通知服务的封装和文件下载通知

注意&#xff1a;博主有个鸿蒙专栏&#xff0c;里面从上到下有关于鸿蒙next的教学文档&#xff0c;大家感兴趣可以学习下 如果大家觉得博主文章写的好的话&#xff0c;可以点下关注&#xff0c;博主会一直更新鸿蒙next相关知识 专栏地址: https://blog.csdn.net/qq_56760790/…

01 IP路由基础

一、路由器是怎么转发数据包 • 当数据包到达路由器之后&#xff0c;根据数据包的目的 IP 地址&#xff0c;查找 路由表&#xff0c;并根据路由表中相应的路由所指示出接口还有下一跳 指导数据包在网络中的转发。 • 如果路由器路由表没有路由怎么办&#xff1f; -------- 将数…

Android studio 呼叫盒app

一、权限文件 0.gradle切换国内源 #Fri Nov 08 15:46:05 CST 2024 distributionBaseGRADLE_USER_HOME distributionPathwrapper/dists distributionUrlhttps://mirrors.cloud.tencent.com/gradle/gradle-8.4-bin.zip zipStoreBaseGRADLE_USER_HOME zipStorePathwrapper/dists1…

[Admin] Dashboard Filter for Mix Report Types

Background RevOps team has built a dashboard for sales team to track team members’ performance, but they’re blocked by how to provide a manager view based on sales’ hierarchy. Therefore, they seek for dev team’s help to clear their blocker. From foll…

2024年人工智能技术赋能网络安全应用测试:广东盈世在钓鱼邮件识别场景荣获第三名!

近期&#xff0c;2024年国家网络安全宣传周“网络安全技术高峰论坛主论坛暨粤港澳大湾区网络安全大会”在广州成功举办。会上&#xff0c;国家计算机网络应急技术处理协调中心公布了“2024年人工智能技术赋能网络安全应用测试结果”。结果显示&#xff0c;广东盈世计算机科技有…

Java进阶四-异常,File

异常 概念&#xff1a;代表程序出现的问题。 目的&#xff1a;程序出现了异常我们应该如何处理。 最高父类&#xff1a;Exception 异常分为两类 编译时异常&#xff1a;没有继承RuntimeException的异常,直接继承与Exception,编译阶段就会错误提示。运行时异常:RuntimeExc…

ERROR TypeError: AutoImport is not a function

TypeError: AutoImport is not a function 原因&#xff1a;unplugin-auto-import 插件版本问题 Vue3基于Webpack&#xff0c;在vue.config.js中配置 当unplugin-vue-components版本小于0.26.0时&#xff0c;使用以下写法 const { defineConfig } require("vue/cli-se…

Elasticsearch:更好的二进制量化(BBQ)对比乘积量化(PQ)

作者&#xff1a;来自 Elastic Benjamin Trent 为什么我们选择花时间研究更好的二进制量化而不是在 Lucene 和 Elasticsearch 中进行生产量化。 我们一直在逐步使 Elasticsearch 和 Lucene 的向量搜索变得更快、更实惠。我们的主要重点不仅是通过 SIMD 提高搜索速度&#xff0…

检查课程是否有效

文章目录 概要整体架构流程技术细节小结 概要 这是一个微服务内部接口&#xff0c;当用户学习课程时&#xff0c;可能需要播放课程视频。此时提供视频播放功能的媒资系统就需要校验用户是否有播放视频的资格。所以&#xff0c;开发媒资服务&#xff08;tj-media&#xff09;的…

红外遥控报警器设计(模电课设)

一、设计要求 利用NE555p芯片设计制作报警器。要求当有人遮挡红外光时发出报警信号&#xff0c;无人遮挡红外光时报警器不工作&#xff0c;即不发声。 二、元器件 555芯片&#xff1a;NE555P 集成运放&#xff1a;LM358 三级管&#xff1a;2N1711 蜂鸣器&#xff1a;HY-30…

Spring MVC——针对实习面试

目录 Spring MVC什么是Spring MVC&#xff1f;简单介绍下你对Spring MVC的理解&#xff1f;Spring MVC的优点有哪些&#xff1f;Spring MVC的主要组件有哪些&#xff1f;Spring MVC的工作原理或流程是怎样的&#xff1f;Spring MVC常用注解有哪些&#xff1f; Spring MVC 什么是…