这个单独弄出来, 只是因为自己懒, 不想每次遍历时都重敲代码, 就做下笔记, 用到的时候 粘贴 复制…
就是先分析下游戏二叉树的结构, 然后自己模拟着也定义一个.
#pragma pack (push,1) typedef struct _RoleTree { DWORD dwLBase; //+0x0 左树 DWORD dwSBase; //+0x4 上一层树的地址 DWORD dwRBase; //+0x8 右树 int iID; //+0xC 二叉树ID DWORD dwPBase; //+0x10 数据数据指针 byte bTyep; //+0x14 byte bEnd; //+0x15 //是否到了尾节点 0为没到, 1为到了, 注意尾节点即没有左右树也没有了数据指针 } RoleTree, *pRoleTree; #pragma pack(pop) void GetTreeAddr() { int iObject = ReadMemoryPtrData<int>(Role_BaseAddr); iObject = ReadMemoryPtrData<int>(iObject + 0x64); iObject = ReadMemoryPtrData<int>(iObject + 0x4); TraceOutA("二叉树基址为: 0x%X", iObject); this->TraverRoleTree(iObject); } void TraverRoleTree(int iObject) { pRoleTree pTree; pTree = (pRoleTree)iObject; if (!pTree->bEnd) {//[[[pTree->dwPBase+0x1E0]+0x4]+0x2458] int tmp = ReadMemoryPtrData<int>(pTree->dwPBase + 0x1E0); if (tmp) { tmp = ReadMemoryPtrData<int>(tmp + 0x4); TraceOutA("二叉树ID为: 0x%X--数据对象为: 0x%X--怪物名: %s", pTree->iID, tmp, (char*)(tmp + 0x34)); } TraverRoleTree(pTree->dwLBase); TraverRoleTree(pTree->dwRBase); } }
☠