Runescape(和类似游戏)的机器人如何工作?它们如何附加到JVM,查找对Applet的引用以及伪造AWT事件?

zxw*_*xwv 15 java reflection applet swing awt

Runescape是一款大型在线游戏,带有纯Java客户端,可在浏览器中作为签名小程序运行.在这方面它是非常独特的,我知道的另一个主要例子是Yohoho Puzzle Pirates.部分由于游戏经济中的力量,存在大量自动化玩家运行各种僵尸软件来研磨游戏内资源.

这些机器人是我见过的最复杂的Java应用程序,特别是在运行时修改JVM状态.我很好奇这些是如何工作的,不一定特定于特定的游戏,但更一般.(谷歌可以很容易地举例说明.我不打算直接链接,因为其中一些据称与恶意软件有关.)

根据我的判断,这是机器人的大致流程:

  1. 启动并附加到游戏小程序.我不确定这是否是在bot的当前JVM中启动applet的结果,或者是在启动后附加到游戏的JVM的结果.
  2. 读取游戏状态.这至少意味着获取对当前Applet的引用并读取其Graphics.我不确定这里还涉及到什么.我知道有些机器人会引用一些游戏自己的对象并调用它们的getter以编程方式读取内部状态.
  3. 假装输入.就游戏而言,它正在接收常规的鼠标和键盘事件.但是,这些都是在AWT级别伪造的,因为这些机器人在不在前台时可以正常运行,并且它们不使用系统光标.

如何执行这些步骤?如果我想为类似的游戏编写类似的机器人,我该怎么办?特别:

  1. 机器人应该启动游戏,还是在游戏启动后附加到游戏中?哪种方法可行/合理?他们是怎么做的?在每种情况下,获得对游戏Applet的引用是否可行/合理?它包含的JFrames或其他AWT/Swing组件怎么样?
  2. 鉴于对游戏的各种AWT/Swing组件的引用,机器人如何阅读它们?这样做/何时安全?
  3. 机器人如何调用游戏代码来调用客户端状态的getter?请注意,游戏代码是混淆的,即使代码的整体拓扑几乎相同,名称也可能随每个构建而变化.作者如何从一开始就找到这些感兴趣的方法?
  4. 机器人如何发送虚假的AWT输入事件?它是如何以合理和一致的方式做到的?

我不一定要写这样的机器人,虽然这是我最近看到的更有趣的软件之一,所以我肯定希望了解更多.有趣的是,我认为这里的很多东西都可以应用于非对抗情况,例如自动UI测试.