分享

幻世录1角色的数据结构

 勤奋不止 2024-05-25 发布于北京

 无聊研究了一下幻世录1这款游戏的角色数据结构,还有很多地址不清楚什么意思,希望有人可以告诉我!!!

  1. struct Hero
  2. {
  3. int attributeLL[4]; // 力量 反应 精神 体质(变化下限)
  4. int image[2]; // 人物头像 ?
  5. int attributeUL[4]; // 力量 反应 精神 体质(变化上限)
  6. // 力量 反应 精神 体质
  7. // (颜色变化限制,此值比attributeUL小时显示红色,比attributeUL大但不超过50时显示黄色,否则白色)
  8. int attributeMax[4];
  9. int index; // 角色序号(改后会死亡)
  10. int experience[2]; // 现在的/需要的经验
  11. int a3[3];
  12. int level; // 等级
  13. int a4[5];
  14. int strength[9]; // 防御力 敏捷度 ? 攻击力 ? ? ? 魔击力 ?上限
  15. int state[5]; // 生命力现在/总共 魔法现在/总共 气力(一个格0)
  16. int equip[6]; // 装备
  17. int resistance[5]; // 抗土水风火心
  18. int a5[5];
  19. int step; // 步数
  20. int a6[2];
  21. int goods[8]; // 物品
  22. int a7[60];
  23. };

下面是填充数据的程序,在VS2013可以运行。

  1. #include <iostream>
  2. #include <stdio.h>
  3. #include <windows.h>
  4. #include <vector>
  5. using namespace std;
  6. struct Hero
  7. {
  8. int attributeLL[4]; // 力量 反应 精神 体质(变化下限)
  9. int image[2]; // 人物头像 ?
  10. int attributeUL[4]; // 力量 反应 精神 体质(变化上限)
  11. // 力量 反应 精神 体质
  12. // (颜色变化限制,此值比attributeUL小时显示红色,比attributeUL大但不超过50时显示黄色,否则白色)
  13. int attributeMax[4];
  14. int index; // 角色序号(改后会死亡)
  15. int experience[2]; // 现在的/需要的经验
  16. int a3[3];
  17. int level; // 等级
  18. int a4[5];
  19. int strength[9]; // 防御力 敏捷度 ? 攻击力 ? ? ? 魔击力 ?上限
  20. int state[5]; // 生命力现在/总共 魔法现在/总共 气力(一个格0)
  21. int equip[6]; // 装备
  22. int resistance[5]; // 抗土水风火心
  23. int a5[5];
  24. int step; // 步数
  25. int a6[2];
  26. int goods[8]; // 物品
  27. int a7[60];
  28. };
  29. DWORD findBeginAddress(HANDLE m_hProcess)
  30. {
  31. BYTE* pTarget = new BYTE[sizeof(int)];
  32. sscanf_s("4213", "%d", pTarget);
  33. MEMORY_BASIC_INFORMATION mbi;
  34. DWORD outAddress = 0;
  35. DWORD dwMaxAddress = (DWORD)0x7ffeffff;
  36. DWORD dwMinAddress = (DWORD)0x10000;
  37. PBYTE pAddress = (PBYTE)dwMinAddress;
  38. DWORD dwSearchSize = dwMaxAddress - dwMinAddress;
  39. BYTE *lpBuf = new BYTE[1];
  40. DWORD dwBufSize = 1;
  41. DWORD dwSearchDataSize = sizeof(int);
  42. int counts = 0;
  43. while (TRUE)
  44. {
  45. if ((DWORD)pAddress > dwMaxAddress)
  46. {
  47. break;
  48. }
  49. if (sizeof(mbi) != VirtualQueryEx(m_hProcess, pAddress, &mbi, sizeof(mbi)))
  50. {
  51. break;
  52. }
  53. if (MEM_COMMIT != mbi.State || 0 == mbi.Protect
  54. || (PAGE_GUARD & mbi.Protect) != 0
  55. || (PAGE_NOACCESS & mbi.Protect) != 0)
  56. {
  57. pAddress = ((PBYTE)mbi.BaseAddress + mbi.RegionSize);
  58. continue;
  59. }
  60. if (mbi.RegionSize > dwBufSize)
  61. {
  62. delete[] lpBuf;
  63. dwBufSize = mbi.RegionSize;
  64. lpBuf = new BYTE[dwBufSize];
  65. }
  66. if (FALSE == ReadProcessMemory(m_hProcess, mbi.BaseAddress,
  67. lpBuf, (DWORD)mbi.RegionSize, NULL))
  68. {
  69. pAddress = ((PBYTE)mbi.BaseAddress + mbi.RegionSize);
  70. continue;
  71. }
  72. SIZE_T nMax = mbi.RegionSize - dwSearchDataSize;
  73. for (SIZE_T i = 0; i <= nMax; i++)
  74. {
  75. if (0 == memcmp(pTarget, &lpBuf[i], dwSearchDataSize - 1)
  76. && 0x3D8 == (0xFFF & ((DWORD)mbi.BaseAddress + i)) )
  77. {
  78. outAddress = (DWORD)mbi.BaseAddress + i;
  79. counts++;
  80. i += dwSearchDataSize - 1;
  81. }
  82. }
  83. if (1 == counts)
  84. break;
  85. pAddress = ((PBYTE)mbi.BaseAddress + mbi.RegionSize);
  86. }
  87. delete[] pTarget;
  88. pTarget = NULL;
  89. delete[] lpBuf;
  90. lpBuf = NULL;
  91. return outAddress - 0x10;
  92. }
  93. int main()
  94. {
  95. DWORD regionSize = (DWORD)sizeof(Hero) * 4;
  96. BYTE* lpBuf = new BYTE[regionSize];
  97. DWORD m_dwProcessID = 0; // 需要自己在任务管理器中查询
  98. HANDLE m_hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, m_dwProcessID);
  99. do
  100. {
  101. if (0 == m_hProcess)
  102. break;
  103. PVOID headAddress = (PVOID)findBeginAddress(m_hProcess);
  104. if (0 == headAddress)
  105. break;
  106. if (lpBuf != NULL && FALSE == ReadProcessMemory(m_hProcess, headAddress,
  107. lpBuf, regionSize, NULL))
  108. {
  109. break;
  110. }
  111. BYTE* buf = lpBuf;
  112. Hero* pHero1 = (Hero*)buf;
  113. buf += sizeof(Hero);
  114. Hero* pHero2 = (Hero*)buf;
  115. buf += sizeof(Hero);
  116. Hero* pHero3 = (Hero*)buf;
  117. buf += sizeof(Hero);
  118. Hero* pHero4 = (Hero*)buf;
  119. for (int i = 0; i < sizeof(Hero) / sizeof(int) * 4; i++)
  120. {
  121. if (i % (sizeof(Hero) / sizeof(int)) == 0)
  122. cout << endl;
  123. cout << *((int*)pHero1 + i) << " ";
  124. }
  125. } while (0);
  126. CloseHandle(m_hProcess);
  127. m_hProcess = NULL;
  128. delete[] lpBuf;
  129. lpBuf = NULL;
  130. return 0;
  131. }

 

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多