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++, 云资产清单, 代码重构, 内存分配器, 数据擦除, 游戏安全, 逆向工程