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作为演示。如下图

此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%
LANG=zh_CN.utf8代表强制中文utf8编码,其实加不加没太大区别PROTON_REMOTE_DEBUG_CMD代表在目标程序通过proton启动时一同启动某个程序PRESSURE_VESSEL_FILESYSTEMS_RW代表允许proton容器允许读写某个目录%command%最后加上这个steam才会运行在这之前的命令
如下图

最后别忘记在兼容性一栏中,强制使用proton。
3. 目标程序,启动
- 启动目标程序,通过任务管理器将dll注入程序启动

- 再将dll注入

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


游戏模式中注入的过程也一样,在此不再赘述。而且我感觉游戏模式用的就更少了,毕竟dll注入这种东西感觉在桌面模式中调试用得多。
4. 额外资料
位于github,包含注入程序以及demo
DLLInject_x64(x64版,本文使用了这个)
DLLInject_x86(x86版)
咕咕咕~