最近在逛 PCSX2 博客的时候,注意到这么一段话:
PINE Isn’t a Tree, It’s a Protocol!
Introduced by GovanifY, PINE is a protocol we adopted for networked software to access PCSX2. If you’ve ever wanted to have external software be able to probe PS2 memory, write into it, or even command savestate loads or saves, it’s your lucky day. PINE opens the door to automation like never before and gives developers the opportunity to make companion apps for PCSX2. Apps like KAMI have already been made to add native mouse support to games, and we can’t wait to see what else people come up with!
大致意思是:开放允许网络化软件 (networked software) 能够访问和控制 PCSX2 模拟器。最重要的是,可以读写 PS2 内存了。
原理应该是 PCSX2 作为服务端,开放了一个端口,而网络化软件作为客户端与之连接。它们之间的通信协议被称之为 PINE。
之前我开发了一个「球会04存档修改器」,借助这个机制,是不是可以开发一个即时游戏修改器了?说干就干,我们来做下测试。
启用 PCSX2 的 PINE 服务端
PINE 服务已经内置在新版本的 PCSX2 软件中,只是默认未开启。如下图所示,把PINE 设置
的启用
选项打勾,注意不要修改默认的28011
端口。

编译 PINE 客户端库
根据指引,来到 GovanifY 老哥的PINE仓库。找了半天,老哥没有提供编译好的 release 文件。看来只能自己动手编译了,好在并不复杂,只要初始化一个 python 环境,然后按照下面的步骤来:
|
|
此时在bindings/c/build
目录下会生成libpine_c.dylib
文件。(这个文件在 windows 和 linux 下分别是libpine_c.dll
和libpine_c.so
)
客户端测试
在bindings
目录下作者提供了几个语言的调用代码示例。我们用 Python 测试一下。
先将libpine_c.dylib
复制到bindings/python
目录下,然后运行example.py
。
不出意外的话,会报错:segmentation fault
。
难道是编译的库有问题?我使用相同的库,用bindings/rust
下的代码跑了一遍,没问题。这就证明我们编译出来的库是对的。
把 python 代码和 rust 代码扔给 AI 做比较,很快给出了答案:
Python 崩溃原因:参数类型不匹配
在 ctypes 中,如果你不显式指定函数的参数和返回值类型,默认按 int 处理
把example.py
稍作修改:
|
|
再次运行就没问题了。
实操测试
- 模拟器:PCSX2 v2.2.0
- 游戏:J.League Pro Soccer Club o Tsukurou! 04
- PINE:开启
进入游戏:

我们知道金钱的地址:0x703D58,位数为 32 bit ,编写代码:
|
|
得到结果:
|
|
再次编写代码尝试修改金钱:
|
|
结果:

在 PCSX2 的日志中可以看到 PINE 客户端已连接。

结语
长期以来我一直在寻找一种可以修改 PCSX2 内存的方法,来开发一个游戏修改器。然而,面对现代操作系统(如 macOS 的 SIP 和 Windows 的 UAC)日益增强的安全防护机制,在不关闭这些安全功能的前提下直接操作另一应用的内存几乎是不可能的。让普通用户为了使用修改器而关闭 SIP,或频繁接受 UAC 弹窗,用户体验的代价未免过高。
PINE 协议的出现,为控制 PCSX2 内存提供了一种优雅且用户接受度更高的解决方案。它规避了直接内存操作的安全和权限障碍,为开发者打开了新的大门。无论如何,这对于开发者是个好的开始,我们期待着基于 PINE 开发出的软件能带来怎样的实际效果。