无聊研究了一下幻世录1这款游戏的角色数据结构,还有很多地址不清楚什么意思,希望有人可以告诉我!!!
int attributeLL[4]; // 力量 反应 精神 体质(变化下限) int attributeUL[4]; // 力量 反应 精神 体质(变化上限) // (颜色变化限制,此值比attributeUL小时显示红色,比attributeUL大但不超过50时显示黄色,否则白色) int index; // 角色序号(改后会死亡) int experience[2]; // 现在的/需要的经验 int strength[9]; // 防御力 敏捷度 ? 攻击力 ? ? ? 魔击力 ?上限 int state[5]; // 生命力现在/总共 魔法现在/总共 气力(一个格0) int resistance[5]; // 抗土水风火心
下面是填充数据的程序,在VS2013可以运行。
int attributeLL[4]; // 力量 反应 精神 体质(变化下限) int attributeUL[4]; // 力量 反应 精神 体质(变化上限) // (颜色变化限制,此值比attributeUL小时显示红色,比attributeUL大但不超过50时显示黄色,否则白色) int index; // 角色序号(改后会死亡) int experience[2]; // 现在的/需要的经验 int strength[9]; // 防御力 敏捷度 ? 攻击力 ? ? ? 魔击力 ?上限 int state[5]; // 生命力现在/总共 魔法现在/总共 气力(一个格0) int resistance[5]; // 抗土水风火心 DWORD findBeginAddress(HANDLE m_hProcess) BYTE* pTarget = new BYTE[sizeof(int)]; sscanf_s("4213", "%d", pTarget); MEMORY_BASIC_INFORMATION mbi; DWORD dwMaxAddress = (DWORD)0x7ffeffff; DWORD dwMinAddress = (DWORD)0x10000; PBYTE pAddress = (PBYTE)dwMinAddress; DWORD dwSearchSize = dwMaxAddress - dwMinAddress; BYTE *lpBuf = new BYTE[1]; DWORD dwSearchDataSize = sizeof(int); if ((DWORD)pAddress > dwMaxAddress) if (sizeof(mbi) != VirtualQueryEx(m_hProcess, pAddress, &mbi, sizeof(mbi))) if (MEM_COMMIT != mbi.State || 0 == mbi.Protect || (PAGE_GUARD & mbi.Protect) != 0 || (PAGE_NOACCESS & mbi.Protect) != 0) pAddress = ((PBYTE)mbi.BaseAddress + mbi.RegionSize); if (mbi.RegionSize > dwBufSize) dwBufSize = mbi.RegionSize; lpBuf = new BYTE[dwBufSize]; if (FALSE == ReadProcessMemory(m_hProcess, mbi.BaseAddress, lpBuf, (DWORD)mbi.RegionSize, NULL)) pAddress = ((PBYTE)mbi.BaseAddress + mbi.RegionSize); SIZE_T nMax = mbi.RegionSize - dwSearchDataSize; for (SIZE_T i = 0; i <= nMax; i++) if (0 == memcmp(pTarget, &lpBuf[i], dwSearchDataSize - 1) && 0x3D8 == (0xFFF & ((DWORD)mbi.BaseAddress + i)) ) outAddress = (DWORD)mbi.BaseAddress + i; i += dwSearchDataSize - 1; pAddress = ((PBYTE)mbi.BaseAddress + mbi.RegionSize); return outAddress - 0x10; DWORD regionSize = (DWORD)sizeof(Hero) * 4; BYTE* lpBuf = new BYTE[regionSize]; DWORD m_dwProcessID = 0; // 需要自己在任务管理器中查询 HANDLE m_hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, m_dwProcessID); PVOID headAddress = (PVOID)findBeginAddress(m_hProcess); if (lpBuf != NULL && FALSE == ReadProcessMemory(m_hProcess, headAddress, lpBuf, regionSize, NULL)) Hero* pHero1 = (Hero*)buf; Hero* pHero2 = (Hero*)buf; Hero* pHero3 = (Hero*)buf; Hero* pHero4 = (Hero*)buf; for (int i = 0; i < sizeof(Hero) / sizeof(int) * 4; i++) if (i % (sizeof(Hero) / sizeof(int)) == 0) cout << *((int*)pHero1 + i) << " ";
|