HexyBuddy

源码

https://github.com/FutaAlice/HexyBuddy

简介

HexyBuddy 是一个通过读取内存和模拟点击等方式控制后台运行的 Hexy 的程序。

HexyBuddy 可以完成如下功能:

  1. 寻找后台运行中的 Hexy 程序
  2. 读取 Hexy 程序的棋盘状态(落子数、落子记录、棋盘尺寸和是否分出胜负 等信息)
  3. 通过模拟点击事件在 Hexy 棋盘指定位置上落子
  4. 模拟 Hexy 菜单消息事件(重新开始、设置 AI 难度、改变棋盘尺寸和要求 Hexy 落子 等控制命令)
  5. 显示 Hexy 对当前局面的估值

具体功能参考后文的演示动图。

  • 备注:
    Hexy 是一个闭源的海克斯棋程序,AI 棋力强而且落子很快。程序可执行体在其官网发布:vanshel.com/Hexy/ 。 HexyBuddy 工程的 bin 目录下也有备份。

Warning

本程序设计初衷是为 Hexy 提供一个与其他程序自动博弈的接口。请勿用 watchcat 等工具隐藏 Hexy 用于其他非正当用途。

演示

工程结构

目录结构

  • HexyBuddy/

    • cpp-httplib/
    • json11/
    • hexybuddy/
    • httpsrv/
    • HexyBuddy.sln/

各模块功能简介

  • hexybuddy

静态库,核心功能模块,可供外部调用。
提供棋盘内存信息读取,模拟点击,控制消息传递等功能。
错误多以异常的形式抛出,直接调用注意捕获异常
使用需包含头文件 <hexybuddy.h>

  • httpsrv

可执行程序,HTTP 服务。
调用 hexybuddy 的接口并进行了异常处理,可以安全的控制 Hexy 程序
请求支持 GET/POST 两种方法。
推荐使用此程序作为控制 Hexy 的接口,而不是直接调用 hexybuddy。

  • cpp-httplib

HTTP 库,header-only,供 httpsrv 调用。

  • json11

静态库,为 httpsrv 提供 JSON 序列化/反序列化支持。

编译运行

  1. 使用 Visual Studio 2015 或以上版本打开 “HexyBuddy.sln”
  2. 设置 httpsrv 为启动项
  3. 点击工具栏那个绿色的小三角编译运行程序
  4. 运行一个 Hexy
  5. 打开 Chrome 访问 http://localhost:8080/init,以关联 HexyHexyBuddy
  6. 如果页面显示:{“errCode”: 200, “errString”: “OK”},说明运行成功。
  7. 参考协议文档通过浏览器提交请求控制 Hexy。Have fun :)

协议及调用规范

总体介绍

httpsrv 默认监听本机的 8080 端口的 HTTP 请求,运行前需确保端口未被占用(也可自行修改 /HexyBuddy/httpsrv/main.cpp 修改监听端口)。

为方便浏览器访问,所有请求都提供 GET 方法的支持。
需要参数的接口也支持 POST 方法,参数以 JSON 格式传入。

服务器阻塞处理后以 JSON 格式返回处理结果。
如:访问 http://localhost:8080/init 初始化 HexyBuddy 并寻找正在运行的 Hexy 程序。
若成功则返回:

{"errCode": 200,"errString": "OK"
}

或失败返回:

{"errCode": 400,"errString": "Fail, Hexy process not found."
}

支持请求列表

方法 URL 描述
GET /init 初始化并寻找正在运行的 Hexy 实例
GET/POST /set/piece 在 Hexy 当前棋盘上落子
GET /get/rec 获取 Hexy 当前棋盘上的所有落子记录
GET /get/pawnnum 读取棋盘上现有棋子数
GET /get/boardsize 读取棋盘尺寸
GET /get/gameoverflag 读取棋局是否结束
GET /msg/newgame 清理棋盘并重新开始
GET /msg/exit 退出 Hexy
GET /msg/hexy/on Hexy AI 自动落子开关打开
GET /msg/hexy/off Hexy AI 自动落子开关关闭
GET /msg/swap/on 启用 swap 规则
GET /msg/swap/off 停用 swap 规则
GET /msg/level/beginner 弱智的 AI
GET /msg/level/intermediate 普通的 AI
GET /msg/level/advanced 很强的 AI
GET /msg/level/expert 牛逼的 AI
GET/POST /msg/size 设置棋盘尺寸
GET /msg/shape/default 重置棋盘形状(FLAT I)
GET /msg/toggle/coord 切换坐标显示开关
GET /msg/toggle/numbering 切换棋子编号显示开关
GET /msg/toggle/guess 切换猜测显示开关
GET /msg/toggle/sound 切换落子音效播放开关
GET /msg/toggle/random 切换随机搜索开关
GET /msg/toggle/clock 切换计时开关
GET /msg/move 由 Hexy 进行下一步落子
GET /msg/hint 由 Hexy 搜索下一步落子并提示
GET /msg/demo Hexy 自博弈
GET/POST /msg/origin 向 Hexy 发送自定义控制命令(参照 msgdef.h 文件)

一些重协议的讲解

0. 初始化 Hexy

初始化 HexyBuddy,寻找后台运行的 Hexy,并自动与之关联(有多个 Hexy 实例存在则关联进程快照中靠前的实例)。

启动程序 或 更换 Hexy 实例后都需要手动请求。

1)请求(GET 方法):http://localhost:8080/init
2)响应:
{"errCode": 200,"errString": "OK"
}

1. 落子

控制 Hexy 在指定坐标落子。

1)请求(GET 方法):http://localhost:8080/set/piece?col=0&row=5
  • 参数说明:

    • col:落子位置列坐标(0 <= col < boardsize)
    • row:落子位置行坐标(0 <= row < boardsize)
2)请求(POST 方法):http://localhost:8080/set/piece
  • 请求体:
{"col": 0,"row": 5
}
  • 参数说明:

    • col:落子位置列坐标(0 <= col < boardsize)
    • row:落子位置行坐标(0 <= row < boardsize)
2)响应:
{"errCode": 200,"errString": "OK"
}
  • 返回值说明:

    • errCode:200 表示成功,否则为失败(坐标越界、已存在棋子、已分出胜负和 HexyBuddy 未初始化都可能导致失败)
    • errString:具体错误原因

2. 读取落子记录

读取 Hexy 棋盘上的棋盘状态。

1)请求(GET 方法):http://localhost:8080/get/rec
2)响应:
{"errCode": 200,"errString": "OK","records": [{"col": 6, "row": 3},{"col": 4, "row": 4},{"col": 2, "row": 7},{"col": 4, "row": 8},{"col": 5, "row": 8},{"col": 8, "row": 4},{"col": 6, "row": 6},{"col": 4, "row": 6}]
}
  • 返回值说明:

    • records:按照落子顺序列出的落子记录数组

3. 读取棋盘尺寸

读取 Hexy 棋盘尺寸。

1)请求(GET 方法):http://localhost:8080/get/boardsize
2)响应:
{"errCode": 200,"errString": "OK","boardsize": 11
}
  • 返回值说明:

    • boardsize:棋盘尺寸

4. 读取棋局是否结束

读取判断 Hexy 棋局是否分出胜负

1)请求(GET 方法):http://localhost:8080/get/gameoverflag
2)响应:
{"errCode": 200,"errString": "OK","gameover": false
}
  • 返回值说明:

    • gameover:是否分出胜负

5. 读取棋盘上现有棋子数

读取棋盘上现有棋子数。

1)请求(GET 方法):http://localhost:8080/get/pawnnum
2)响应:
{"errCode": 200,"errString": "OK","num": 8
}
  • 返回值说明:

    • num:Hexy 棋盘上现有棋子数

6. 重新开始

清理棋局并重新开始。

1)请求(GET 方法):http://localhost:8080/msg/newgame
2)响应:
{"errCode": 200,"errString": "OK"
}

7. 设置棋盘尺寸

设置棋盘尺寸,如果与之前设定不同,则重新开始。

1)请求(GET 方法):http://localhost:8080/msg/size?size=11
  • 参数说明:

    • size:棋盘尺寸
2)请求(POST 方法):http://localhost:8080/msg/size
  • 请求体:
{"size": 11
}
  • 参数说明:

    • size:棋盘尺寸
3)响应:
{"errCode": 200,"errString": "OK"
}

8. 打开或关闭 Hexy AI 自动落子

打开或关闭 Hexy AI 自动落子功能。

1)请求(GET 方法):http://localhost:8080/msg/hexy/on 或http://localhost:8080/msg/hexy/off
2)响应:
{"errCode": 200,"errString": "OK"
}

9. 由 Hexy 进行下一步落子

由 Hexy 的 AI 进行下一步落子。不阻塞,可以通过请求 http://localhost:8080/get/pawnnum 监视落子数,来判断 Hexy 是否已完成落子。

1)请求(GET 方法):http://localhost:8080/msg/move
2)响应:
{"errCode": 200,"errString": "OK"
}

HexyBuddy:海克斯棋程序 Hexy 的逆向工具相关推荐

  1. 【Android 逆向】Android 逆向通用工具开发 ( Windows 平台静态库程序类型 | 编译逆向工具依赖的 Windows 平台静态库程序 )

    文章目录 一.Windows 平台静态库程序类型 二.编译逆向工具依赖的 Windows 平台静态库程序 一.Windows 平台静态库程序类型 在 Android 逆向通用工具 MobileGame ...

  2. 最新抓取微信小程序源码教程+附逆向工具WxappUnpacker

    正文: 文章目录 前言 一.工具准备(免费) 1 解密工具 2 逆向工具 二.解密小程序 1.确认小程序包位置 2.打开一个小程序 3.解密小程序包 三.逆向小程序 1.检查nodejs 2.安装依赖 ...

  3. 最快69秒逆向DRAM地址映射,百度设计的这款逆向工具如何做到快速可靠?

    来源 | 百度安全实验室 出品 | AI科技大本营(ID:rgznai100) 导读:近日,国际顶级设计自动化大会DAC大会公布DAC 2020会议议程和论文名单,由百度安全发表的<DRAMDi ...

  4. java反编译工具_Android APP 取证之逆向工具篇

    一.前言 此系列文章将针对 Android APP 取证领域展开讨论.在国内,由于最近几年国产手机厂商之间的竞争和努力,如今 Android 平台的使用数量和广度,已经远超苹果的 iOS 了.如今 A ...

  5. java反编译工具_ReverseTool逆向工具集合

    反向工具 逆向工具集合 真棒骇客 Java和Jar(Android) jd-gui jar包浏览工具,对应的IDE插件,JD-Eclipse / JD-IntelliJ Luyten一个用于Procy ...

  6. Black Hat | PE Tree:BlackBerry 发布PE文件开源逆向工具

     聚焦源代码安全,网罗国内外最新资讯! 编译:奇安信代码卫士团队 BlackBerry 在今年举办的美国黑帽大会上为网络安全社区发布了一款新工具:PE Tree. PE Tree 是一款适用于 Lin ...

  7. 反编译 逆向工具集合

    Java & Jar (Android) jd-gui jar包浏览工具,对应的IDE插件,JD-Eclipse/JD-IntelliJ Luyten An Open Source Java ...

  8. 逆向经验 + 逆向工具

    目标:某桔充电 Day1 1.请求抓包,锁定路径为station-api/station/search的请求,对比多个请求的参数,确定要逆向的参数为:url的wsgsig(dd03).headers中 ...

  9. Anroid 逆向工具

    Anroid 逆向工具 静态分析 JEB - The Interactive Android Decompiler. GDA - GGJoy Dex Analysizer(GDA),国内第一款也是唯一 ...

最新文章

  1. OpenStack云计算口袋书-第一章-开始OpenStack之旅(一)
  2. 微软发布新Azure 媒体服务 API(V3),现已全面可用
  3. pyrealsense2 sensor.get_supported_options()(获取当前sensor支持的参数)
  4. linux 系统lv扩展_Linux增加LV(逻辑卷)容量
  5. 一款好用的轮播插件swiper,适用于移动端和web
  6. 一个感染型木马病毒分析(二)
  7. 去掉超链接或图片热点链接虚线框
  8. UIImagePickerController 获取相片视频
  9. 标准工时分析怎么做?精益生产下的VIOOVI 标准工时分析软件
  10. 如何找到局域网内所有主机ip
  11. 最新系统分析师考试大纲
  12. PyCharm - Compare With... (文件比较)
  13. 最新鲸发卡企业发卡网系统源码+免授权
  14. springboot项目版本升级
  15. 使用Elasticsearch聚合搜索进行数据的分类统计
  16. NumberRunningTextView改良版
  17. js垃圾回收机制,内存泄露和内存溢出,解决闭包产生的内存泄露详解
  18. 实现气泡效果的聊天框
  19. html定义var,html的var标签是什么?关于var标签的定义和用法详解
  20. 朴素Bayes组合-集成分类器

热门文章

  1. 微信获取手机号提示该appid没有权限
  2. 责任链模式(职责链模式)
  3. 老活新整——矩阵转置(C语言版矩阵转置)
  4. 【ROBOGUIDE仿真】:带传送链和行走轴的双机器人多工作台工作站
  5. 11服务方式:gRPC的四种服务方式
  6. idea 项目名 后面中括号问题
  7. 测试开发是什么,为什么现在这么吃香?
  8. Unity工业数字孪生、汽车数字孪生、手术虚拟培训,数字孪生应用场景有哪些?
  9. 标题系统架构师和程序员到底差别在哪里
  10. 案例篇10—css3实现卡通小鸟效果(附源码)