下面是上一帖子的坐标内存读取的按键代码:
- Dim fx, fy, fz
- fx = lw.ReadUniversalEx("[[[[[[<elementclient.exe>+9CCCB8]+34]+24]+8]+bc]+4]+27c", 4)
- fy = lw.ReadUniversalEx("[[[[[[<elementclient.exe>+9CCCB8]+34]+24]+8]+bc]+4]+280", 4)
- fz = lw.ReadUniversalEx("[[[[[[<elementclient.exe>+9CCCB8]+34]+24]+8]+bc]+4]+284", 4)
复制代码我们可以观察到他们的X,Y,Z的地址偏移对应是: +27c ,+ 280 , +284。 也就是说我们找到一个地址可能就可以得到其他 数据了。
一般来说,无论是2D还是3D游戏,坐标之间都是相差4字节或者8字节。这是因为很多时候是程序员开发的时候都用结构体或者类。
下面是程序员那些的人物结构体,里面包含人物所有成员。- struct 人物
- {
- int 职业;
- float X坐标;
- float X坐标;
- int 攻击力;
复制代码大概意思就是:
职业 整数 4字节 0x80000X坐标 单浮点数 4字节 0x80004Y坐标 单浮点数 4字节 0x80008 攻击力 整数 4字节 0x8000c防御力 整数 4字节 0x80010装备 结构体指针 4字节 0x80014名字 文本型 256字节 0x80018魔法值 整数 4字节 0x80118生命值 整数 4字节 0x8011c假如: 0x80000是结构体第一个成员的内存地址,往下增加就是其他成员的地址,他们在内存里面相邻的。下面实战某游戏人物属性数据如下:然后我们选择ce的查看内存区域:
在这里我们可以观察到相关的数据。下面是按键的源码:
[hide]
- Import "D:\软件\乐玩插件8.02\lw.dll"
- Dim ret
- TracePrint (lw.ver())
- If ret="8.02" then
- TracePrint "注册成功,版本没问题"
- End If
- // 这是最简单的方法,当然你也可以用lwEX.dll用com注册
- // 记得选择新版本的乐玩插件,老版本可能存在wk程序的哦。
- Dim hwnd, intX,intY
- hwnd = lw.FindWindow("【魔域】",0)
- TracePrint (hwnd)
- //pid=lw.GetWindowProcessName(hwnd)
- lw.SetMemoryProcess hwnd, 1
- Dim 血值, 战斗力, 体力值,魔法值,X坐标,Y坐标
- 血值 = lw.ReadUniversalEx("[[01ABB5D8]+0]+1FD8", 0)
- 战斗力 = lw.ReadUniversalEx("[[01ABB5D8]+0]+2B64", 0)
- 体力值 = lw.ReadUniversalEx("[[01ABB5D8]+0]+1460", 0)
- 魔法值 = lw.ReadUniversalEx("[[01ABB5D8]+0]+2bb8", 0)
- X坐标 = lw.ReadUniversalEx("[[01ABB5D8]+0]+A4", 0)
- Y坐标 = lw.ReadUniversalEx("[[01ABB5D8]+0]+A8", 0)
- TracePrint "人物血值是:" & 血值 &" 战斗力"& 战斗力 & " ,"& 魔法值
- Function 十六到十(十六进制字符串)
- //例子:Msgbox lib.算法.十六进制转十进制("FFFFFF")
- Dim D,H,i,Ia
- D = 0
- H = UCase(十六进制字符串)
- For i = 1 To Len(H)
- Ia = Asc(Mid(H, i, 1)) - 48
- If Ia > 9 Then Ia = Ia - 7
- D = D * 16 + Ia
- Next
- 十六到十 = D
- End Function
复制代码[hide]
可能有朋友会有疑问了,为什么了解这个呢?我觉得可以通过ce或者od内存地址窗口,快速找到数据,也可以 通过找到人物对象:[01ABB5D8]+0]+0 从第一个成员开始,我们用ce或者遍历器搜索的时候,缩小范围,快速得到相关的数据。