• 按键公众号 :
按键精灵电脑版
立即下载

软件版本:2014.06
软件大小:22.9M
更新时间:2021-12-03

按键精灵安卓版
立即下载

软件版本:3.7.2
软件大小:46.2M
更新时间:2023-05-10

按键精灵iOS版
立即下载

软件版本:1.8.0
软件大小:29.2M
更新时间:2023-03-21

按键手机助手
立即下载

软件版本:3.8.0
软件大小:262M
更新时间:2023-05-30

快捷导航

登录 后使用快捷导航
没有帐号? 注册

发新话题 回复该主题

[类人猿] [类人猿]pc按键汇编逆向思维7 ----为什么部分数据内存地址相邻的... [复制链接]

1#
下面是上一帖子的坐标内存读取的按键代码:
  1. Dim fx, fy, fz
  2. fx = lw.ReadUniversalEx("[[[[[[<elementclient.exe>+9CCCB8]+34]+24]+8]+bc]+4]+27c", 4)
  3. fy = lw.ReadUniversalEx("[[[[[[<elementclient.exe>+9CCCB8]+34]+24]+8]+bc]+4]+280", 4)
  4. fz = lw.ReadUniversalEx("[[[[[[<elementclient.exe>+9CCCB8]+34]+24]+8]+bc]+4]+284", 4)
复制代码
我们可以观察到他们的X,Y,Z的地址偏移对应是: +27c ,+ 280 , +284。 也就是说我们找到一个地址可能就可以得到其他 数据了。



一般来说,无论是2D还是3D游戏,坐标之间都是相差4字节或者8字节。这是因为很多时候是程序员开发的时候都用结构体或者类。
下面是程序员那些的人物结构体,里面包含人物所有成员。
  1. struct 人物
  2. {
  3. int 职业;
  4. float X坐标;
  5. float X坐标;
  6. int 攻击力;
复制代码
大概意思就是:

职业 整数 4字节 0x80000
X坐标 单浮点数 4字节 0x80004
Y坐标 单浮点数 4字节 0x80008
攻击力 整数 4字节 0x8000c
防御力 整数 4字节 0x80010
装备 结构体指针 4字节 0x80014
名字 文本型 256字节 0x80018
魔法值 整数 4字节 0x80118
生命值 整数 4字节 0x8011c

假如: 0x80000是结构体第一个成员的内存地址,往下增加就是其他成员的地址,他们在内存里面相邻的。
下面实战某游戏人物属性数据如下:



然后我们选择ce的查看内存区域:



在这里我们可以观察到相关的数据。下面是按键的源码:
[hide]
  1. Import "D:\软件\乐玩插件8.02\lw.dll"

  2. Dim ret

  3. TracePrint (lw.ver())

  4. If ret="8.02" then
  5. TracePrint "注册成功,版本没问题"
  6. End If

  7. // 这是最简单的方法,当然你也可以用lwEX.dll用com注册
  8. // 记得选择新版本的乐玩插件,老版本可能存在wk程序的哦。

  9. Dim hwnd, intX,intY

  10. hwnd = lw.FindWindow("【魔域】",0)

  11. TracePrint (hwnd)

  12. //pid=lw.GetWindowProcessName(hwnd)

  13. lw.SetMemoryProcess hwnd, 1


  14. Dim 血值, 战斗力, 体力值,魔法值,X坐标,Y坐标

  15. 血值 = lw.ReadUniversalEx("[[01ABB5D8]+0]+1FD8", 0)
  16. 战斗力 = lw.ReadUniversalEx("[[01ABB5D8]+0]+2B64", 0)
  17. 体力值 = lw.ReadUniversalEx("[[01ABB5D8]+0]+1460", 0)
  18. 魔法值 = lw.ReadUniversalEx("[[01ABB5D8]+0]+2bb8", 0)
  19. X坐标 = lw.ReadUniversalEx("[[01ABB5D8]+0]+A4", 0)
  20. Y坐标 = lw.ReadUniversalEx("[[01ABB5D8]+0]+A8", 0)

  21. TracePrint "人物血值是:" & 血值 &" 战斗力"& 战斗力 & " ,"& 魔法值

  22. Function 十六到十(十六进制字符串)
  23. //例子:Msgbox lib.算法.十六进制转十进制("FFFFFF")
  24. Dim D,H,i,Ia
  25. D = 0
  26. H = UCase(十六进制字符串)
  27. For i = 1 To Len(H)
  28. Ia = Asc(Mid(H, i, 1)) - 48
  29. If Ia > 9 Then Ia = Ia - 7
  30. D = D * 16 + Ia
  31. Next
  32. 十六到十 = D
  33. End Function
复制代码
[hide]




可能有朋友会有疑问了,为什么了解这个呢?我觉得可以通过ce或者od内存地址窗口,快速找到数据,也可以 通过找到人物对象:[01ABB5D8]+0]+0 从第一个成员开始,我们用ce或者遍历器搜索的时候,缩小范围,快速得到相关的数据。

最后编辑类人猿 最后编辑于 2022-03-06 09:48:51
类人猿逆向学院 QQ:578052137 技术Q群583990978
2#

感谢分享

发新话题 回复该主题