GNU/Linux系统中如何在Proton(Wine)兼容层下进行dll注入

0. 写在前面

之前在博客建立之初时,提过要多发一点关于steam deck的内容,可惜的是“买前打游戏,买后生产力”,结果只是享受到了折腾的过程,对steam库里的游戏却没啥感觉。这次写下一篇折腾的教程作为记录,是因为无论是百度或者谷歌都没找到可以在wine兼容层下正常注入的dll注入软件,比如比较有名的Xenos,只能显示窗口,却无法注入成功。

dll注入在windows下应用得十分广泛,在linux中确实没有比较大的应用范围。在Steam deck这个游戏机中应该也就只能当作某些游戏补丁来用了。

几个问题

由于steam deck(或者说是steam os)的特殊性,在steam库中的每一个游戏都有单独的proton容器,容器之间互相隔离,因此你不能直接将dll注入程序添加进steam库中,然后分别启动目标软件以及dll注入程序来尝试注入,因为这属于两个不同的proton容器。

在wine兼容层中可以直接启动桌面,或者说任务管理器。因此在一个容器中同时启动注入程序以及目标软件较为容易。所以本片文章主要针对于将steam作为软件启动器的那些人。

而使用wine的小伙伴们只需要启动任务管理器,在任务管理器中启动dll注入程序以及目标软件进行注入即可。

环境配置

系统:Steam OS 3 (基于Arch linux)

桌面:Kde Plasma;Wayland (游戏模式下);X11 (桌面模式下)

Proton版本:Proton 8 (包括GE-Proton或者Proton Experimental均可)

1. 事前准备

说明:本文使用的dll注入工具来自于[email protected],其中源代码来自于原作者的csdn博客,本人将其下载并托管在了github之中,若有侵权请告知。

我将源码以及注入程序放在了文末,有需要自取。

我将以Demo.exe作为目标程序,dll.dll作为待注入dll作为演示。如下图

1.1 注入程序(左) 目标程序(中) 待注入dll(右)

此dll注入程序使用了NtCreateThreadEx + LdrLoadDlll方式实现,不但能成功注入,而且也较为稳定。

2. Steam相关设置

将目标程序加入Steam库之后,我们需要在启动程序的时候同时启动任务管理器,便于一同启动dll注入程序以及查看pid。

在目标程序的属性一栏中,将以下调试信息加入到启动选项中

LANG=zh_CN.utf8 PROTON_REMOTE_DEBUG_CMD="$STEAM_COMPAT_DATA_PATH/pfx/drive_c/windows/system32/taskmgr.exe" PRESSURE_VESSEL_FILESYSTEMS_RW="$STEAM_COMPAT_DATA_PATH/pfx/drive_c" %command%
  1. LANG=zh_CN.utf8代表强制中文utf8编码,其实加不加没太大区别
  2. PROTON_REMOTE_DEBUG_CMD代表在目标程序通过proton启动时一同启动某个程序
  3. PRESSURE_VESSEL_FILESYSTEMS_RW代表允许proton容器允许读写某个目录
  4. %command%最后加上这个steam才会运行在这之前的命令

如下图

2.1 将命令填入启动选项中

最后别忘记在兼容性一栏中,强制使用proton。

3. 目标程序,启动

  1. 启动目标程序,通过任务管理器将dll注入程序启动

3.1 启动dll注入程序

  1. 再将dll注入

3.2 将dll注入

  1. 出现以下提示即代表注入成功

3.3 demo.exe提示注入成功

3.4 dll注入程序提示注入成功


游戏模式中注入的过程也一样,在此不再赘述。而且我感觉游戏模式用的就更少了,毕竟dll注入这种东西感觉在桌面模式中调试用得多。

4. 额外资料

位于github,包含注入程序以及demo

DLLInject_x64(x64版,本文使用了这个)
DLLInject_x86(x86版)

咕咕咕~