发布于:2018-6-29 10:00 | 120825次阅读 作者: 外部投稿 | 原作者: 通化程序员
之前我们得到了周围NPC怪物的结构 是一个数组套链表的嵌套结构 基本的遍历思路就是,首先遍历数组,得到的每一个成员再到链表中进行二次遍历 那么我们来看下代码实现
由于NPC怪物结构的每一个成员跟人物结构都是相同的 那么我们直接利用已经有的人物属性结构
这是我们之前找到的内存数据 //[[[8DAC28]+2142c]+n*4] 数组对象 //数组对象套 +8链表 新对象==0 停止遍历 //[对象+4]+0BF*4+550 血量
void TNpc怪物列表::c初始化() //获取怪物数据 {
__try { DWORD Base=Base_怪物; Base=*(DWORD*)Base; nd数量=*(DWORD*)(Base+0x2142C+0xC); DWORD 开始指针=*(DWORD*)(Base+0x2142C); DWORD 结束指针=*(DWORD*)(Base+0x21430);
DWORD nd数组成员数=(结束指针-开始指针)/4; DWORD Obj=0; DWORD j=0; for (int i=0;i<(int)nd数组成员数;i++) { Obj=*(DWORD*)(开始指针+i*4);
while (Obj!=0) {
列表[j].szpName=""; DWORD Nameaddr=Call_取对象名称(*(DWORD*)(Obj+4)); Nameaddr=*(DWORD*)Nameaddr; 列表[j].szpName=(char*)Nameaddr; 列表[j].fHp=*(FLOAT*)(*(DWORD*)(Obj+4)+0x0BF*4+0x550); 列表[j].fMaxHp=*(FLOAT*)(*(DWORD*)(Obj+4)+0x0C0*4+0x550); 列表[j].fMp=*(FLOAT*)(*(DWORD*)(Obj+4)+0x0C8*4+0x550); 列表[j].fMaxMp=*(FLOAT*)(*(DWORD*)(Obj+4)+0x0C9*4+0x550); Obj=*(DWORD*)(Obj+0x8); j=j+1; } }
} __except (1) { Call_输出调试信息("QQ西游 读取NPC怪物信息异常\r\n"); }
}
然后我们在DLL dialog中创建一个按钮来调用我们的遍历代码
这样就可以实现对周围NPC怪物结构的遍历了 我们来看一下调试输出的效果
来源:通化程序员-公众号投稿 GSLAB网站投稿文章仅代表作者本人的观点,与本网站立场无关。 *转载请注明来自游戏安全实验室(GSLAB.QQ.COM) |
最新评论
发表评论