Roflane/MihoyoAlloc

GitHub: Roflane/MihoyoAlloc

通过逆向工程从米哈游游戏二进制文件中还原的 C++ 池内存分配器的可读性重构代码。

Stars: 0 | Forks: 0

# Mihoyo::Alloc — 逆向工程的内存分配器 通过逆向工程从米哈游游戏二进制文件中还原的, 可读性强的 C++ 池分配器重构代码。 **技术栈:** C++,x64 逆向工程 (IDA/Ghidra) ### 功能说明 - 从反编译的伪 C 代码重构 `MemoryPool::Alloc` - 记录了 8 字节对齐的分配策略 - 展示了基于 `VirtualAlloc` 的提交逻辑及溢出保护 ### 为什么值得关注 原始二进制文件没有源码或文档 —— 其内部结构和行为完全是通过 反汇编和反编译器的输出还原出来的。 ``` void *__fastcall Mihoyo::Alloc(_QWORD *a1, __int64 a2, __int64 a3) { size_t v4; // rsi _BYTE *v5; // r15 _BYTE *v6; // rbx __int64 v7; // r14 size_t v8; // rax _BYTE *v9; // rcx size_t v10; // rax SIZE_T v11; // r14 SIZE_T v12; // r14 v4 = (a3 * a2 + 7) & 0xFFFFFFFFFFFFFFF8uLL; v5 = (_BYTE *)a1[2]; v6 = (_BYTE *)a1[3]; v7 = a1[4]; v8 = v5 - v6 - v7; v9 = v6; if ( v8 < v4 ) { v10 = -v7 & (v4 + v7 + ~v8); v11 = 4 * v7; if ( v11 <= v10 ) v11 = v10; if ( (unsigned __int64)&v5[v11] > *a1 + a1[5] ) abort(); if ( VirtualAlloc(v5, v11, 0x1000u, 4u) == v5 ) { v12 = a1[2] + v11; } else { Log::Write( (__int64)"MemoryPool::InternalCommit failed: address 0x%08llx, size %zu, start 0x%08llx, current 0x%08llx, page size 0x%zx", *a1, v11, a1[2], a1[3], a1[4]); v12 = 0; } a1[2] = v12; v9 = (_BYTE *)a1[3]; } a1[3] = &v9[v4]; return memset(v6, 0, v4); } ```
标签:C++, 云资产清单, 代码重构, 内存分配器, 数据擦除, 游戏安全, 逆向工程